ChatGLM-6B+LangChain实战

目标:原始使用ChatGLM-6B可接受的文字长度有限,打算结合LangChain实现长文本生成摘要.
方法:
step1:自定义一个GLM继承LangChain中的langchain.llms.base.LLM,load自己的模型.
step2:使用LangChain的mapreduce的方法,对文本分块,做摘要,输出结果.
使用的机器资源:T4显卡(16G显存)
附参考资料:
ChatGLM-6B:
ModelScope: ChatGLM-6B
LangChain:
LangChain: summarization
LangChain: summarize notebook

  1. glm环境准备
    在指定的python环境下确定安装好以下依赖:
# 安装pytorch
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia# 安装modelscope
pip install modelscope==1.4.3 -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
# 安装transformers
pip install protobuf==3.20.0 transformers==4.26.1 icetk cpm_kernels
# 安装charset-normalizer
python -m pip install charset-normalizer==2.1.0
# 安装langchain
pip install langchain
模型文件下载到/data/THUDM/chatglm-6b/下
可以使用以下代码先下载到临时目录,然后mv到自定义目录下:
from modelscope.utils.constant import Tasks
from modelscope.pipelines import pipeline
pipe = pipeline(task=Tasks.chat, model='ZhipuAI/ChatGLM-6B', model_revision='v1.0.7')
  1. ChatGLM-6B + LangChain

2.1 继承langchain.llms.base.LLM新建GLM类
重写_call方法:加载自己的模型,并限制只输出结果(chatglm原输出不是直接str,langchain中要求模型返回必须是str的结果:“”“LLM wrapper should take in a prompt and return a string.”“”)
具体代码:

from langchain import LLMChain
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.mapreduce import MapReduceChain
from langchain.prompts import PromptTemplate
from langchain.llms.base import LLM
from transformers import AutoTokenizer, AutoModel, AutoConfig
from typing import Any, Dict, List, Mapping, Optional, Tuple, Union
from torch.mps import empty_cache
import torchclass GLM(LLM):max_token: int = 2048temperature: float = 0.8top_p = 0.9tokenizer: object = Nonemodel: object = Nonehistory_len: int = 1024def __init__(self):super().__init__()@propertydef _llm_type(self) -> str:return "GLM"def load_model(self, llm_device="gpu",model_name_or_path=None):model_config = AutoConfig.from_pretrained(model_name_or_path, trust_remote_code=True)self.tokenizer = AutoTokenizer.from_pretrained(model_name_or_path,trust_remote_code=True)self.model = AutoModel.from_pretrained(model_name_or_path, config=model_config, trust_remote_code=True).half().cuda()def _call(self,prompt:str,history:List[str] = [],stop: Optional[List[str]] = None):response, _ = self.model.chat(self.tokenizer,prompt,history=history[-self.history_len:] if self.history_len > 0 else [],max_length=self.max_token,temperature=self.temperature,top_p=self.top_p)return response

2.2 实例化llm对象&加载模型

import sysmodelpath = "/data/THUDM/chatglm-6b/"
sys.path.append(modelpath)
llm = GLM()
llm.load_model(model_name_or_path = modelpath)

2.3 配合langchain输出

from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.docstore.document import Document
from langchain.chains.summarize import load_summarize_chainwith open("政府工作报告.txt") as f:report_2023 = f.read()text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_text(report_2023)
docs = [Document(page_content=t) for t in texts]
prompt_template = """对下面的文字做精简的摘要:{text}"""PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(llm, chain_type="map_reduce", return_intermediate_steps=True, map_prompt=PROMPT, combine_prompt=PROMPT)
summ = chain({"input_documents": docs}, return_only_outputs=True)
print(summ['output_text'])

其中政府工作报告.txt来自于2023年政府工作报告_中国政府网:https://www.gov.cn/zhuanti/2023lhzfgzbg/index.htm

2.4 输出
这篇文章介绍了中国在过去五年中的经济发展成就,政府采取多项措施应对有效需求不足的问题、支持汽车消费、推进保交楼稳民生工作、加强环境保护和生态修复工作等。政府还出台了增值税留抵退税额度、降低贷款利息等减轻企业负担的措施。文章介绍了中国政府的宏观经济政策目标,包括推进中国式现代化、实现经济发展质量和数量的提升、改善民生、稳定社会大局等。新冠疫情防控政策包括疫苗迭代升级和新药研制、保障群众就医用药需求、重点做好老年人、儿童、患基础性疾病群体的疫情防控和医疗救治等。政府将着力扩大国内需求、加快建设现代化产业体系、深化国资国企改革、保护民营企业产权和企业家权益,鼓励支持民营经济和民营企业发展壮大,稳定市场预期和提振市场信心。

实战2
框架地址:https://github.com/noobdawn/langchain_ChatGPT

langchain+ChatGLM-6B试用
什么是langchain

ChatGLM-6B大家都知道了,是清华大学推出的有62亿参数的开源大语言模型。那么langchain是什么?langchain是一个基于语言模型的应用程序开发框架,它具有以下特点

数据感知:将语言模型与其他数据源连接在一起
自主性:允许语言模型与其环境进行交互
langchain框架是基于以上原则设计的。

因为这些特点,langchain可以实现针对特定文件的问答、聊天机器人、评估、数据增强生成等工作。

如何部署
github地址为:基于本地知识的 ChatGLM 应用实现

部署指南为:安装

因为我换了新机器,我个人遇到了【build wheel for xxx时提示找不到cl.exe】的问题,解决方法是:

装个Visual Studio,然后在Visual Studio Installer里安装组件【MSVC v142 - VS 2019 C++ x64/x86生成工具】。
注意要选择这个版本,像我之前就装了MSVC v143结果build报错了。
安装完成重启之后如果还报这个错,就找到cl.exe所在的目录,把它添加到环境变量Path里,这个目录大致是这样的:D:\VS\2019\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64
如何使用
安装完成后,执行python webui.py即可开始使用,访问本地的127.0.0.1:7860即可使用web版的界面。

  1. 首先,进入模型配置,选一个LLM模型和Embedding模型。配置好的可以用chatglm-6b,差点的就要砍精度了。Embedding模型主要是文本转向量的模型,这个我研究不多。

  2. 然后来到知识库测试界面,先新建知识库,并为其上传文档或者文档所在文件夹,等待程序将文本上下文分割并解析为向量之后进行保存好后,测试问题。这一步主要是调整知识相关度阈值,默认Score=0会回复所有检索到的知识出处,这显然是不精准的。

  3. 确定好阈值后,在model_config里进行修改,这里还可以顺便修改一下prompt模板,重启程序以令其生效;

  4. L 在对话中,配置好数据库之后提问即可。

缺陷
举例而言,我写了这样一个Q&A:

如何进行性能优化?
使用Unity的FrameDebugger查看每帧的DrawCall和使用到的模型。

但是喂给ChatGLM-6B后提供的回答会类似于:

如何进行性能优化?
1. 了解业务需求:明确优化的目标和范围
2. 设计测试用例:针对目标场景进行性能模拟,以确定系统的性能表现

云云。
在这里插入图片描述

通过这张图可以看到,这个框架的主体其实是跟LLM无关的,它只是比对和匹配文本向量的相似性,检出最相似的问句的上下文打包发给LLM进行润色。

在我的理解里,这个玩意儿不会真的把本地的数据更新进自己的模型内部,只是每次提问的时候,预先把可能存在答案的上下文作为prompt一起提交了而已,这里在model_config.py的PROMPT_TEMPLATE里也能看到。

所以它会触发以下问题:

1 当这个问题并不“独特”的时候,就会出现例子中所示的答案的杂糅。因为是打包上下文之后发给LLM润色,显然LLM理解的“性能优化”指的是一种普适性的答案,它自发的把自身语料训练出来的结果与本地知识库中项目所独有的结果进行混合,得到了似是而非的东西。
2 当知识库中的问题重复度很高的时候,或者问题过于宽泛导致命中过多,也会出现本地知识库答案的杂糅。此时问题和各个文本向量的相似性很高,回答会串味,例如,询问“如何进行性能优化”之后,就会连同“性能优化怎么查看”、“性能优化的指标是多少”等等一块返回进行回答。
3 因为是打包上下文发给LLM润色,所以这个“打包”可能会把答案截断,或者囊括了并非本问题的答案的上下文,会造成回答串味或不全。

简单的说,对于我来说我并不需要什么语料的润色、帮助我提取有用信息,因为我给的文档本身就是最好的答案,所以我需要的是精确的检索。这种截断上下文发给LLM的架构的三个缺陷是我无法忍受的:

  1. 本地知识库干预力度不够,由于真正需要的知识在上下文中,而上下文是以Prompt的形式嵌入其中的,导致独特性不够的问题,大模型给出的答案会非常偏向语料训练结果。
  2. ChatGLM-6B的中文能力过于羸弱,逻辑能力过于差劲,有时候无法判别出两个相似问题的区别。
  3. 上下文截断过于粗暴,对于长答案支持不佳。
    langchain+ChatGPT
    其他尝试
    之后我转变思维,不再尝试让LLM模型去即时回答问题,而是让LLM即时判定问句是否一致,再针对同义问句匹配相同的回答。因此我个人在家又搭建了一个langchain+ChatGLM-6B的本地知识对话模型,但这个模型跟前一个模型的区别在于,我会写好一个问题答案对:
Q:你是谁?
A:我是弱智小助理。

当我提问“你是什么人”的时候,内部会使用LLM模型去一个个比对这句话和各个问题答案对中的问题部分是否属于同一个意思,此处它就会比对“你是谁”和“你是什么人”是不是同一个意思。Prompt会写成这个样子:

f"{original_question}\n{input_question}\n判断上述两句话是不是一个意思,如果是,则回答1;反之回答0。"
这里再次暴露了ChatGLM-6B的羸弱,明明要求回答0或者1即可,往往会画蛇添足地说“是的,这两句是一个意思”,此外它对同义句的判定也有极大的问题,这里我们后面说。

然后我又换了个方式,好吧,不要求你按格式回答了,你直接生成多几个同义句,我用文本向量按最近距离匹配好了。
在这里插入图片描述

我寻思Judge可能确实有点难为它了,那么generate应该没问题吧,结果还是让我大跌眼镜,对于“如何进行性能优化的流程”的问题,ChatGLM-6B给出的回复是:
在这里插入图片描述

事实上,我想看到的是这样的句子:

  1. 怎么发起性能优化流程?
  2. 性能优化的流程是怎么样的?
  3. 我该如何启动性能优化流程?
  4. 性能优化流程是如何发起的?

在这里插入图片描述

(你要不看看你在说什么?.jpg

因为我一直在用ChatGPT帮助生成代码,所以我测试了一下ChatGPT,发现ChatGPT生成的同义句居然还不错,虽然有时候会带上人称,比如”你如何才能启动性能优化“。

事实证明,尽管ChatGPT之后,LLM人人均有不下ChatGPT-3之勇,但真用起来,那还是ChatGPT好使。

如何使用OpenAI API
入口:Introduction - OpenAI API

每个ChatGPT Plus用户每月有5刀的免费使用额度,而根据使用的GPT模型不同,收费也不同:

模型 迅速版(每千token) 完整版(每千token)
GPT-4 8K Context 0.03$ 0.06$
GPT-4 32K Context 0.06$ 0.12$
GPT-3.5-Turbo 0.002$ -
选择使用GPT-3.5的原因绝对不是便宜(迫真),而是因为它速度快,且为对话专门优化过。而同义句的生成就也不涉及大量的知识和专业性内容,所以直接用它。

使用的方法就很简单:

p

rompt_base_templet = """请为下面这段文字生成至少5个的意思完全相同的中文问句,句子之间用回车分隔开:{question}"""
gpt_engine = "text-davinci-003"
max_tokens = 300
temperature = 0# 获取同义问句
def get_synonymous_question(question : str) -> list:openai.api_key = api_keyprompt = prompt_base_templet + questionresponse = openai.Completion.create(engine=gpt_engine,prompt=prompt,max_tokens=max_tokens,temperature=temperature,n = output_num)generate_text = response.choices[0].text.strip()return generate_text.split('\n')

感觉一句话基本大约不会超过60token,所以5个中文问句大致就是300个token。temperature设为0是为了防止回答过于发散。

框架
框架整体参考了imClumsyPanda/langchain-ChatGLM 的实现,包括怎么用gradio创建webui之类的,但轻量化了很多,因为我并不需要内嵌LLM,也不需要对问句进行分词(都整句话直接转换成向量了)。

这个框架的运行结果是:

  1. 读取问题答案对
  2. 把问题整理出来发给OpenAI API生成同义句
  3. 把同义句转换为Document,把答案和原问句编制到metadata里
  4. 用embedding model将同义句转化为向量
  5. 用FAISS匹配最符合输入的问句
  6. 把结果中的metadata筛一次,合并同义句产生的答案
  7. 返回合并筛选之后的答案
    在这里插入图片描述

值得注意的是,该方法只实现了一半的数据安全,其问题还是要提交到服务器上的。所以如果有涉密需求,还是得手动编写同义句字典进行搭建数据库。

改进

允许上传图片和链接
允许使用不经过OpenAI的同义句字典
允许下载本地知识和字典

一些个人的想法
故,本质上而言,该方案并不能算“对话”系统,因为LLM并没有在即时输入端参与,而是在本地知识上传后离线参与。

写完之后我在思索,这玩意儿和Ctrl-F有什么区别,有没有一种可能,我直接Ctrl+F搜索“性能优化”也能找到我要的内容呢?所以这是个伪命题?

后面想了想,如果知识库很少,问题单一的情况下确实是这样的没错。但随着知识库的增大,问题的keyword也在增多,单个keyword对应的答案内容开始急剧上升,假如后面有这些问题:

使用RenderDoc怎么指导性能优化?
怎么用Unity Frame Debugger优化性能?
如何优化冗余的资源实现性能提升?
……

这样的话,Ctrl+F的实用性就大打折扣了。此外,keyword也可能会改头换面,例如“性能优化”实际上可以这样问“优化XX的性能表现”,因此我认为这个方案仍有有较大的用武之地。
基于本地知识的问答机器人langchain-ChatGLM
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18215.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

资深程序员深度体验ChatGPT一周发现竟然....

周一打卡上班,老板凑到我跟前:“小李啊,这周有个新需求交给你做一下,给我们的API管理平台新增一个智能Mock的功能...”。我条件反射般的差点脱口而出:“这个需求做不了..”。不过在千钧一发之间,我想起了最…

程序员深度体验一周ChatGPT发现竟然....

程序员深度体验一周ChatGPT发现竟然… 周一打卡上班,老板凑到我跟前:“小李啊,这周有个新需求交给你做一下,给我们的API管理平台新增一个智能Mock的功能…”。我条件反射般的差点脱口而出:“这个需求做不了…”。不过…

吴恩达新课又来了,手把手教你用ChatGPT API构建应用!

Datawhale干货 老师:吴恩达,来源:新智元 【导读】吴恩达新课上线,限时免费!LangChain、ChatGPT API、扩散模型全覆盖。 吴恩达又给AI社区送福音了。 今日,吴恩达在推特上宣布三门新的生成式AI课程上线。 这…

ChatDOC:基于 AI 与文档对话、重新定义阅读方式的文献阅读和文档处理神器

让 AI 真正成为你的生产力超级助手 AI 时代降临,我们需要积极拥抱 AI 工具 在过去的 2 个多月里,以 ChatGPT 为代表的 AI 风靡全球。随着 GPT 模型的不断优化,ChatGPT 在多个领域表现出了堪比专家的水平。目前,已有不少专家将 C…

Nature一周连发两文探讨ChatGPT:学术圈使用已不可避免,是时候明确使用规范了

在科技巨头为了ChatGPT大打出手的另一边,学术圈对于ChatGPT的关注也在升高。 一周时间内,Nature连发两篇文章探讨ChatGPT及生成式AI。 毕竟ChatGPT最早还是在学术圈内掀起风浪,先后有学者拿它写论文摘要、改论文。 Nature为此专门颁布禁令&am…

数说故事“AI虚拟偶像研究室”第二期虚拟偶像数据分析研究报告

真人偶像塌房越多,虚拟偶像崛起越快。的确,不易塌房的虚拟偶像正在把小而美的路线走成康庄大道,许多虚拟外表下被赋予了有趣的内核,如切入“国风”领域的柳夜熙、翎LING、天妤等虚拟偶像,让传统文化找到了更贴近当代潮…

突破100万用户!华人本科生最强AI检测器GPTZero:美国宪法是AI写的

视学算法报道 编辑:编辑部 【导读】现在,AI作弊检测器层出不穷。然而万万没想到,学生自己写的论文,竟然也会被判是AI生成的。 ChatGPT的爆火,不仅让众多学生有了作弊利器,也让一众自己写论文的清白好学生…

意外!明星公司 Jasper 裁员;SD进阶教程之混合语法;2份LLM进展必读报告;谷歌Bard支持中文且免费 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 AIGC 领域的当红炸子鸡 Jasper 裁员,转头聚焦AI营销 Jasper是一家美国人工智能公司,乘着 AIGC 的东风迅速崛起…

基于百度UNIT的微信智能问答聊天机器人小程序

微信聊天机器人小程序 方法 人人都能拥有的聊天小程序登录百度ai开放平台,申请百度unit智能聊天机器人,获取ak和sk密钥。将密钥复制到chat.js对应处即可。 功能 可以进行闲聊,天气查询,智能问答等基础功能 代码 https://github.com/1Ja…

微信小程序语音聊天智能对话(核心源码)

“智能聊”:微信小程序详解 这次是1.0版本的更新,整体设计请参考上一篇文章: 手把手教你做自然语言理解智能对话的微信小程序【核心源码】 本次更新内容: 1.键盘输入框和语音输入的切换 2.语音输入图标 扫码体验(小…

Mixly用点灯科技控制小爱同学小度小度天猫精灵Siri控制应用

Mixly用点灯科技控制小爱同学小度小度天猫精灵Siri控制应用 Mixly用点灯科技Arduino编程控制小爱同学小度小度天猫精灵Siri控制应用 在Mixly中我们可以用图形化来给各种智能音箱编程,不用再看复杂的代码,哪怕是小朋友也可以上手自己的智能产品。只要导…

【DuerOS开发日记】2.打造属于自己的小度(1):使用PythonSDK

目录 【Minecode|开发日记】1.据说小度在等待帅的人把它唤醒 【Minecode|开发日记】2.打造属于自己的小度(1):使用PythonSDK 【Minecode|开发日记】3.打造属于自己的小度(2):小白小白!——唤醒词替换 (未完持更) 写在前…

【百度智能云】教程:连接百度ai开放平台api接口并完成语音识别的任务

前言与介绍 本文章介绍了如何在Pycharm上用python语言简单的对连接百度ai开放平台的语音识别功能api端口的调用,并在代码里实现了现录音识别内容。 平台与相关工具 windows10、Pycharm、Python3.9 百度智能云官网为:百度ai开放平台官网 操作流程 注册…

小度音箱对接之DuerOS开放平台智能家居技能Java对接Demo实现

近期调研中,编写了个简单的Demo,对接DuerOS的智能家居技能。 Demo源码地址:https://gitee.com/mylitboy/link-smart-speaker-demo 介绍 小度音箱DuerOS对接demo,模拟OAuth2、设备云功能。 注意: 该项目,只…

百度小程序调研微信转百度

1、微信与百度小程序的区别 整体框架和微信小程序一致,遵循新建路由页面需要利用创建page模块,不能手动创建,分别有swan(相当于html文件)、js、json(页面配置文件)、css。 html中主要需要更改的…

百度人工智能API的调用_微信小程序。

微信小程序–智能接口 通过微信小程序开发调用百度人工智能接口,从而实现很多有趣的功能。 文章目录 微信小程序--智能接口前言一、百度智能云的认识1-1 注册1-2 页面说明1-3 功能初识1-4 api 接口 二、百度智能接口的创建2-1 创建接口2-1-1 点击创建新应用2-1-2 应…

百度飞桨paddlespeech实现小程序实时语音流识别

前言: 哈哈,这是我2023年4月份的公司作业。如果仅仅是简单的语音识别倒也没什么难度,wav文件直接走模型输出结果的事。可是注意标题,流式识别、实时! 那么不得不说一下流式的优点了。 1、解决内存溢出的烦恼。 2、…

QT聊天机器人(百度语音+青云客API)

文章目录 效果前期准备设计功能?代码文字聊天代码语音聊天代码 一些细节可以改进的地方 代码已上传到github: https://github.com/HMY777/RobotChat 效果 运行界面: 请无视这个简陋的布局 文字聊天: 语音聊天: 为了压缩GIF大小已经裁剪…

微信小程序和百度的语音识别接口

介绍 因为项目需要,使用到了微信小程序和百度的语音接口 现在将项目中的一个小模块拿出来单独分享. 技术关键字 微信小程序百度语音接口nodejs,expressfluent-ffmegp 环境 windows 10vs code 1.20.1微信小程序开发工具 1.02.1802270花生壳-提供域名和内容穿透-用于方便本地…

你想不到,韩国女团最喜欢的英文单词是这些

如果你也想赚钱,实现财务自由,但接触不到优质的人脉和资源,可以到公June浩:成长home,发"资源" ,就会看到我吐血整理的168条保姆级零基础吸金秘籍,跟着我一起亲历毕业5年、创业3年、从…