LangChain 从入门到实践:构建智能应用的核心框架 1. 引言为什么需要 LangChain在人工智能浪潮中大型语言模型LLMs如 GPT、Claude、文心一言等展现出了惊人的理解和生成能力。然而直接将原始 LLM 接入业务系统往往会遇到诸多挑战上下文限制LLM 的输入长度有限难以处理长文档或复杂对话历史。知识实时性模型的训练数据存在滞后无法获取最新信息。缺乏专业领域知识通用模型对特定行业如法律、医疗、金融的深度知识掌握不足。可重复性与可控性差相同的提示词可能产生不一致的结果难以保证业务流程的稳定性。LangChain 应运而生它是一个用于开发由语言模型驱动的应用程序的框架。其核心思想不是替代 LLM而是为 LLM 构建一个强大的“操作系统”和“工具箱”通过模块化设计解决上述痛点让开发者能够高效地构建复杂、可靠、可扩展的 AI 应用。2. LangChain 核心概念与架构LangChain 的设计哲学是“组合优于继承”。它将构建 LLM 应用的常见模式抽象为可复用的组件并通过清晰的接口将它们连接起来。2.1 核心六大模块模型 I/O (Model I/O)与各种 LLM 交互的抽象层。包括提示词 (Prompts)模板化、动态构建输入。语言模型 (LLMs)调用 OpenAI、Anthropic、本地模型等。输出解析器 (Output Parsers)将模型非结构化输出转换为结构化数据如 JSON、对象。数据连接 (Retrieval)让模型能够访问和利用外部数据。这是 LangChain 的“记忆”和“知识库”系统核心是RAG (检索增强生成)流程。文档加载器 (Document Loaders)从 PDF、网页、数据库、API 等来源加载数据。文本分割器 (Text Splitters)将长文档切分为适合模型处理的片段。向量存储 (Vectorstores)如 Chroma、Pinecone、Weaviate用于存储和检索文档嵌入。检索器 (Retrievers)从向量库中查询最相关的文档片段。链 (Chains)将多个组件或多个 LLM 调用按顺序组合成完整的工作流。例如检索文档 - 构建提示词 - 调用 LLM - 解析输出可以组成一个RetrievalQA链。记忆 (Memory)在对话或多次调用中持久化状态信息。例如ConversationBufferMemory会保存完整的聊天历史。代理 (Agents)让 LLM 具备使用工具如搜索引擎、计算器、API的能力自主决策执行步骤以完成复杂任务。其核心是ReAct (Reason Act)模式。回调 (Callbacks)用于日志记录、监控、流式传输等提供应用的可观测性。2.2 核心工作流RAG (检索增强生成)这是 LangChain 最经典的应用模式完美解决了 LLM 的“知识局限性”和“幻觉”问题。渲染错误:Mermaid 渲染失败: Parse error on line 3: ... B -- C[“文本向量化 (Embedding)”] C ----------------------^ Expecting SQE, DOUBLECIRCLEEND, PE, -), STADIUMEND, SUBROUTINEEND, PIPE, CYLINDEREND, DIAMOND_STOP, TAGEND, TRAPEND, INVTRAPEND, UNICODE_TEXT, TEXT, TAGSTART, got PS流程解读知识库构建离线将外部文档处理后存入向量数据库。问答执行在线用户提问时先将问题转换为向量在知识库中检索最相关的文档片段然后将“问题”和“检索到的上下文”一起交给 LLM让它基于可靠的依据生成答案。3. 环境准备与快速开始3.1 安装 LangChainLangChain 支持 Python 和 JavaScript/TypeScript。这里以 Python 为例。# 安装核心库pipinstalllangchain langchain-core# 安装社区提供的各种集成工具按需安装pipinstalllangchain-community# 安装 OpenAI 集成如果你使用 OpenAI 的模型pipinstalllangchain-openai# 安装用于本地向量数据库的 Chromapipinstalllangchain-chroma# 安装用于文档处理的工具pipinstallpypdf# 处理PDFpipinstalltiktoken# 用于文本分割的令牌计数3.2 基础配置设置你的 LLM首先你需要一个 LLM 提供商。这里以 OpenAI 为例你需要一个 API Key。importosfromlangchain_openaiimportChatOpenAI# 设置环境变量建议使用 .env 文件管理os.environ[OPENAI_API_KEY]your-api-key-here# 初始化一个聊天模型llmChatOpenAI(modelgpt-4o-mini,temperature0)# temperature 控制创造性0 表示更确定和一致接近 1 表示更随机。3.3 你的第一个 LangChain 应用一个简单的问答链让我们跳过复杂部分先感受一下链的威力。fromlangchain.promptsimportChatPromptTemplatefromlangchain.chainsimportLLMChain# 1. 定义一个提示词模板prompt_templateChatPromptTemplate.from_messages([(system,你是一个乐于助人的技术专家。),(user,{question})])# 2. 创建链将提示词模板和 LLM 连接起来simple_chainLLMChain(llmllm,promptprompt_template)# 3. 运行链responsesimple_chain.invoke({question:用简单的话解释一下 LangChain 是什么})print(response[text])输出可能类似“LangChain 就像一个给大语言模型比如 ChatGPT用的乐高工具箱和说明书。它提供各种标准化零件模块让开发者能轻松地把模型连接到自己的数据、记忆对话历史、使用外部工具从而搭建出功能复杂、稳定可靠的智能应用而不用从头发明轮子。”4. 深入实践构建一个基于 PDF 的智能问答系统现在我们结合 PDF 处理实现一个完整的 RAG 应用。假设你有一份技术文档manual.pdf。4.1 加载并处理 PDF 文档fromlangchain_community.document_loadersimportPyPDFLoaderfromlangchain.text_splitterimportRecursiveCharacterTextSplitterfromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_chromaimportChroma# 1. 加载 PDFloaderPyPDFLoader(path/to/your/manual.pdf)documentsloader.load()# 2. 分割文本防止超出模型上下文长度text_splitterRecursiveCharacterTextSplitter(chunk_size1000,# 每个片段约1000字符chunk_overlap200,# 片段间重叠200字符保持语义连贯separators[\n\n,\n,。,,, ,]# 中文友好分隔符)splitstext_splitter.split_documents(documents)print(f原始文档被分割为{len(splits)}个片段。)4.2 创建向量知识库# 3. 创建嵌入模型和向量数据库embeddingsOpenAIEmbeddings(modeltext-embedding-3-small)# 将文档片段转换为向量并存储vectorstoreChroma.from_documents(documentssplits,embeddingembeddings,persist_directory./chroma_db# 指定持久化目录)print(向量知识库构建完成)4.3 创建检索问答链fromlangchain.chainsimportRetrievalQAfromlangchain.promptsimportPromptTemplate# 4. 定义一个更专业的提示词模板qa_promptPromptTemplate.from_template( 你是一个严谨的技术文档助手。请严格根据以下提供的上下文信息来回答问题。如果上下文信息不足以回答问题请直接说“根据提供的资料我无法回答这个问题”不要编造信息。 上下文 {context} 问题{question} 请基于上下文给出答案 )# 5. 创建检索器retrievervectorstore.as_retriever(search_kwargs{k:4})# 检索最相关的4个片段# 6. 创建完整的 RetrievalQA 链qa_chainRetrievalQA.from_chain_type(llmllm,chain_typestuff,# 最简单的方式将所有检索到的上下文塞进提示词retrieverretriever,chain_type_kwargs{prompt:qa_prompt},return_source_documentsTrue# 返回参考来源)# 7. 进行问答resultqa_chain.invoke({query:这份手册中提到的核心安全规范是什么})print(答案,result[result])print(\n参考来源)fori,docinenumerate(result[source_documents][:2]):# 显示前两个来源print(f[{i1}]{doc.page_content[:200]}...)# 截取片段预览5. 超越基础高级模式与最佳实践5.1 使用代理Agents调用工具让模型学会使用计算器、搜索网络或查询数据库。fromlangchain.agentsimportAgentExecutor,create_tool_calling_agentfromlangchain.toolsimportToolfromlangchain.utilitiesimportWikipediaAPIWrapper# 定义工具wikipediaWikipediaAPIWrapper()tools[Tool(nameWikipedia,funcwikipedia.run,description用于搜索维基百科上关于人物、地点、公司、历史事件等通用知识。),# 可以添加更多工具如计算器、天气API、自定义函数等]# 创建代理提示词和代理fromlangchainimporthub prompthub.pull(hwchase17/openai-tools-agent)agentcreate_tool_calling_agent(llm,tools,prompt)agent_executorAgentExecutor(agentagent,toolstools,verboseTrue)# 运行代理resultagent_executor.invoke({input:LangChain 框架的创始人是谁他还有哪些知名的开源项目})print(result[output])5.2 管理对话历史Memory构建能记住上下文的聊天机器人。fromlangchain.memoryimportConversationBufferWindowMemory memoryConversationBufferWindowMemory(k3,return_messagesTrue)# k3 表示只保留最近3轮对话# 将 memory 集成到链中fromlangchain.chainsimportConversationChain conversationConversationChain(llmllm,memorymemory,verboseTrue)conversation.invoke(我叫小明。)conversation.invoke(我的名字是什么)# 模型会记得你叫小明5.3 生产环境最佳实践异步支持LangChain 全面支持async/await用于构建高并发应用。流式输出使用chain.astream()或chain.astream_events()实现打字机效果。索引优化对于海量文档考虑使用混合检索关键词向量或引入元数据过滤。评估与监控使用LangSmithLangChain 官方平台进行链的跟踪、评估和调试。成本控制缓存嵌入结果设置max_tokens限制监控 Token 使用量。6. 总结与展望LangChain 通过其模块化设计极大地降低了构建复杂 LLM 应用的门槛。从简单的提示词链到拥有记忆、工具和知识库的智能代理它提供了一条清晰的演进路径。核心价值总结标准化定义了构建 LLM 应用的通用模式和接口。可组合性像搭积木一样自由组合功能。生态丰富集成了数百种数据源、工具和模型提供商。生产就绪提供了记忆、回调、流式传输等企业级功能。未来随着多模态模型和智能体Agent的发展LangChain 正在向LangGraph演进用于编排具有循环和状态的高级工作流。掌握 LangChain 不仅是学习一个工具更是理解如何系统化地设计和实现下一代 AI 应用的思想。