背景:
随着ChatGPT模型的一炮而红,大语言模型已然风靡全球,成为了全世界闪烁的焦点。目前,越来越多的研发人员投入到大语言模型的扩展开发中,闻达(Wenda)便是其中一项重要成果。
闻达源于清华大学开源的ChatGLM6b项目,作为少有的在中文环境下效果卓越的大语言模型,ChatGLM6b能够根据截止到2021年的训练知识内容流畅的实现多种任务下的不同要求,因此,基于ChatGLM6b的闻达项目能够很好的实现对大量输入信息的整合。
wenda-LLM/wenda: 闻达:一个LLM调用平台。目标为针对特定环境的高效内容生成,同时考虑个人和中小企业的计算资源局限性,以及知识安全和私密性问题 (github.com)
目标领域
尽管目前大语言模型已经在多项任务上实现了不同要求的输出,但受训练数据时效性以及二次训练高昂成本的限制,大量大语言模型并不能及时更新所涵盖的知识。例如,我们知道2022英国首相出现两次轮换,在鲍里斯约翰逊、特斯拉接连辞职后,财政大臣苏纳克接受了英国政府称为英国的现任首相。然而,由于训练知识时效性的限制,我们在询问大量大语言模型后均得到的错误的答案。
ChatGPT
ChatGLM6b
为了使得模型所涵盖的信息更加具有时效性,主流的方法主要有两种:模型微调或者知识库融合。对于模型微调来说,由于模型本身参数数量庞大,微调将不可避免的带来数据收集的分担以及大量的额外算力消耗,更重要的是,随着时间的推演微调所得到的模型仍面临信息过时的问题,这使得模型微调并非一劳永逸,而是周期性、重复性的工作,这是我们所不希望的。考虑到模型微调的问题由模型内部所包含的知识库所引发,如果在询问LLM的时候,直接通过互联网加入大量的参考信息,使得LLM所完成的任务从根据涵盖知识回答问题演变为整合给定信息回答问题,模型的是否就可以摆脱内部知识时效性的问题呢?
答案是肯定的,知识库融合方法将给定问题在搜索引擎上进行搜索,综合比对最邻近以及最相关的信息作为参考一并输入给LLM,就能够使得LLM不必从内部训练信息中给出,只需要综合分析给定参考内容与问题的相关性即可。
question = “英国首相是谁”
reference = "
里希·苏纳克(Rishi Sunak),男,1980年出生于英国南安普顿市,祖籍印度旁遮普邦,印度裔英国政治家,现任英国保守党党首、第57任英国首相。 [1] [5] [14] [27] [31]
苏纳克2015年成为保守党议员,2019年7月24日至2020年2月13日担任财政部首席秘书,2020年2月13日至2022年7月5日任英国财政大臣。2022年10月起任英国保守党党首、英国首相。
"
real_input = "请根据给定问题以及参考信息进行准确回答:
问题:英国首相是谁
参考信息:
里希·苏纳克(Rishi Sunak),男,1980年出生于英国南安普顿市,祖籍印度旁遮普邦,印度裔英国政治家,现任英国保守党党首、第57任英国首相。 [1] [5] [14] [27] [31]
苏纳克2015年成为保守党议员,2019年7月24日至2020年2月13日担任财政部首席秘书,2020年2月13日至2022年7月5日任英国财政大臣。2022年10月起任英国保守党党首、英国首相。"
answer = "英国首相是里希·苏纳克(Rishi Sunak)"
除了及时融合互联网信息以外,知识库融合方法可以将本地知识信息与问题相挂钩,使得模型根据本地特定领域的知识内容相融合,变成特定领域的专家。从而在保证输出信息准确性的情况下更加适应日常口语化的各种问题。
实现方案
目前,主流的知识库融合方法分为网络信息融合与本地信息融合两种,下面将对这两种知识融合方法的实现过程进行简述。
首先,本地信息融合方法主要是将本地文档内容进行向量化,构造Vector Store,从而在输入问题时可以简单,直接的对问题进行比对、检索及输出。如图所示,对于给定的本地文档,首先进行文档内容读取,获取对应的字符串形式内容,随后采用分词程序将字符串内容进行拆分,通过Embedding编码方法构造Vector Store。当我们提出一个问题Query时,问题经过同样的分词与Embedding编码过程得到了Query Vector。此时,仅需要根据Query Vector对Vector Store中的向量进行比对检索,即可获取最相似的文档信息。将问题与相关文档知识进行整合,所获得的固定形式的Prompt输入信息便成为了融合最专业信息的input,LLM仅需要分析所给出的input中Query与Reference的关系即可给出相应的回答。
imClumsyPanda/langchain-ChatGLM: langchain-ChatGLM, local knowledge based ChatGLM with langchain | 基于本地知识库的 ChatGLM 问答 (github.com)
对应到Wenda中为rtst信息整合方法:
rtst模式
sentence_transformers+faiss进行索引、匹配,并连同上下文返回。目前支持txt和pdf格式。
支持预先构建索引和运行中构建,其中,预先构建索引强制使用,运行中构建根据(复制example.config.yml)中段的决定,对于显存小于12G的用户建议使用。
cuda
config.yml
rtst
device(embedding运行设备)
CPU
Windows预先构建索引运行:。
plugins/buils_rtst_default_index.bat
Linux直接使用wenda环境执行
python plugins/gen_data_st.py
需下载模型置于model文件夹,并将txt格式语料置于txt文件夹。
模型
- GanymedeNil/text2vec-large-Chinese 不再推荐,不支持英文且显存占用高
- Moka-ai/m3e-base 推荐
同理,当应用在线网络信息融合时,所提出的Query也编码成为Query Embedding对Vector Store进行比对检索。不过由于互联网信息过于庞大,需要借助现有的搜索引擎进行参考信息的整合。这一点在Wenda中以fess模块嵌入。或者采用duckduckgo等现有搜索引擎模块直接调用,无需再次编码,直接将搜索结果与Query相融合即可构造Prompt进行输入。
fess模式
在本机使用默认端口安装fess后可直接运行。否则需修改(复制example.config.yml)中的为相应值。FESS安装教程
config.yml
fess_host
127.0.0.1:8080
数据收集方法
由于在线搜索结果通常在专精领域的泛用性较差,面向此等领域需要构造特定知识库进行融合。专业数据的爬取可采用八爪鱼信息爬取软件,获取各种数据的整合文档。在获取信息整合文档后需进行文档清晰,消除不必要的信息与格式内容,保证知识库的可用性和正确性。
安装 utool 工具,uTools 是一个极简、插件化的桌面软件,可以安装各种使用 nodejs 开发的插件。您可以使用插件对闻达的知识库进行数据清洗。请自行安装以下推荐插件:
- 插件"解散文件夹",用于将子目录的文件移动到根目录,并删除所有子目录。
- 插件"重复文件查找",用于删除目录中的重复文件,原理是对比文件 md5。
- 插件"文件批量重命名",用于使用正则匹配和修改文件名,并将分类后的文件名进行知识库的分区操作。
知识库融合方法
具体到知识库的抽象过程需要采用sentence-transformer对给定信息进行整合,得到索引及原信息的样本对。然而,直接将整个给定知识作为文本编码并不一定有效,因为sentence-transformer所采用的索引方法是对整个文本进行切割后去平均值,因此需要我们在知识整合过程中确定每条知识的关键词,并针对关键词构建索引才能更好模拟问题与知识的对应关系。对于特定场景,甚至可以多次构造索引,使得一条知识对应多条索引向量。例如,当我们构造政治领域数据库时,Knowledge中的“ 1980年出生于英国南安普顿市,祖籍印度旁遮普邦”就并不重要,不需要融合到索引中。关于这一项,可在plugins/gen_data_st.py文件的68-70行进行修改。知识内容在索引后保存在memory/default路径下文件index.faiss和index.pkl中。如果想要抛弃对应的知识内容,可直接删除。
Query = 英国首相是谁
Knowledge = 里希·苏纳克(Rishi Sunak),男,1980年出生于英国南安普顿市,祖籍印度旁遮普邦,印度裔英国政治家,现任英国保守党党首、第57任英国首相。
下载
基于Chatglm-6b模型进行处理,首先在ChatGLM-6B官网下载对应的模型文件,随后在Wenda官网下载闻达相关资源库,并进行以下操作。(Wenda提供了自助懒人包,据说是封装好的,如有兴趣也可尝试)
1.安装库
通用依赖: 根据使用的 知识库进行相应配置pip install -r requirements.txt
2.下载模型
根据需要,下载对应模型。
建议使用chatRWKV的RWKV-4-Raven-7B-v11,或chatGLM-6B。
3.参数设置
把example.config.yml重命名为,根据里面的参数说明,填写你的模型下载位置等信息config.yml
ChatGLM-6B/ptuning/README.md at main · THUDM/ChatGLM-6B · GitHub
wenda-LLM/wenda: 闻达:一个LLM调用平台。目标为针对特定环境的高效内容生成,同时考虑个人和中小企业的计算资源局限性,以及知识安全和私密性问题 (github.com)
运行
运行时打开路径到wenda-main文件夹下,运行
python wenda.py -t glm6b
即可得到模型加载页面,打开端口即可跳转到Web页面