langchain是一个基于大语言模型应用开发的库。它通过提供一套工具、组件和接口提高开发效率。具体而言langchain主要包括代理,模型I/O,检索,存储,链和回调六大模块。
代理基于 MRKL 和 ReAct 的原理用于接收用户的输入后使用语言模型来选择要采取的一系列操作并最终传递给链。具体而言,AgentExecutor通过迭代的方式将问题拆分为多个子问题,每一个新问题的内容是由上一个问题的结果与观察得出直到代理得出问题已经被处理完毕。为了使大语言模型可以更准确的解决子问题,代理可以提示模型可以使用什么样的工具组。例如,在计算数学问题时,代理可以提示使用PAL-MATH工具从而提升模型回答数学问题时的准确率。
链通过链接不同组件并按照预定义的逻辑执行从而实现某种特定任务。以提示词组件、存储组件、模型组件为例,我们可以组合这三个组件,创建一个链,该链能接收用户输入,通过调用call方法来顺序执行大模型获取反馈,并将反馈记录在存储组件中,作为下一次输入的参数。简单的链可以通过组合形成更复杂的链,例如StuffDocument链首先利用文档提示词和分割器接收文档列表作为输入并将每个文档都格式化成字符串后拼接作为输入,llm_chain进行进一步处理后输出结果。
模型I/O包括提示词模块,语言模型和输出解析器。提示词模块通过提示词模版将用户输入构建为一组指令或文本输入,为了防止输入过大,样本选择器通过执行select_examples方法选择最适合的样本输入。语言模型得到输入后执行预测并输出非结构化结果。为了得到结构化的数据,输出解析器通过格式化指令告知语言模型应该输出的格式后调用解析方法接收来自语言模型返回的结果,最终返回一个结构化的数据。 将提示词输入给大模型,大模型通过调用模型的不同接口完成任务并最终由输出解析器解析后输出。
检索模块旨在为模型提供更多相关数据从而提升模型预测准确率。首先,文档加载器用于加载包括CSV,json等多种数据源的文档。之后文档转换器对加载好的文档进行拆分、合并、过滤等操纵来使文档适应LLM应用。转换之后的文档被文本嵌入模型转换为向量后被存储在向量数据库中从而便于程序在向量空间对文本内容进行存储与检索。需要时向量只需通过检索器的非结构化检索就可以得到。