Langchain学习总结 | 豆包MarsCode AI刷题

20 阅读6分钟

在这次青训营当中,我选择的是AI方向,自然就需要学习Langchain相关的知识,在这里稍微总结一下Langchain的一些学习心得,因为是自己的理解,所以可能会有错误。

基本架构

根据Langchain自己的架构图可以分为六个层面:

  • Model:大语言模型,对接基础大语言模型服务
  • Prompt:提供模板工具,用来在每个链里构建prompt
  • Chain:链封装,用来包装模型、parser、prompt等为一体整体多功能使用,也有更高层的链封装多个基础链
  • Memory:记忆管理,即保存多轮对话记录,以供对话连续性
  • Agents:代理,不是Proxy,而是指Chain在运行过程,能够帮忙进行其他工作的工具,如解析文档、调用其他多模态工具、在线搜索、查数据库等
  • Indexes:索引index是一种高效地管理和定位文档信息的方法,确保每个文档具有唯一标识并便于检索。这适合在模型训练完成之后优化使用RAG为LLM持续提供外部知识输入与记忆暂存的流程

具体思路

大模型链使用思路:本质就是利用大语言模型的文本解读功能,设置合适的提示词让大模型能够生成合乎要求的输出,进而根据输出完成别的事情。如基于基础文本生成,微调与引入角色进而进行对话,并使用提示工程达到引导、路由、记忆、思维链、呼叫代理等功能,让大模型既当文本生产者,又基于文本提示当仲裁者管理者,其中最关键的就是准备好大量针对性好的模板,能够让大模型根据模板进行合乎情况的文本生成,并链式逻辑调用。

基础使用

  • 基础工作:大模型提供基础根据上文生成下文的工作,即文本生成,一般上文结尾都是明显断句等待模型补充

  • 对话:虽然基础模型也能用,但是一般建议用针对对话微调过的,允许对问句或完整的句子生成更好的结果。

  • 角色引导:通过在prompt里设置role角色与要求,可以更好地引导对话,即常见的用法中的messages列表里包括多个message,每个message里都有角色和描述,实际使用时会转换为文本拼在prompt前部进行引导。

输入输出trick

  • 提示工程引导:其实就是Zeroshot、Fewshot的应用,包括后续的思维链、路由、agent等都是这样引导的

  • 思维链CoT:即根据问题拆解解决问题的思路为多步,然后作为提示输入给模型。改进用法一是设置多条思维链进行步进生成,并可以评分打出各条思维链的生成效果,甚至直接采用思维树ToT。改进用法二是专门使用一个元模板引导的生成拆解思路的模型,或者更进一步训练一个生成思维链模板的模型,让它生成思维链模板,指导更通用的大语言模型根据思维链进行思考生成

  • 输出parse:即引导模型生成合乎规范的输出,然后基于其合乎规范的输出parse出需要的数据对象。如让模型在输出中包装成合适的json、yaml、markdown等格式。这种一般就是通过在输入中告知模型输出应该是怎样的(如json就直接告诉他输出格式有哪些键值对,一一写出来)。并且准备好生成失败的预案,如发现parse不了的报警、主动微调其中的部分错误(如部分关键字符错误)、把报错和提示重试的模板作为输入再让模型生成等

基于提示工程的进阶使用

  • 路由:即有多个负责不同任务的提示模板或者说装载了不同提示模板的目标Chain,然后有一个专门负责路由的Chain,其根据各个目标Chain的功能描述(注意是文本哦),然后基于指导路由的模板。可以通过合适的提示模板(如【请你根据《问题》xx分析思路,基于以下《描述》xx找到最适合的chain名字,并按照《格式》xx输出】)引导到最合适的目标,实在没有就也要允许路由至默认链

  • 记忆:本质是将原来的几段对话内容组织好(如【历史】:人说XXX;AI说YYY)作为prompt的一部分继续输入,因为大模型本质是没有跨输入的状态的,想要记住就得把之前的信息告诉他。具体还可以分为几种情况,即全部历史都贴回来(耗费token且可能超出上下文限制),最近多少字符的历史贴回来(健忘),基于对话让模型总结(需要另外耗费模型token,可能健忘),基于对话看哪一部分保留原样哪一部分由模型总结(最好但是复杂)

  • 代理工具:让模型学会调用外部工具。其实也是AgentExecutor这个链通过预先设定好的prompt模板,告知他现在有的工具、工具的名字和描述、工具的输入格式,然后就等待LLM给出一个利用工具的输出,最后代理里有个parser负责解析出输出里的工具调用并真的去调用别的工具,并返回结果,继续交由后续思考处理

注意事项

  • 上下文限制:一般的LLM都有最大支持的上下文限制(一般受存储、计算以及模型结构决定的最远注意距离等),注意由于自回归的性质,不仅仅是输入算入最大长度限制,输出也算(因为输出产生时都要把之前的输出也一起输入),故要求是prompt+后续输出应小于等于最大限制

  • 幻觉:这是大模型由于数据集、训练等可能产生的偏差现象,一般需要合理的提示词来减少这种情况发生,如让大模型不知道就是不知道,不要编造;让大模型能够调用其他工具,如在线搜索获取知识、查询知识库获取知识,外部工具计算识别等