langchain优化方案

Langchain框架

一般地,langchain的系统如图所示:

image.png

具体的如下:

  1. 本地知识库向量化

  2. 用户query向量检索,基于相似度作向量召回

  3. LLMs基于prompt模板输出结果

langchain效果优化

从langchain的框架中,可以确定优化方向,如下:

  • embedding模型

  • 不同格式(pdf、docx、md等)的文档转换成文本(恺逾)

  • text_split算法

  • LLMs优化

文档提取文本

参考恺瑜

text_splitter

langchain自带text_splitter

langchain加载的都是较长的文档,有必要将文本拆分成块。理想情况下,我们希望保持语义相关的文本片段在一起。而语义相关也可能取决于文本的类型,如代码片段。

langchain自带了文本拆分器text_splitter,其工作方式如下:

  1. 将文本拆分成小的、语义上有意义的块(通常使句子)。

  2. 将这些小块组合成一个较大的块,直到达到一定的大小(通过某个函数衡量)

  3. 在上一步的基础上,将该块作为独立的文本片段,然后开始创建一个具有一定重叠的新文本块(以保持块之间的上下文)

当前版本的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格式,然后使用上述文本切割的方法切分文本。缺点也很明显--需要人力成本或费用。

embedding优化

传统的召回使用sql、es检索,缺点是无法召回语义相似的文档,因此使用embedding做召回。

embedding优化目的是提升query和document的embedding表征能力,进而提升向量召回的准确率。

可参考北大chatlaw,在领域数据上训练自己的模型。

ChatLaw

image.png

  1. 基于bert,从优化了口语化的query,抽取(生成)关键词

  2. 基于bert(双塔结构),根据query和关键词召回法律条文。

基于模型抽取的关键词,可以在用户的query中,也可以是根据query生成一些关键词;根据关键词-切片后文档训练双塔模型,将这些关键词和文档分别映射成embedding,然后使用faiss作文档召回。

LLMs优化

参考chatlaw做法,使用领域知识对LLMs优化。

怎么判断query是否在知识库中?

如果query不在知识库中,那么问题答案就会不相关,当没有文档召回时,模型回答应该是拒绝回答,或者是模型自己的答案。判断方式如下参考:

  1. 可以在文档召回时作一些阈值类处理;

  2. 让模型自己判断是否需要加载本地知识库;

  3. 在已经召回上下文信息的情况下,让模型根据信息回答(self-suggestion),如果无法从中得到答案,那么让模型拒绝回答或模型自己的答案。

prompt模板优化

在上述步骤获取上下文后,构造prompt模板让模型回答问题。

模板的优化可参考prompt engineering相关工作。

prompt_template = """基于以下已知信息,简洁和专业的来回答用户的问题。不允许在答案中添加编造成分。

    已知内容:
    {context}

    问题:
    {query}"""

prompt_template = """已知信息:{context} 
根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题” 或 “没有提供足够的相关信息”,不允许在答案中添加编造成分,答案请使用中文。 问题是:{question}"""

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值