开启左侧

LangChain

[复制链接]
作者:CSDN博客
LangChain 进阶开发者学习笔记


零、环境配置与快速开始

0.1 安装依赖
  1. # 核心库
  2. pip install langchain langchain-core langchain-community
  3. # LLM 提供商(根据需要选择)
  4. pip install langchain-openai      # OpenAI/Azure OpenAI
  5. pip install langchain-anthropic   # Claude
  6. pip install langchain-google-genai # Gemini
  7. pip install langchain-ollama      # 本地模型# 向量数据库(RAG 必需)
  8. pip install chromadb              # 轻量级向量库
  9. pip install faiss-cpu             # Facebook 向量检索# 工具库
  10. pip install langsmith              # 可观测性(可选)
复制代码
0.2 配置 API Key

方式一:环境变量(推荐)
  1. # Linux/MacexportOPENAI_API_KEY="sk-..."exportANTHROPIC_API_KEY="sk-ant-..."# Windows PowerShell$env:OPENAI_API_KEY="sk-..."
复制代码
方式二:代码中配置
  1. import os
  2. os.environ["OPENAI_API_KEY"]="sk-..."# 或直接传参from langchain_openai import ChatOpenAI
  3. llm = ChatOpenAI(api_key="sk-...", model="gpt-4")
复制代码
0.3 验证安装
  1. from langchain_openai import ChatOpenAI
  2. from langchain_core.messages import HumanMessage
  3. # 初始化模型
  4. llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)# 测试调用
  5. response = llm.invoke([HumanMessage(content="你好,请用一句话介绍自己")])print(response.content)
复制代码
执行效果
  1. 我是 OpenAI 开发的 AI 助手,专注于回答问题、提供信息和协助完成各种任务。
复制代码
0.4 国内环境配置

使用代理
  1. import os
  2. os.environ["HTTP_PROXY"]="http://127.0.0.1:7890"
  3. os.environ["HTTPS_PROXY"]="http://127.0.0.1:7890"
复制代码
使用国内 API 中转
  1. llm = ChatOpenAI(
  2.     api_key="your-key",
  3.     base_url="https://api.openai-proxy.com/v1",# 中转地址
  4.     model="gpt-4o-mini")
复制代码
使用本地模型(Ollama)
  1. # 安装 Ollamacurl-fsSL https://ollama.com/install.sh |sh# 下载模型
  2. ollama pull qwen2.5:7b
复制代码
  1. from langchain_ollama import ChatOllama
  2. llm = ChatOllama(model="qwen2.5:7b", temperature=0)
  3. response = llm.invoke("你好")print(response.content)
复制代码

一、架构全景:LangChain 的设计哲学

1.1 核心定位

LangChain = Spring Boot for LLM Applications
    传统后端:HTTP 请求 → Controller → Service → Repository → DatabaseLangChain:用户输入 → Prompt → LLM → Tools/Memory → 结构化输出
1.2 核心组件对标

LangChain 组件传统后端类比职责
RunnableInterface/抽象类统一调用接口(.invoke(), .stream(), .batch())
LCEL (Expression Language)管道/中间件链组件编排(prompt | llm | parser)
ChainService 层业务逻辑封装多步骤流程
Agent动态路由控制器根据输入自主决策调用哪些 Tools
Tools外部 API/Repository执行具体操作(搜索、数据库查询、API 调用)
MemorySession/Redis 缓存维护对话上下文
Retriever数据库查询层向量检索/文档召回

二、基础架构:Runnable 与 LCEL

2.1 Runnable:统一调用接口

类比:Java 的 Function<T, R> 或 Spring 的 HandlerInterceptor
所有 LangChain 组件都实现 Runnable 接口,提供标准化调用方式:
  1. from langchain_openai import ChatOpenAI
  2. from langchain_core.messages import HumanMessage
  3. import asyncio
  4. import time
  5. llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)# 1. 同步调用
  6. result = llm.invoke([HumanMessage(content="1+1等于几?")])print(f"同步调用: {result.content}")# 2. 批量调用(一次请求处理多个输入)
  7. batch_results = llm.batch([[HumanMessage(content="Python 之父是谁?")],[HumanMessage(content="Java 之父是谁?")]])for i, res inenumerate(batch_results):print(f"批量结果 {i+1}: {res.content}")# 3. 流式调用(实时输出)print("流式调用: ", end="")for chunk in llm.stream([HumanMessage(content="用一句话介绍 LangChain")]):print(chunk.content, end="", flush=True)print()# 4. 异步调用(高并发场景)asyncdefasync_demo():"""异步调用示例:适合需要同时处理多个请求的场景"""# 4.1 单个异步调用
  8.     result =await llm.ainvoke([HumanMessage(content="什么是异步编程?")])print(f"\n异步调用: {result.content}")# 4.2 并发执行多个请求(性能优势明显)
  9.     start_time = time.time()# 创建多个异步任务
  10.     tasks =[
  11.         llm.ainvoke([HumanMessage(content="什么是 Python?")]),
  12.         llm.ainvoke([HumanMessage(content="什么是 Java?")]),
  13.         llm.ainvoke([HumanMessage(content="什么是 JavaScript?")])]# 并发执行(同时发送3个请求)
  14.     results =await asyncio.gather(*tasks)
  15.    
  16.     elapsed = time.time()- start_time
  17.     print(f"\n并发执行3个请求耗时: {elapsed:.2f}秒")for i, res inenumerate(results):print(f"  结果 {i+1}: {res.content[:50]}...")# 4.3 异步流式输出print("\n异步流式调用: ", end="")asyncfor chunk in llm.astream([HumanMessage(content="用一句话总结 AI 的未来")]):print(chunk.content, end="", flush=True)print()# 运行异步示例
  18. asyncio.run(async_demo())
复制代码
执行效果
  1. 同步调用: 1+1等于2。
  2. 批量结果 1: Python 之父是 Guido van Rossum。
  3. 批量结果 2: Java 之父是 James Gosling。
  4. 流式调用: LangChain 是一个用于构建基于大语言模型应用的开发框架。
  5. 异步调用: 异步编程是一种编程范式,允许程序在等待某些操作完成时继续执行其他任务,而不是阻塞等待。
  6. 并发执行3个请求耗时: 1.23秒
  7.   结果 1: Python 是一种高级、解释型、通用的编程语言...
  8.   结果 2: Java 是一种面向对象的编程语言,由 Sun Microsystems...
  9.   结果 3: JavaScript 是一种轻量级、解释型的编程语言...
  10. 异步流式调用: AI 的未来将更加智能化、普及化,深度融入人类生活的各个领域。
复制代码
性能对比
    同步执行 3 个请求:约 3-4 秒(串行执行)异步并发 3 个请求:约 1-1.5 秒(并行执行)性能提升:约 3 倍
关键方法
    invoke() - 同步执行,等待完整响应ainvoke() - 异步执行(高并发场景,需配合 asyncio)stream() - 流式输出(实时响应,用户体验更好)astream() - 异步流式输出(结合异步 + 流式的优势)batch() - 批量处理(减少网络开销,提升吞吐量)
何时使用异步
    Web 服务器:同时处理多个用户请求(FastAPI、Django Async)✅ 批量任务:需要调用多个 LLM 接口✅ 实时应用:聊天机器人、客服系统❌ 简单脚本:单次调用用同步即可
2.2 LCEL:管道式组件编排

类比:Spring WebFlux 的 Reactive Streams 或 Unix 管道
  1. from langchain_core.prompts import ChatPromptTemplate
  2. from langchain_core.output_parsers import StrOutputParser
  3. from langchain_openai import ChatOpenAI
  4. # 管道式组装:prompt → llm → parser
  5. chain =(
  6.     ChatPromptTemplate.from_template("将 {text} 翻译成英文")| ChatOpenAI(model="gpt-4o-mini", temperature=0)| StrOutputParser())# 执行
  7. result = chain.invoke({"text":"你好世界"})print(f"翻译结果: {result}")# 批量翻译
  8. batch_results = chain.batch([{"text":"早上好"},{"text":"谢谢"}])for i, res inenumerate(batch_results):print(f"批量翻译 {i+1}: {res}")
复制代码
执行效果
  1. 翻译结果: Hello, world
  2. 批量翻译 1: Good morning
  3. 批量翻译 2: Thank you
复制代码
核心优势
    类型安全:编译时检查输入输出类型可组合:任意 Runnable 可通过 | 连接可观测:自动集成 LangSmith 追踪
2.3 高级编排:并行与条件分支
  1. from langchain_core.runnables import RunnableParallel, RunnableBranch
  2. from langchain_core.prompts import ChatPromptTemplate
  3. from langchain_core.output_parsers import StrOutputParser
  4. from langchain_openai import ChatOpenAI
  5. llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)# 1. 并行执行(类比 CompletableFuture.allOf)
  6. summarize_chain =(
  7.     ChatPromptTemplate.from_template("用一句话总结:{text}")| llm | StrOutputParser())
  8. translate_chain =(
  9.     ChatPromptTemplate.from_template("翻译成英文:{text}")| llm | StrOutputParser())
  10. sentiment_chain =(
  11.     ChatPromptTemplate.from_template("分析情感(正面/负面/中性):{text}")| llm | StrOutputParser())
  12. parallel_chain = RunnableParallel(
  13.     summary=summarize_chain,
  14.     translation=translate_chain,
  15.     sentiment=sentiment_chain
  16. )
  17. result = parallel_chain.invoke({"text":"今天天气真好,心情很愉快!"})print("并行执行结果:")print(f"  摘要: {result['summary']}")print(f"  翻译: {result['translation']}")print(f"  情感: {result['sentiment']}")# 2. 条件分支(类比 if-else 路由)
  18. chinese_chain = ChatPromptTemplate.from_template("用中文回答:{question}")| llm | StrOutputParser()
  19. english_chain = ChatPromptTemplate.from_template("Answer in English: {question}")| llm | StrOutputParser()
  20. default_chain = ChatPromptTemplate.from_template("回答:{question}")| llm | StrOutputParser()
  21. branch_chain = RunnableBranch((lambda x: x.get("language")=="zh", chinese_chain),(lambda x: x.get("language")=="en", english_chain),
  22.     default_chain  # 默认分支)
  23. result_zh = branch_chain.invoke({"language":"zh","question":"什么是 AI?"})
  24. result_en = branch_chain.invoke({"language":"en","question":"What is AI?"})print(f"\n中文分支: {result_zh}")print(f"英文分支: {result_en}")
复制代码
执行效果
  1. 并行执行结果:
  2.   摘要: 今天天气好,心情愉快。
  3.   翻译: The weather is really nice today, and I'm in a great mood!
  4.   情感: 正面
  5. 中文分支: AI(人工智能)是指通过计算机系统模拟人类智能的技术...
  6. 英文分支: AI (Artificial Intelligence) refers to the simulation of human intelligence...
复制代码

三、核心特性:Chains、Agents、Memory

3.1 Chain:封装业务流程

类比:Service 层的业务方法
基础 Chain
  1. from langchain_core.prompts import ChatPromptTemplate
  2. from langchain_core.output_parsers import StrOutputParser
  3. from langchain_openai import ChatOpenAI
  4. # 使用 LCEL 构建简单链
  5. prompt = ChatPromptTemplate.from_template("用通俗易懂的语言解释 {concept}")
  6. llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
  7. parser = StrOutputParser()
  8. chain = prompt | llm | parser
  9. # 执行
  10. result = chain.invoke({"concept":"依赖注入"})print(f"解释结果:\n{result}")
复制代码
执行效果
  1. 解释结果:
  2. 依赖注入就像是你去餐厅吃饭,服务员会把菜端到你面前,而不是让你自己去厨房拿。
  3. 在编程中,依赖注入是指一个对象不自己创建它需要的其他对象,而是由外部传递进来,
  4. 这样可以让代码更灵活、更容易测试。
复制代码
RAG Chain(检索增强生成)

类比:先查数据库,再用查询结果生成响应
  1. from langchain_core.runnables import RunnablePassthrough
  2. from langchain_core.prompts import ChatPromptTemplate
  3. from langchain_core.output_parsers import StrOutputParser
  4. from langchain_openai import ChatOpenAI, OpenAIEmbeddings
  5. from langchain_community.vectorstores import Chroma
  6. from langchain_text_splitters import RecursiveCharacterTextSplitter
  7. from langchain_core.documents import Document
  8. # 1. 准备知识库数据
  9. documents =[
  10.     Document(page_content="向量数据库是专门用于存储和检索高维向量的数据库,常用于 AI 应用。"),
  11.     Document(page_content="Chroma 是一个轻量级的开源向量数据库,支持本地运行。"),
  12.     Document(page_content="RAG(检索增强生成)通过检索相关文档来增强 LLM 的回答准确性。")]# 2. 创建向量存储
  13. vectorstore = Chroma.from_documents(
  14.     documents=documents,
  15.     embedding=OpenAIEmbeddings())
  16. retriever = vectorstore.as_retriever(search_kwargs={"k":2})# 3. 构建 RAG 链defformat_docs(docs):return"\n\n".join([d.page_content for d in docs])
  17. rag_chain =({"context": retriever | format_docs,# 检索并格式化文档"question": RunnablePassthrough()# 透传原始问题}| ChatPromptTemplate.from_template("基于以下上下文回答问题:\n{context}\n\n问题:{question}")| ChatOpenAI(model="gpt-4o-mini", temperature=0)| StrOutputParser())# 4. 执行查询
  18. result = rag_chain.invoke("什么是向量数据库?")print(f"RAG 回答:\n{result}")
复制代码
执行效果
  1. RAG 回答:
  2. 向量数据库是专门用于存储和检索高维向量的数据库系统,常用于 AI 应用场景。
  3. 例如 Chroma 就是一个轻量级的开源向量数据库,支持本地运行,非常适合快速原型开发。
复制代码
关键点
    retriever 负责向量检索(类比 DAO 层)RunnablePassthrough() 透传输入(类比 Spring 的 @PathVariable)format_docs() 将检索结果格式化为 Prompt 上下文
3.2 Agent:自主决策执行器

类比:动态路由 + 策略模式
Agent 会根据用户输入自主决定调用哪些 Tools,类似于:
  1. // 伪代码if(需要搜索){
  2.     result = searchTool.execute();}elseif(需要计算){
  3.     result = calculatorTool.execute();}
复制代码
ReAct Agent(推理 + 行动)

注意:Tool的函数中,必须至少要有一个入参作为占位,即使在函数中没有使用
  1. from langchain.agents import AgentExecutor, create_react_agent
  2. from langchain_core.tools import Tool
  3. from langchain_core.prompts import PromptTemplate
  4. from langchain_openai import ChatOpenAI
  5. # 1. 定义工具defsearch_func(query:str)->str:"""模拟搜索功能"""
  6.     knowledge_base ={"2022世界杯":"2022年世界杯冠军是阿根廷","Python":"Python 是一种高级编程语言",}for key, value in knowledge_base.items():if key in query:return value
  7.     returnf"未找到关于 '{query}' 的信息"defcalculator_func(expression:str)->str:"""计算器工具"""try:
  8.         result =eval(expression)returnf"计算结果: {result}"except Exception as e:returnf"计算错误: {str(e)}"
  9. search_tool = Tool(
  10.     name="搜索",
  11.     func=search_func,
  12.     description="用于查询最新信息和知识,输入应该是搜索关键词")
  13. calculator_tool = Tool(
  14.     name="计算器",
  15.     func=calculator_func,
  16.     description="用于执行数学计算,输入应该是数学表达式,例如 '2+3*4'")
  17. tools =[search_tool, calculator_tool]# 2. 创建 Agent(使用 ReAct 模板)from langchain import hub
  18. prompt = hub.pull("hwchase17/react")
  19. llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
  20. agent = create_react_agent(llm, tools, prompt)# 3. 创建执行器
  21. agent_executor = AgentExecutor(
  22.     agent=agent,
  23.     tools=tools,
  24.     verbose=True,# 打印推理过程
  25.     max_iterations=5,
  26.     handle_parsing_errors=True)# 4. 执行任务print("=== 任务1: 需要搜索 ===")
  27. result1 = agent_executor.invoke({"input":"2022年世界杯冠军是谁?"})print(f"最终答案: {result1['output']}\n")print("=== 任务2: 需要计算 ===")
  28. result2 = agent_executor.invoke({"input":"计算 (25 + 15) * 3"})print(f"最终答案: {result2['output']}\n")print("=== 任务3: 需要多步推理 ===")
  29. result3 = agent_executor.invoke({"input":"如果一本书30元,我买5本需要多少钱?"})print(f"最终答案: {result3['output']}")
复制代码
执行效果
  1. === 任务1: 需要搜索 ===
  2. > Entering new AgentExecutor chain...
  3. Thought: 我需要搜索2022年世界杯的信息
  4. Action: 搜索
  5. Action Input: 2022世界杯
  6. Observation: 2022年世界杯冠军是阿根廷
  7. Thought: 我现在知道答案了
  8. Final Answer: 2022年世界杯冠军是阿根廷
  9. > Finished chain.
  10. 最终答案: 2022年世界杯冠军是阿根廷
  11. === 任务2: 需要计算 ===
  12. > Entering new AgentExecutor chain...
  13. Thought: 这是一个数学计算问题
  14. Action: 计算器
  15. Action Input: (25 + 15) * 3
  16. Observation: 计算结果: 120
  17. Thought: 我得到了计算结果
  18. Final Answer: 120
  19. > Finished chain.
  20. 最终答案: 120
  21. === 任务3: 需要多步推理 ===
  22. > Entering new AgentExecutor chain...
  23. Thought: 需要计算5本书的总价
  24. Action: 计算器
  25. Action Input: 30 * 5
  26. Observation: 计算结果: 150
  27. Thought: 我得到了答案
  28. Final Answer: 买5本书需要150元
  29. > Finished chain.
  30. 最终答案: 买5本书需要150元
复制代码
执行流程
    Thought:分析问题 → “需要搜索最新信息”Action:选择工具 → 搜索Action Input:工具输入 → “2022世界杯”Observation:获取结果 → “2022年世界杯冠军是阿根廷”Final Answer:生成回答
自定义 Tool
  1. from langchain_core.tools import tool
  2. @tooldefquery_database(sql:str)->str:"""执行 SQL 查询并返回结果
  3.    
  4.     Args:
  5.         sql: SQL 查询语句
  6.    
  7.     Returns:
  8.         查询结果的字符串表示
  9.     """# 模拟数据库查询
  10.     mock_db ={"SELECT * FROM users":"用户列表: [张三, 李四, 王五]","SELECT COUNT(*) FROM orders":"订单总数: 1523"}return mock_db.get(sql,f"执行查询: {sql}")# 集成到 Agent
  11. tools =[query_database, search_tool, calculator_tool]
  12. agent = create_react_agent(llm, tools, prompt)
  13. agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
  14. result = agent_executor.invoke({"input":"查询用户列表"})print(f"结果: {result['output']}")
复制代码
执行效果
  1. > Entering new AgentExecutor chain...
  2. Thought: 需要查询数据库
  3. Action: query_database
  4. Action Input: SELECT * FROM users
  5. Observation: 用户列表: [张三, 李四, 王五]
  6. Final Answer: 用户列表包括:张三、李四、王五
  7. > Finished chain.
  8. 结果: 用户列表包括:张三、李四、王五
复制代码
3.3 Memory:对话上下文管理

类比:Session 管理 + Redis 缓存
ConversationBufferMemory(完整历史)
  1. from langchain.memory import ConversationBufferMemory
  2. from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
  3. from langchain_core.output_parsers import StrOutputParser
  4. from langchain_openai import ChatOpenAI
  5. # 1. 创建 Memory
  6. memory = ConversationBufferMemory(
  7.     memory_key="chat_history",
  8.     return_messages=True)# 2. 构建带 Memory 的 Chain
  9. llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
  10. prompt = ChatPromptTemplate.from_messages([("system","你是一个友好的助手,能记住之前的对话内容"),
  11.     MessagesPlaceholder(variable_name="chat_history"),# 历史消息占位符("user","{input}")])
  12. chain = prompt | llm | StrOutputParser()# 3. 对话循环defchat_with_memory(user_input:str):# 加载历史
  13.     history = memory.load_memory_variables({})# 执行对话
  14.     response = chain.invoke({"input": user_input,"chat_history": history.get("chat_history",[])})# 保存到 Memory
  15.     memory.save_context({"input": user_input},{"output": response})return response
  16. # 测试对话print("对话1:", chat_with_memory("我叫张三"))print("对话2:", chat_with_memory("我喜欢编程"))print("对话3:", chat_with_memory("我叫什么名字?"))print("对话4:", chat_with_memory("我的爱好是什么?"))# 查看完整历史print("\n完整对话历史:")print(memory.load_memory_variables({}))
复制代码
执行效果
  1. 对话1: 你好张三!很高兴认识你。
  2. 对话2: 编程是一项很有趣的技能!你主要使用哪种编程语言呢?
  3. 对话3: 你叫张三。
  4. 对话4: 你的爱好是编程。
  5. 完整对话历史:
  6. {'chat_history': [
  7.     HumanMessage(content='我叫张三'),
  8.     AIMessage(content='你好张三!很高兴认识你。'),
  9.     HumanMessage(content='我喜欢编程'),
  10.     AIMessage(content='编程是一项很有趣的技能!你主要使用哪种编程语言呢?'),
  11.     HumanMessage(content='我叫什么名字?'),
  12.     AIMessage(content='你叫张三。'),
  13.     HumanMessage(content='我的爱好是什么?'),
  14.     AIMessage(content='你的爱好是编程。')
  15. ]}
复制代码
ConversationSummaryMemory(摘要压缩)

类比:定期归档旧数据,只保留摘要
  1. from langchain.memory import ConversationSummaryMemory
  2. # 创建摘要 Memory
  3. summary_memory = ConversationSummaryMemory(
  4.     llm=ChatOpenAI(model="gpt-4o-mini"),
  5.     max_token_limit=100# 超过限制自动摘要)# 模拟长对话
  6. conversations =[("我叫张三,是一名软件工程师","你好张三!很高兴认识你这位软件工程师。"),("我在北京工作","北京是个很棒的城市!"),("我喜欢 Python 和 Java","这两门语言都很实用!"),("我最近在学习 LangChain","LangChain 是个很强大的框架!")]for user_msg, ai_msg in conversations:
  7.     summary_memory.save_context({"input": user_msg},{"output": ai_msg})# 查看摘要(而非完整历史)print("对话摘要:")print(summary_memory.load_memory_variables({}))
复制代码
执行效果
  1. 对话摘要:
  2. {'history': '张三是一名在北京工作的软件工程师,喜欢 Python 和 Java,最近在学习 LangChain 框架。'}
复制代码
持久化 Memory(使用文件存储)
  1. from langchain.memory import FileChatMessageHistory, ConversationBufferMemory
  2. # 使用文件持久化(生产环境建议用 Redis/PostgreSQL)
  3. message_history = FileChatMessageHistory("chat_history.json")
  4. persistent_memory = ConversationBufferMemory(
  5.     chat_memory=message_history,
  6.     return_messages=True)# 保存对话
  7. persistent_memory.save_context({"input":"我的用户ID是12345"},{"output":"已记录您的用户ID"})# 重启程序后仍可读取print("持久化历史:", persistent_memory.load_memory_variables({}))
复制代码
执行效果
  1. 持久化历史: {'chat_history': [
  2.     HumanMessage(content='我的用户ID是12345'),
  3.     AIMessage(content='已记录您的用户ID')
  4. ]}
  5. # chat_history.json 文件内容:
  6. [
  7.     {"type": "human", "data": {"content": "我的用户ID是12345"}},
  8.     {"type": "ai", "data": {"content": "已记录您的用户ID"}}
  9. ]
复制代码

四、高级用法:自定义与优化

4.1 自定义 Agent 逻辑
  1. from langchain.agents import BaseSingleActionAgent
  2. from typing import List, Tuple, Any
  3. classCustomAgent(BaseSingleActionAgent):"""自定义 Agent:实现特定业务逻辑"""defplan(
  4.         self,
  5.         intermediate_steps: List[Tuple[Any,str]],**kwargs
  6.     )-> Any:"""决策逻辑:选择下一步行动"""# 自定义决策算法if"搜索"in kwargs["input"]:return AgentAction(tool="search", tool_input=kwargs["input"])else:return AgentFinish(return_values={"output":"无需工具"})asyncdefaplan(self,*args,**kwargs):"""异步版本"""return self.plan(*args,**kwargs)
复制代码
4.2 复杂 RAG 链路

Multi-Query RAG(多查询召回)
  1. from langchain.retrievers import MultiQueryRetriever
  2. # 自动生成多个查询变体
  3. retriever = MultiQueryRetriever.from_llm(
  4.     retriever=base_retriever,
  5.     llm=ChatOpenAI())# 输入:"什么是 RAG?"# 自动生成:["RAG 是什么", "检索增强生成的定义", "RAG 技术原理"]
复制代码
Re-ranking(重排序)
  1. from langchain.retrievers import ContextualCompressionRetriever
  2. from langchain.retrievers.document_compressors import CohereRerank
  3. compressor = CohereRerank(model="rerank-english-v2.0")
  4. compression_retriever = ContextualCompressionRetriever(
  5.     base_compressor=compressor,
  6.     base_retriever=retriever
  7. )
复制代码
4.3 流式输出(实时响应)
  1. from langchain_core.prompts import ChatPromptTemplate
  2. from langchain_core.output_parsers import StrOutputParser
  3. from langchain_openai import ChatOpenAI
  4. import time
  5. llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)# 构建链
  6. chain =(
  7.     ChatPromptTemplate.from_template("写一首关于 {topic} 的五言绝句")| llm
  8.     | StrOutputParser())# 1. 同步流式输出print("=== 同步流式输出 ===")for chunk in chain.stream({"topic":"春天"}):print(chunk, end="", flush=True)
  9.     time.sleep(0.05)# 模拟打字机效果print("\n")# 2. 异步流式输出(高并发场景)import asyncio
  10. asyncdefasync_stream_demo():print("=== 异步流式输出 ===")asyncfor chunk in chain.astream({"topic":"编程"}):print(chunk, end="", flush=True)await asyncio.sleep(0.05)print("\n")# 运行异步示例
  11. asyncio.run(async_stream_demo())# 3. 带 Token 使用统计的流式输出from langchain_core.callbacks import StreamingStdOutCallbackHandler
  12. llm_with_callback = ChatOpenAI(
  13.     model="gpt-4o-mini",
  14.     streaming=True,
  15.     callbacks=[StreamingStdOutCallbackHandler()])
  16. chain_with_callback =(
  17.     ChatPromptTemplate.from_template("用一句话介绍 {concept}")| llm_with_callback
  18.     | StrOutputParser())print("=== 带回调的流式输出 ===")
  19. result = chain_with_callback.invoke({"concept":"LangChain"})print(f"\n完整结果: {result}")
复制代码
执行效果
  1. === 同步流式输出 ===
  2. 春风拂柳绿,
  3. 花开满园香。
  4. 燕归巢中语,
  5. 万物复苏忙。
  6. === 异步流式输出 ===
  7. 代码如诗行,
  8. 逻辑织梦想。
  9. 键盘敲击声,
  10. 创造新世界。
  11. === 带回调的流式输出 ===
  12. LangChain 是一个用于构建基于大语言模型应用的开发框架。
  13. 完整结果: LangChain 是一个用于构建基于大语言模型应用的开发框架。
复制代码
4.4 错误处理与重试
  1. from langchain_core.runnables import RunnableRetry
  2. # 自动重试(类比 Spring Retry)
  3. chain_with_retry = chain.with_retry(
  4.     stop_after_attempt=3,
  5.     wait_exponential_multiplier=1,
  6.     wait_exponential_max=10)# 降级处理
  7. chain_with_fallback = chain.with_fallbacks([backup_chain],
  8.     exceptions_to_handle=(RateLimitError,))
复制代码

五、最佳实践

5.1 性能优化

    批量处理:使用 batch() 减少网络开销异步调用:高并发场景用 ainvoke()缓存:启用 LLM 缓存减少重复调用流式输出:长文本生成用 stream()
5.2 可观测性
  1. from langsmith import Client
  2. # 集成 LangSmith 追踪
  3. client = Client()# 自动记录所有调用链路with client.trace("my_chain"):
  4.     result = chain.invoke(input)
复制代码
5.3 安全性

    输入验证:防止 Prompt 注入工具权限控制:限制 Agent 可调用的 Tools输出过滤:敏感信息脱敏

六、核心概念速查表

概念用途代码示例
Runnable统一接口component.invoke(input)
LCEL管道编排prompt | llm | parser
Chain业务流程LLMChain(llm, prompt)
Agent自主决策create_react_agent(llm, tools)
Tool外部能力@tool def func(): ...
Memory上下文ConversationBufferMemory()
Retriever文档召回vectorstore.as_retriever()

原文地址:https://blog.csdn.net/hsnsnusjs/article/details/160501263
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题
阅读排行更多+

Powered by Discuz! X3.4© 2001-2013 Discuz Team.( 京ICP备17022993号-3 )