目录
背景介绍:
2023年年底,公司想要做一款地理教学产品,为中小学生提供生动有趣的地理教学体验。领导希望能将地理知识问答功能纳入其中,学生可以与ChatBot对话,请教地理相关的问题。
于是我们做了相关技术的调研,找到了一款RAG开源库LangChain-Chatchat,并做了相关的实验。2024年1月3日,我将调研情况进行了简单整理,记录于此,以备后续查阅。若有相关需求或经验同学,欢迎交流!
原作者源码地址如下:
https://github.com/chatchat-space/Langchain-Chatchat
Demo界面:
Demo能力:
使用开源的检索增强生成(RAG)大模型知识库LangChain-Chatchat v0.2.8版本(2023年12月1日发布)。与本产品智能问答模块相关的能力如下:
1)知识库管理:可上传、删除知识库,上传的知识会转成向量入到向量库中,删除知识则会从向量库里移除相关知识的向量。
2)知识库问答:结合Embedding模型和LLM的能力,实现知识库问答功能。用户输入问题,系统在知识库中查找与用户问题匹配的知识,经过LLM整理后,返回给用户。
技术原理:
测试情况:
测试方法:
输入与已入库知识库知识相关的问题,期望系统从知识库中检索到相应的答案,并以简洁、严谨的形式返回。
主要配置参数说明:
配置项 | 参数值 |
LLM | 当前:Qwen-1_8B-Chat 离线:ChatGLM(1|2|3-6b)、Qwen(1.8|7|14|72b)、Baichuan(1|2-7|13b)、Llama-2-7b-chat-hf…… 联网:ChatGPT、智谱AI、讯飞星火、百度千帆、阿里通义千问、字节火山方舟、百川…… |
Embedding模型 | 当前:bge-large-zh 可选:m3e、bge、text2vec、ERNIE等 |
向量库 | Faiss、Milvus、PGVector |
数据库 | sqlite、mysql |
已入库的知识 | 目前已上传: 1)自行整理的高考知识点,包含了自然地理、人文地理、世界地理共148KB的文本内容: 2)高中地理课本,包含如下4本教材的文本内容,pdf扫描件转word,转文字精度较高: |
Prompt配置 | |
其它入库/问答参数 | Temperature:0.1 TopK:3 知识匹配分数阈值:0.5,取值范围在0-1之间,SCORE越小,相关度越高,取到1相当于不筛选,建议设置在0.5左右。 分词器:ChineseRecursiveTextSplitter。知识入库时,利用标点符号对文档进行分割,超过给定长度(250字符)则递归分割。 |
测试总结:
- 知识库中存在的知识,系统基本可从知识库中查询到,但存在较多结果不准确的情况。
- 知识库中不存在的知识,系统会利用LLM自身能力解答,结果准确性视LLM模型本身而定。
- 在目前LLM参数量较小(1.8B)及知识库体量不大的情况下,秒级返回检索结果。
测试案例展示:
结果分析与后续计划:
1)LLM:
本测试使用Qwen-1_8B-Chat模型,参数量1.8B较小,显存占用4G左右,模型对自然语言的理解和整理能力较弱,或为导致已有知识库检索结果不准确的主要原因,需要尝试参数量更大的模型。大领导建议尝试在线API,看看其检索效果,我们是线上产品,可以接入别的LLM的API。
2)Embedding模型和向量库相似度检索:
- Embedding模型选用bge-large-zh,其作用是将用户输入query转成向量,对整个链路精度的影响或许不大,但仍需要进一步验证。
- 向量库选用FAISS,在检索时其会返回与用户输入query向量相似度最高的TopK个docs向量,这TopK个向量与用户输入query相关度有多高,待进一步验证。
3)分词算法:
目前采用默认的ChineseRecursiveTextSplitter。知识入库时,利用标点符号对文档进行分割,超过给定长度(250字符)则递归分割。暂未验证向量库中存储向量的合理性,对整个链路精度的影响或许不大,但仍需要进一步验证。
4)知识本身质量:
word文档排版较为复杂,文字内容分散、图片较多。暂不清楚分词算法对其分词的逻辑,可能会出现意想不到的情况。需要进一步验证知识入库前的数据质量,必要时进行数据清洗,或寻找其它格式更好的来源。