LangChain 入门实战:从零搭建 AI 应用工作流
1. 引言LangChain 是目前最流行的 AI 应用开发框架之一它把大语言模型LLM与外部数据源、工具和记忆能力连接起来帮助开发者快速搭建复杂的 AI 工作流。本文将从零开始通过大量可运行的代码示例带你一步步掌握 LangChain 的核心概念与实战技巧。无论你是刚接触大模型开发的新手还是有一定经验的工程师本文都会从环境搭建讲起逐步深入到模型调用、提示词工程、链式调用、记忆管理、检索增强生成RAG和 Agent 等核心主题。2. 环境准备2.1 安装 Python 与虚拟环境LangChain 基于 Python 开发建议使用 Python 3.9 及以上版本。首先创建并激活虚拟环境# 创建虚拟环境 python -m venv langchain-env 激活虚拟环境Windows langchain-env\Scripts\activate 激活虚拟环境macOS / Linux source langchain-env/bin/activate2.2 安装 LangChain 及相关依赖安装 LangChain 主包以及常用的模型接口包pip install langchain pip install langchain-openai pip install langchain-community pip install python-dotenv如果你计划使用向量数据库和文档加载功能还需要安装以下依赖pip install chromadb pip install pypdf pip install tiktoken2.3 配置 API Key在项目根目录创建.env文件写入你的 API KeyOPENAI_API_KEYsk-xxxxxxxxxxxxxxxxxxxxxxxx # 如果使用其他模型服务商可配置对应的 Key然后在代码中加载环境变量from dotenv import load_dotenv load_dotenv()3. 第一个 LangChain 程序3.1 调用大语言模型LangChain 对不同的模型提供商做了统一封装。下面以 OpenAI 为例演示最基本的模型调用from langchain_openai import ChatOpenAI 初始化模型 llm ChatOpenAI( modelgpt-4o-mini, temperature0.7 ) 直接调用 response llm.invoke(用一句话介绍 LangChain) print(response.content)运行上面的代码你会看到模型返回一段关于 LangChain 的介绍文字。这里的invoke是 LangChain 统一的标准调用入口。3.2 使用提示词模板实际开发中我们通常不会直接向模型提问而是使用提示词模板来规范输入格式from langchain_core.prompts import ChatPromptTemplate 定义提示词模板 prompt ChatPromptTemplate.from_messages([ (system, 你是一位资深的技术写作专家擅长用通俗易懂的语言解释复杂概念。), (human, 请用不超过 {word_limit} 个字解释什么是 {topic}。) ]) 填充模板 formatted_prompt prompt.invoke({ topic: LangChain, word_limit: 100 }) 调用模型 response llm.invoke(formatted_prompt) print(response.content)提示词模板让提示词与业务逻辑分离便于维护和复用。4. 输出解析器大模型返回的是纯文本但在实际应用中我们往往需要结构化的数据。LangChain 提供了多种输出解析器来解决这个问题。4.1 结构化输出解析from langchain_core.output_parsers import StrOutputParser from langchain_core.pydantic_v1 import BaseModel, Field 定义输出结构 class ArticleOutline(BaseModel): title: str Field(description文章标题) sections: list[str] Field(description章节列表) 使用 Pydantic 输出解析器 from langchain_core.output_parsers import JsonOutputParser parser JsonOutputParser(pydantic_objectArticleOutline) prompt ChatPromptTemplate.from_messages([ (system, 你是一个文章大纲生成器请严格按照要求的 JSON 格式输出。), (human, 请为「{topic}」生成一个文章大纲。\n{format_instructions}) ]).partial(format_instructionsparser.get_format_instructions()) chain prompt | llm | parser result chain.invoke({topic: LangChain 入门}) print(result) print(标题, result[title]) print(章节, result[sections])通过输出解析器我们可以把模型的自由文本输出转换为 Python 字典或自定义对象方便后续程序处理。5. 链Chain与工作流链是 LangChain 的核心抽象它把多个组件串联起来形成一个完整的处理流程。5.1 使用 LCEL 构建链LangChain 表达式语言LCEL提供了一种简洁的链式写法使用管道符|连接各个组件from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser 初始化模型 llm ChatOpenAI(modelgpt-4o-mini, temperature0.7) 构建链提示词 - 模型 - 输出解析 chain ( ChatPromptTemplate.from_template(请把下面这句话翻译成英文{text}) | llm | StrOutputParser() ) 执行链 result chain.invoke({text: 今天天气真好}) print(result)LCEL 让代码非常简洁同时支持并行执行、流式输出和异步调用等高级特性。5.2 多步骤工作流下面演示一个更复杂的多步骤工作流先生成文章大纲再根据大纲逐节撰写内容。from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser llm ChatOpenAI(modelgpt-4o-mini, temperature0.7) 第一步生成大纲 outline_prompt ChatPromptTemplate.from_template( 请为「{topic}」生成一个包含 3 个小节的文章大纲每行一个小节标题。 ) outline_chain outline_prompt | llm | StrOutputParser() 第二步根据大纲写正文 writing_prompt ChatPromptTemplate.from_template( 请根据以下大纲撰写「{topic}」的完整正文\n{outline} ) writing_chain writing_prompt | llm | StrOutputParser() 组合成完整工作流 full_chain ( {outline: outline_chain, topic: lambda x: x[topic]} | writing_chain ) result full_chain.invoke({topic: AI 智能客服}) print(result)这种组合方式让每个步骤都可以独立测试和替换非常灵活。6. 记忆管理默认情况下大模型是无状态的每次调用都是独立的。LangChain 提供了多种记忆组件让模型能够记住对话历史。6.1 对话记忆from langchain.memory import ConversationBufferMemory from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_openai import ChatOpenAI 初始化记忆 memory ConversationBufferMemory( return_messagesTrue, memory_keychat_history ) 构建带记忆的提示词 prompt ChatPromptTemplate.from_messages([ (system, 你是一个友好的 AI 助手。), MessagesPlaceholder(variable_namechat_history), (human, {input}) ]) llm ChatOpenAI(modelgpt-4o-mini, temperature0.7) 模拟多轮对话 from langchain_core.messages import HumanMessage, AIMessage 第一轮 memory.chat_memory.add_user_message(我叫小明我喜欢编程) memory.chat_memory.add_ai_message(你好小明很高兴认识你编程是个很棒的爱好) 第二轮模型能记住用户的名字 formatted prompt.invoke({ chat_history: memory.chat_memory.messages, input: 我叫什么名字 }) response llm.invoke(formatted) print(response.content)通过记忆组件模型可以在多轮对话中保持上下文一致性这是构建聊天机器人的关键能力。7. 检索增强生成RAGRAG 是 LangChain 最热门的应用场景之一。它通过检索外部知识库把相关内容注入到提示词中让模型基于私有数据回答问题。7.1 文档加载与切分from langchain_community.document_loaders import TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter 加载文档 loader TextLoader(knowledge_base.txt, encodingutf-8) documents loader.load() 切分文档 text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50 ) chunks text_splitter.split_documents(documents) print(f文档被切分为 {len(chunks)} 个块)7.2 构建向量存储from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma 初始化嵌入模型 embeddings OpenAIEmbeddings() 创建向量数据库 vectorstore Chroma.from_documents( documentschunks, embeddingembeddings, persist_directory./chroma_db ) 执行相似度检索 retriever vectorstore.as_retriever( search_kwargs{k: 3} ) results retriever.invoke(LangChain 支持哪些模型) for doc in results: print(---) print(doc.page_content)7.3 完整的 RAG 问答链from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser 构建 RAG 提示词 rag_prompt ChatPromptTemplate.from_template( 请基于以下知识库内容回答问题。如果知识库中没有相关信息请如实说明。 知识库内容 {context} 问题{question} 请给出详细、准确的回答 ) llm ChatOpenAI(modelgpt-4o-mini, temperature0.3) 构建 RAG 链 def format_docs(docs): return \n\n.join(doc.page_content for doc in docs) rag_chain ( { context: retriever | format_docs, question: lambda x: x[question] } | rag_prompt | llm | StrOutputParser() ) 提问 answer rag_chain.invoke({question: LangChain 的核心组件有哪些}) print(answer)RAG 让大模型能够访问实时数据和私有知识库是构建企业级 AI 应用的重要技术。8. Agent 智能体Agent 是 LangChain 的高级特性它让模型能够自主决定调用哪些工具、按什么顺序执行从而实现更复杂的任务。8.1 定义工具from langchain_core.tools import tool tool def add(a: int, b: int) - int: 计算两个数字的和。 return a b tool def multiply(a: int, b: int) - int: 计算两个数字的乘积。 return a * b tool def get_weather(city: str) - str: 查询指定城市的天气情况。 # 这里可以接入真实的天气 API return f{city} 今天晴气温 25 摄氏度8.2 创建 Agentfrom langchain_openai import ChatOpenAI from langchain.agents import create_tool_calling_agent, AgentExecutor llm ChatOpenAI(modelgpt-4o-mini, temperature0) tools [add, multiply, get_weather] 创建 Agent agent create_tool_calling_agent( llmllm, toolstools, promptChatPromptTemplate.from_messages([ (system, 你是一个智能助手可以调用工具来完成任务。), (human, {input}), (placeholder, {agent_scratchpad}) ]) ) 创建执行器 agent_executor AgentExecutor( agentagent, toolstools, verboseTrue ) 执行任务 result agent_executor.invoke({ input: 帮我计算 (23 45) * 2 的结果顺便查一下北京的天气 }) print(result[output])Agent 会自动拆解任务、调用合适的工具并汇总结果是实现自动化工作流的核心能力。9. 实战项目智能客服工作流下面我们把前面学到的知识整合起来构建一个完整的智能客服工作流它具备知识库问答和工单记录能力。9.1 完整代码from dotenv import load_dotenv from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain_community.document_loaders import TextLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.vectorstores import Chroma from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.tools import tool from langchain.agents import create_tool_calling_agent, AgentExecutor load_dotenv() 1. 初始化模型 llm ChatOpenAI(modelgpt-4o-mini, temperature0.3) 2. 构建知识库 loader TextLoader(faq.txt, encodingutf-8) documents loader.load() text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50 ) chunks text_splitter.split_documents(documents) embeddings OpenAIEmbeddings() vectorstore Chroma.from_documents( documentschunks, embeddingembeddings, persist_directory./faq_db ) retriever vectorstore.as_retriever(search_kwargs{k: 3}) 3. 构建 RAG 问答链 rag_prompt ChatPromptTemplate.from_template( 请基于以下知识库内容回答用户问题。如果知识库中没有相关信息请礼貌地表示需要转接人工客服。 知识库内容 {context} 用户问题{question} 回答 ) def format_docs(docs): return \n\n.join(doc.page_content for doc in docs) rag_chain ( { context: retriever | format_docs, question: lambda x: x[question] } | rag_prompt | llm | StrOutputParser() ) 4. 定义工具 tool def answer_from_knowledge_base(question: str) - str: 从知识库中检索并回答用户问题。 return rag_chain.invoke({question: question}) tool def create_ticket(user_id: str, issue: str) - str: 创建人工客服工单。 ticket_id fTICKET-{hash(user_id issue) % 100000:05d} return f工单已创建编号{ticket_id}我们会尽快处理您的问题。 5. 创建智能客服 Agent agent_prompt ChatPromptTemplate.from_messages([ (system, 你是智能客服助手。优先使用知识库回答用户问题如果知识库无法解决则创建工单转人工。), (human, {input}), (placeholder, {agent_scratchpad}) ]) agent create_tool_calling_agent( llmllm, tools[answer_from_knowledge_base, create_ticket], promptagent_prompt ) agent_executor AgentExecutor( agentagent, tools[answer_from_knowledge_base, create_ticket], verboseTrue ) 6. 测试 if name main: # 测试知识库问答 result1 agent_executor.invoke({ input: 你们的退货政策是什么 }) print(回答, result1[output]) print( * 50) # 测试工单创建 result2 agent_executor.invoke({ input: 我的订单一直没发货帮我转人工处理用户ID是 10086 }) print(回答, result2[output])/code/pre 9.2 运行效果 运行上述代码后Agent 会根据用户问题自动判断如果知识库中有答案就直接回答如果无法解决就创建工单并返回工单编号。整个过程完全自动化无需人工干预。 10. 性能优化与最佳实践 10.1 缓存机制 对于重复性请求可以使用缓存来降低 API 调用成本 from langchain.cache import InMemoryCache from langchain.globals import set_llm_cache 启用内存缓存 set_llm_cache(InMemoryCache()) 第一次调用会请求 API response1 llm.invoke(什么是 LangChain) 第二次调用直接命中缓存 response2 llm.invoke(什么是 LangChain) print(response1.content response2.content) # True 10.2 流式输出 为了提升用户体验可以使用流式输出让内容逐字显示 from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser llm ChatOpenAI(modelgpt-4o-mini, temperature0.7, streamingTrue) chain ( ChatPromptTemplate.from_template(写一首关于春天的短诗{theme}) | llm | StrOutputParser() ) for chunk in chain.stream({theme: 江南}): print(chunk, end, flushTrue) 10.3 异步调用 在高并发场景下使用异步接口可以显著提升吞吐量 import asyncio from langchain_openai import ChatOpenAI async def main(): llm ChatOpenAI(modelgpt-4o-mini, temperature0.7) # 并发执行多个请求 tasks [ llm.ainvoke(f用一句话介绍{topic}) for topic in [Python, Java, Go, Rust] ] results await asyncio.gather(*tasks) for r in results: print(r.content) print(---) asyncio.run(main()) 11. 常见问题与排查 问题 可能原因 解决方案 API Key 无效 环境变量未正确加载 检查 .env 文件路径和变量名确认 load_dotenv() 已调用 模型返回超时 网络问题或请求过大 减小输入长度增加 timeout 参数检查网络连接 向量检索结果不相关 文档切分不合理 调整 chunk_size 和 chunk_overlap优化文档质量 Agent 循环调用工具 提示词不够明确 在 system 提示词中明确工具使用边界和终止条件 输出格式不符合预期 缺少输出解析器 使用 JsonOutputParser 或 PydanticOutputParser 约束格式 12. 总结与进阶方向 本文从零开始系统讲解了 LangChain 的核心概念和实战技巧包括模型调用、提示词工程、输出解析、链式工作流、记忆管理、RAG 检索增强和 Agent 智能体并通过一个完整的智能客服项目串联了所有知识点。 接下来你可以从以下方向继续深入 多模态应用探索 LangChain 对图片、音频等多模态输入的支持。 复杂 Agent 设计学习 ReAct、Plan-and-Execute 等高级 Agent 模式。 生产级部署结合 FastAPI 和 Docker 将 LangChain 应用部署到生产环境。 评估与监控使用 LangSmith 对链和 Agent 进行追踪、评估和优化。 生态集成了解 LangGraph、LangServe 等周边工具构建更复杂的图状工作流。 LangChain 生态发展非常迅速建议多阅读官方文档和社区实践动手编写代码是掌握它的最佳方式。希望本文能帮助你顺利开启 LangChain 实战之旅。