赞
踩
特点:
依托于chatGLM等开源模型实现,可离线部署
基于langchain实现,可快速实现接入多种数据源(不同类型的Documentloader来处理不同类型文件数据·)
在分句、文档读取方面,针对中文使用场景进行了优化
支持pdf, txt, md, docx,有文本的jpg, png等文件类型接入,具备命令行demo、webui和vue前端
项目结构:
models: llm开源模型的接口类与实现类,针对开源模型提高流式输出支持(二次开发者对接口进行了重新定义,因为原本langchain对开源模型不支持流式输出)
loader: 文档加载器的实现类(对pdf做了重新设计,扫描类的pdf需要进行ocr识别时,对中文的支持更好了一些)
textsplitter:文本切分的实现类
chains: 工作链路实现,如chains/local_doc_qa实现了基于本地文档的问答。目前作者也只实现了本地文档问答,后面作者还会实现基于库表、知识图谱等不同类型的chain, 放在该文件夹下
content:存储上传的原始文件
vector_store: 存储向量库文件,即本地知识库本体
使用FIASS存储方式(项目中默认的存储方式),会在本地路径下存储一个文件夹,包括.index在内有两个文件共同表示向量库具体存储信息
config: 项目中用到的各类配置项信息
涉及模型主要有 Embedding模型 和 自然语言模型LLM
注意:
在上述代码中,OpenAIEmbeddings可以处理500字的字段,但对其他一些开源的本地的模型来说一般一次处理100字的文本。所以在Langchain-ChatGLM项目中,将文本分的更细一些(是100字限制)
Langchain-ChatGLM的实现原理图及文本划分:
https://github.com/chatchat-space/Langchain-Chatchat/blob/master/img/langchain%2Bchatglm2.png
在图中可以发现,进行vector search时,找到对应的匹配文本后,并不是将该已知信息文本返回,还要将它的上一个和下一个分段也扩充一起返回(防止语义丢失,原本只有100字限制,经过上下文扩充后达到250字左右),并与query提问组成了prompt,交给LLM自然语言模型
注意:匹配的文本可能不是只取top1,而是top5取前五个。这时有多个上下文分段了,需要再处理,可能会有上下文分段扩充多遍的情况,此时会再进行 重新排序+去重 , 避免不同段扩充之后,扩充了相同内容,浪费了语言模型的字符总数
当以符号划分文本时,超过一百个词的话会有重复,防止语义丢失,或者以’。'划分文本时,当一句话超过100个字,他就会再根据逗号,分号等划分
web-ui界面:
LLM对话:直接和LLM语言模型进行对话
知识库问答: 基于本地知识库进行对话,LLM总结内容并结合自己的理解回答
bing搜索问答: 将问题交给bing搜索之后,将搜索内容提供给LLM,LLM再进行回答
未来二次开发者可以优化的方向:
模型微调:对llm和embedding基于专业领域数据进行微调
文档加工:再文本分段后,对每段分别进行总结,基于总结内容语义进行匹配
借助不同模型能力:在text2sql, text2cpyher场景下需要产生代码时,可以借助不同模型能力???
…
后续作者开发方向:
扩充数据源(知识图谱,网页,库表)
知识库管理(完善知识库中增删改查功能,并支持更多向量库类型)
扩充文本划分方式(针对中文场景,提高更多文本划分和上下文扩充方式)
探索Agent应用(利用开源模型LLM探索Agent的实现与应用)
该项目图片目前用的是paddleOCR的包 图片提取文字 -》 保存 txt-》 再加载
add_doucments() 本地知识库新增文本(知识库中已有文本)
from_documents() 本地知识库新增文本(知识库中无文本)
get_knowledge_based_conent_test函数,可传入一个score_threshold参数,值越高,相关度越低
0,不设置该值
500左右时,匹配结果更好,会舍去一些相关度低的文本,防止影响answer
理解:根据问题,从向量库中匹配出6句话,而score 高于 score_threshold的社区,只保留相关度高的文本段交给llm模型
https://www.bilibili.com/video/BV13M4y1e7cN/?share_source=copy_web&vd_source=e6c5aafe684f30fbe41925d61ca6d514
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。