赞
踩
一般地,langchain的系统如图所示:
具体的如下:
本地知识库向量化
用户query向量检索,基于相似度作向量召回
LLMs基于prompt模板输出结果
从langchain的框架中,可以确定优化方向,如下:
embedding模型
不同格式(pdf、docx、md等)的文档转换成文本(恺逾)
text_split算法
LLMs优化
参考恺瑜
langchain加载的都是较长的文档,有必要将文本拆分成块。理想情况下,我们希望保持语义相关的文本片段在一起。而语义相关也可能取决于文本的类型,如代码片段。
langchain自带了文本拆分器text_splitter,其工作方式如下:
将文本拆分成小的、语义上有意义的块(通常使句子)。
将这些小块组合成一个较大的块,直到达到一定的大小(通过某个函数衡量)
在上一步的基础上,将该块作为独立的文本片段,然后开始创建一个具有一定重叠的新文本块(以保持块之间的上下文)
当前版本的langchain内置了如下文档切分器,如表所示:
文本切分器 | 说明 |
---|---|
CharacterTextSplitter | 按字符来分割文本。 |
RecursiveCharacterTextSplitter | 按字符串分割文本,递归地尝试按不同的分隔符进行分割文本。 |
MarkdownHeaderTextSplitter | 基于指定的标题来分割markdown 文件。 |
MarkdownTextSplitter | 沿着Markdown的标题、代码块或水平规则来分割文本 |
SentenceTransformersTokenTextSplitter | 按token来分割文本 |
NLTKTextSplitter | 使用 NLTK(自然语言工具包)按句子分割文本。 |
SpacyTextSplitter | 使用 Spacy按句子的切割文本 |
PythonCodeTextSplitter | 沿着python类和方法的定义分割文本 |
LatexTextSplitter | 沿着Latex标题、标题、枚举等分割文本,如下面的分割符涉及的多个符号,如chapter,section,subsection等。 |
TokenTextSplitter | 按token来分割文本 |
优点:
提供多种不同类型的文档切分方法
支持chunk_overlap--保留部分前文;length--限定每片文本的长度
缺点:虽然langchain提供了文本切分的方法,但不是智能的识别文本类型,做到智能的切分。
langchain可以根据文本的类型,如.py,.md格式去采用专用的文本切分方法,而对于文本中嵌入代码的无法直接去处理。
一种已验证使用的方案是使用claude2/chat-gpt,将其他格式的文本转换为md格式,然后使用上述文本切割的方法切分文本。缺点也很明显--需要人力成本或费用。
传统的召回使用sql、es检索,缺点是无法召回语义相似的文档,因此使用embedding做召回。
embedding优化目的是提升query和document的embedding表征能力,进而提升向量召回的准确率。
可参考北大chatlaw,在领域数据上训练自己的模型。
基于bert,从优化了口语化的query,抽取(生成)关键词
基于bert(双塔结构),根据query和关键词召回法律条文。
基于模型抽取的关键词,可以在用户的query中,也可以是根据query生成一些关键词;根据关键词-切片后文档训练双塔模型,将这些关键词和文档分别映射成embedding,然后使用faiss作文档召回。
参考chatlaw做法,使用领域知识对LLMs优化。
怎么判断query是否在知识库中?
如果query不在知识库中,那么问题答案就会不相关,当没有文档召回时,模型回答应该是拒绝回答,或者是模型自己的答案。判断方式如下参考:
可以在文档召回时作一些阈值类处理;
让模型自己判断是否需要加载本地知识库;
在已经召回上下文信息的情况下,让模型根据信息回答(self-suggestion),如果无法从中得到答案,那么让模型拒绝回答或模型自己的答案。
在上述步骤获取上下文后,构造prompt模板让模型回答问题。
模板的优化可参考prompt engineering相关工作。
- prompt_template = """基于以下已知信息,简洁和专业的来回答用户的问题。不允许在答案中添加编造成分。
- 已知内容:
- {context}
- 问题:
- {query}"""
-
- prompt_template = """已知信息:{context}
- 根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题” 或 “没有提供足够的相关信息”,不允许在答案中添加编造成分,答案请使用中文。 问题是:{question}"""
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。