讲的是LangChain这个最火的LLM应用开发框架。你会学到它的核心概念Chain、Tool、Memory、Agent怎么组织、怎么快速搭一个有工具调用和记忆的智能应用、LCEL表达式怎么用、生态组件有哪些、怎么对接各种模型和向量库。适合想入门LLM应用开发、快速做原型验证想法的开发者上手,降低开发门槛。
需要学习LangChain,了解AI应用架构才能设计有效的测试方案。本篇涵盖LangChain/RAG/Agent、API集成、向量数据库,帮助你构建AI应用系统能力。
目录
可视化演示
展示观察者设计模式中主题与观察者的交互机制,当主题状态变化时自动通知所有注册的观察者,支持动态增删观察者和触发通知。
本节配有交互动效(进入视口后自动加载,约 3KB)。
观察者模式(Observer Pattern) 主题维护观察者列表,状态变化时遍历通知 观察者实现更新接口,响应主题通知 关系: Subject ←→ Observer[] 观察者模式实现一对多的依赖关系,松耦合设计。
LangChain框架总览与核心概念体系
LangChain是当前最流行的大语言模型(LLM)应用开发框架,它通过四个核心抽象组件组织LLM应用:Chain(链)、Tool(工具)、Memory(记忆)和Agent(智能体)。这四个组件通过可组合的接口设计实现灵活编排,使开发者能在几十行代码内完成一个功能完整的LLM应用原型。
Chain(链)将多个操作按顺序串联,实现从提示词模板到模型调用再到输出解析的流水线处理。例如一个典型的问答链:接收用户问题 -> 填充Prompt模板 -> 调用LLM -> 解析输出格式。Tool(工具)让LLM能够调用外部能力,包括搜索引擎、数据库查询、计算器、API调用等,极大扩展了LLM的能力边界。
Memory(记忆)组件维护对话上下文,使LLM能够理解多轮对话的连贯性。Agent(智能体)则是最核心的智能决策组件,它根据用户意图自主选择工具和执行路径,实现从'被动回答'到'主动决策'的跨越。这四个组件的协作方式是:Agent接收用户输入后,通过Memory获取对话上下文,根据推理结果选择Tool执行,最终通过Chain组织整个处理流程。
LCEL表达式语言与链式组合机制
LCEL(LangChain Expression Language)是LangChain的核心组合语法,使用管道运算符(|)将组件串联成链。就像工厂流水线上的传送带——原料(用户输入)经过冲压机(Prompt模板)、加工中心(LLM模型)、质检包装(输出解析器),每个工序用管道符连接,前一步的输出自动成为后一步的输入。典型的LCEL链写法为:prompt | model | parser。
LCEL的核心优势在于统一接口设计。所有组件都实现Runnable协议,支持三种调用方式:invoke(单次调用)、batch(批量调用)和stream(流式调用)。这意味着无论组件是Prompt模板、LLM模型还是输出解析器,调用方式完全一致,大幅降低了学习和使用成本。
LCEL还提供了两个旧版LLMChain不具备的架构级能力:自动并行化——当链中存在独立步骤时自动并行执行提升性能;内置fallback机制——当主组件失败时自动切换到备用组件,例如主模型API超时自动切换到备用模型。LangChain官方已推荐LCEL作为首选组合方式,旧版LLMChain类逐步弃用。
from langchain_core.prompts import ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_openai import ChatOpenAI prompt = ChatPromptTemplate.from_template("请用一句话解释{topic}")model = ChatOpenAI(model="gpt-4", temperature=0.7)parser = StrOutputParser() chain = prompt | model | parserresult = chain.invoke({"topic": "LangChain"})print(result)
Memory记忆组件与会话状态管理
Memory组件是LangChain中管理对话上下文的核心模块。就像人脑的不同记忆策略——短期记忆记住最近几句话(BufferWindow)、长期记忆把旧对话压缩成要点摘要(Summary)、需要回忆时按联想线索检索(向量存储),不同场景用不同策略平衡记忆量和回忆效率。
LangChain提供四种主要Memory实现:ConversationBufferMemory存储完整对话历史,适合短对话场景但token消耗随轮次线性增长;ConversationBufferWindowMemory只保留最近N轮对话,有效控制token消耗;ConversationSummaryMemory用LLM将历史对话摘要为精简文本,适合长对话场景;向量存储记忆将历史嵌入向量数据库,按语义相关性检索最相关的历史片段。
选择Memory策略的关键考量是token预算和对话长度。ConversationBufferMemory虽然最简单但长对话会很快超出上下文窗口导致报错。实际工程中,5轮以内的短对话用BufferMemory,5-20轮用WindowMemory保留最近上下文,超过20轮的长对话用SummaryMemory控制token消耗。向量存储记忆适合需要长期记忆的知识库场景。
Tool工具调用与Agent智能决策机制
Tool是LangChain中封装外部能力的标准接口,每个Tool包含三个要素:名称(name)、描述(description)和执行函数(func)。LLM通过阅读工具描述理解何时使用哪个工具,因此描述的质量直接决定Agent的工具选择准确性。例如一个订单查询工具的描述应写清楚'根据订单号查询物流状态和预计送达时间'。
Agent使用ReAct(Reasoning + Acting)推理模式实现智能决策。就像侦探破案的过程——看到线索后先推理(Thought: '这个线索指向嫌疑人A'),然后采取行动(Action: '调取A的通话记录'),观察结果(Observation: 'A案发时不在场'),再推理下一步,循环直到得出最终答案。这种Thought-Action-Observation循环使Agent能够动态规划执行路径。
LangChain支持多种Agent类型:OpenAI Tools Agent利用OpenAI的function calling能力,适合GPT-4等支持工具调用的模型;ReAct Agent使用文本推理方式,适合所有LLM模型;Structured Tool Agent使用结构化输出解析工具调用结果。Agent类型选择取决于模型能力和任务复杂度——支持function calling的模型优先用OpenAI Tools Agent,其他模型用ReAct Agent。
生态组件与模型向量库集成方案
LangChain最强大的竞争力之一是其丰富的生态集成能力。通过统一的接口抽象,LangChain支持100+种LLM模型提供商,包括OpenAI、Anthropic Claude、Google Gemini、本地部署的Ollama等。切换底层模型只需更换初始化参数,业务代码无需修改,大幅降低了供应商锁定风险。
在向量数据库方面,LangChain集成了50+种向量数据库,包括Chroma(轻量级本地存储)、Pinecone(云端托管服务)、Weaviate(支持混合检索)和Milvus(大规模分布式部署)等。文档加载器支持PDF(PyPDFLoader)、网页(WebBaseLoader)、Notion、Markdown等多种格式,覆盖企业知识库建设中的主要数据源。
这种统一接口设计遵循了依赖倒置原则——业务代码依赖抽象接口而非具体实现。例如使用LangChain的Embeddings接口,可以在Chroma和Pinecone之间无缝切换,只需修改初始化代码。这种设计使LangChain成为LLM应用领域的'胶水层',连接各种底层服务。
LangChain快速原型开发实战指南
使用LangChain快速搭建LLM应用原型的典型开发流程包含六个步骤:第一步选择模型并初始化LLM实例;第二步定义Prompt模板(包含系统提示和变量占位符);第三步配置Memory组件管理对话上下文;第四步集成所需Tool工具;第五步使用LCEL组合链或初始化Agent;第六步测试和调试。
以智能客服应用为例:用LCEL将客服Prompt模板、GPT-4模型和输出解析器串联成链,配置ConversationBufferWindowMemory保留最近5轮对话历史,集成3个Tool(订单查询工具、退款政策检索工具、人工转接工具),Agent使用ReAct模式根据用户问题自动选择调用哪个工具。当用户问'我的订单到哪了',Agent推理后调用订单查询工具返回物流信息。
LangChain的核心价值在于将复杂的LLM应用开发抽象为组件组合,开发者可以在几十行代码内完成一个具备工具调用和记忆能力的智能应用原型。但需要注意,LangChain的设计初衷是快速原型验证,其抽象层带来的性能开销和调试复杂性在生产环境中需要额外工程化处理,包括添加监控、重试机制和优化Prompt等。
AI 应用场景
企业知识库问答系统快速搭建
阶段:监控运维
解决的问题:企业内部知识散落在多个系统中,员工查找信息困难,需要快速搭建知识库问答系统但缺乏LLM应用开发经验
具体案例:使用LangChain在2天内搭建企业知识库问答系统:用PyPDFLoader加载500份PDF文档,RecursiveCharacterTextSplitter切分为1000 token块,OpenAIEmbeddings生成嵌入存入Chroma向量库。检索链用LCEL组合:Retriever | Context Prompt | GPT-4 | Answer Parser,配置ConversationSummaryMemory管理多轮追问上下文。集成3个Tool(知识库检索、内部Wiki搜索、工单系统查询)由ReAct Agent按需调用。系统上线后员工问答满意度从人工客服的72%提升至AI的88%。
智能数据分析助手原型开发
阶段:监控运维
解决的问题:业务人员需要数据分析但不会SQL,传统BI工具学习曲线陡峭,需要快速验证自然语言数据分析的可行性
具体案例:使用LangChain在1天内搭建数据分析助手原型:定义SQL查询Tool(封装数据库查询函数)和图表生成Tool(封装matplotlib绘图函数),Agent使用OpenAI Tools Agent类型根据自然语言问题自动选择工具。用户问'上个月销售额按地区分布如何',Agent推理后调用SQL工具查询数据,再调用图表工具生成饼图。整个原型仅120行代码,原型验证周期相比从零开发缩短80%。
Python 演示
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_core.output_parsers import StrOutputParserfrom langchain_openai import ChatOpenAIfrom langchain_core.messages import HumanMessage, AIMessage prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个智能客服助手,可以回答用户问题。"), MessagesPlaceholder(variable_name="chat_history"), ("human", "{input}")]) model = ChatOpenAI(model="gpt-4", temperature=0)parser = StrOutputParser() chain = prompt | model | parser chat_history = []user_input = "我的订单什么时候到?" result = chain.invoke({ "input": user_input, "chat_history": chat_history}) chat_history.extend([ HumanMessage(content=user_input), AIMessage(content=result)]) print(f"用户: {user_input}")print(f"助手: {result}")print(f"历史消息数: {len(chat_history)}")
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder导入ChatPromptTemplate用于构建多轮对话提示词模板,MessagesPlaceholder用于插入历史消息prompt = ChatPromptTemplate.from_messages([使用from_messages方法创建包含系统消息、历史消息占位符和用户消息的模板MessagesPlaceholder(variable_name="chat_history"),MessagesPlaceholder在模板中预留历史消息的位置,运行时由chat_history变量填充model = ChatOpenAI(model="gpt-4", temperature=0)初始化ChatOpenAI模型实例,指定使用gpt-4模型,temperature=0确保输出确定性chain = prompt | model | parser使用LCEL管道运算符将prompt、model和parser串联成链,数据从左到右依次流过每个组件result = chain.invoke({调用chain的invoke方法执行整条链,传入用户输入和对话历史chat_history.extend([将本轮的用户输入和AI回复添加到历史消息列表中,实现Memory的手动管理HumanMessage(content=user_input),HumanMessage封装用户输入消息,与AIMessage交替存储形成完整对话历史
常见问答
LangChain的LCEL和旧版LLMChain有什么区别?
如何选择LangChain中的Memory类型?
LangChain适合直接用于生产环境吗?
常见误区
误区认为LangChain的LCEL只是语法糖,与旧版LLMChain类功能相同可以随意选择
正解LCEL不仅语法更简洁,还提供了旧版LLMChain不具备的自动并行化、流式处理、内置fallback和统一Runnable接口等能力,LangChain官方已推荐LCEL作为首选组合方式并逐步弃用旧版Chain类。
为何常见:学习者看到LCEL和LLMChain都能实现链式调用就认为功能等价,忽略了LCEL在并行化、流式和容错方面的架构级优势。
误区认为ConversationBufferMemory存全部对话历史是最简单可靠的选择应总是使用
正解BufferMemory存全部历史会随对话轮次线性增长token消耗,长对话很快超出上下文窗口导致报错,实际应根据对话长度选择WindowMemory(短对话)或SummaryMemory(长对话)控制token预算。
为何常见:学习者将'完整记忆'等同于'最好记忆',忽略了token消耗和上下文窗口限制的工程约束。
误区认为LangChain生态集成丰富意味着生产环境可以直接使用,不需要额外工程化
正解LangChain的设计初衷是快速原型验证,其抽象层带来的性能开销和调试复杂性在生产环境中需要额外工程化处理,包括移除不必要的抽象层、添加监控和重试机制、优化Prompt等,生产部署建议评估是否使用LangChain或直接调用模型API。
为何常见:学习者被LangChain的快速开发体验吸引就认为可直接上生产,忽略了原型框架与生产框架在性能、可观测性和可靠性方面的差距。
参考来源
- docLangChain Official DocumentationLangChain官方文档,包含核心概念、LCEL语法、组件介绍和快速入门指南
- docLangChain Expression Language (LCEL)LCEL表达式语言的详细文档,包括Runnable协议、管道运算符、并行化和fallback机制
- webpageLangChain GitHub RepositoryLangChain开源代码仓库,包含完整的源代码、示例和生态集成列表