尽管直接与大型语言模型(LLM)API交互能提供精确控制,但你会很快发现,构建涉及多步骤或管理对话的应用需要更具结构化的方式。手动将一个API调用的输出作为下一个调用的输入,处理格式,并记录历史,可能导致代码复杂且难以维护。这就是LangChain等LLM框架中“链”这种机制变得非常重要的地方。把链想象成一系列操作,旨在完成特定任务,通常涉及一次或多次LLM调用。与其编写单独的代码来格式化提示、调用LLM API,然后解析输出,不如说链将整个工作流程封装成一个单一的、可复用的组件。它以确定的顺序将应用程序的不同构成部分连接起来。核心思想是连接组件。最简单地说,一个链可能连接:一个提示模板:格式化输入数据和指令。一个模型(LLM):接收格式化的提示并生成响应。一个输出解析器:将原始LLM响应处理成更易用的格式(如JSON或特定对象类型)。考虑一个基本任务:总结一段文本。一个简单的链可以自动化此过程:digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial", fontsize=10, margin=0.2]; edge [fontname="Arial", fontsize=9]; Input [label="输入文本", shape=ellipse, style=filled, fillcolor="#e9ecef"]; Prompt [label="提示模板\n(例如, '总结这段文本:\n{text}')", fillcolor="#a5d8ff"]; LLM [label="LLM调用", fillcolor="#bac8ff"]; Parser [label="输出解析器\n(可选, 提取摘要)", fillcolor="#d0bfff"]; Output [label="最终摘要", shape=ellipse, style=filled, fillcolor="#e9ecef"]; Input -> Prompt [label="用户数据"]; Prompt -> LLM [label="格式化提示"]; LLM -> Parser [label="原始LLM响应"]; Parser -> Output [label="解析后输出"]; }一个简单链的可视化,它连接了输入、提示模板、LLM调用和一个可选的输出解析器,以产生最终结果。使用链提供了多种优势:模块化:链中的每个步骤(提示生成、模型调用、解析)都可以被视为一个独立的组件,使整体逻辑更易于理解和管理。可组合性:简单的链可以组合起来创建更复杂的工作流。一个链的输出可以作为另一个链的输入,从而使你能够构建复杂的操作序列。可复用性:一旦定义,一个链就可以在应用程序的不同部分甚至不同项目中复用。抽象性:链隐藏了与API交互、参数处理和响应处理相关的许多样板代码,让你能够专注于应用程序的逻辑。框架通常提供几种类型的链。最常见的是顺序链,其中组件以线性方式依次执行。例如,你可能有一个链,首先使用LLM从文档中提取关键词,然后使用第二次LLM调用(可能在同一链中或后续链中)根据这些关键词生成博客文章大纲。这是一个Python代码片段,说明了组件如何在框架中连接(语法仅供说明):# 假设已导入PromptTemplate、LLM、OutputParser所需模块并完成设置 # 1. 定义组件 prompt = PromptTemplate( input_variables=["product_description"], template="Generate three potential marketing taglines for a product with this description: {product_description}" ) llm = LanguageModel(model_name="text-davinci-003", temperature=0.7) # 示例模型 # 可选:一个解析器,确保输出是字符串列表 # parser = ListOutputParser() # 2. 创建链(连接组件) # 简单情况,链定义中没有显式解析器 # 解析可能隐式发生或在chain.run之后发生 tagline_chain = LLMChain(llm=llm, prompt=prompt) # 3. 运行链并提供输入 description = "A durable, eco-friendly water bottle made from recycled materials." result = tagline_chain.run(description) # 'result' 将包含LLM生成的标语 print(result) # 示例输出(会有所不同): # 1. Stay Hydrated, Sustainably. # 2. The Last Bottle You'll Need. Made Right. # 3. Drink Clean, Live Green. 在这个例子中,LLMChain连接了prompt和llm。当调用tagline_chain.run()时,它首先使用prompt格式化输入description,然后将格式化的提示发送给llm,最后返回LLM的原始文本输出。更高级的链可能显式包含解析器或将多个LLM调用连接在一起。了解链非常重要,因为它们是许多LLM框架中构建工作流的主要方式。它们让你能够超越简单的单次API调用,开始构建具有更复杂推理、数据处理和交互模式的应用程序。随着学习的推进,你将看到链如何作为Agents等更高级结构的基本构成,Agents动态地使用链来决定下一步采取哪些行动。