LangChain 框架全面指南
1. LangChain 框架概述
LangChain 是一个用于开发由大型语言模型(LLMs)驱动的应用程序的框架,它提供了一系列组件和工具,使开发者能够创建复杂的、交互式的、基于语言模型的应用。
1.1 框架核心理念
LangChain 的设计理念围绕以下几个核心原则:
组件化设计:提供模块化的组件,可以独立使用或组合成复杂的系统
与语言模型的无缝集成:优化与各种语言模型的交互方式
链式处理:允许将多个组件组合成处理管道
状态管理:提供记忆组件以维护对话历史和状态
工具集成:允许语言模型与外部工具和系统交互
1.2 LangChain 表达式语言 (LCEL)
LangChain 表达式语言是一种声明式语言,用于组合 LangChain 的各种组件,具有以下特点:
使用管道操作符 (
|
) 连接组件支持同步和异步操作
内置错误处理和重试机制
支持流式传输和批处理
简化复杂链的构建过程
示例:
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
prompt = ChatPromptTemplate.from_template("讲一个关于{topic}的笑话")
model = ChatOpenAI()
output_parser = StrOutputParser()
chain = prompt | model | output_parser
result = chain.invoke({"topic": "人工智能"})
2. LangChain 核心组件
LangChain 框架由多个核心组件构成,每个组件负责特定的功能:
2.1 模型 (Models)
模型组件是 LangChain 的核心,包括语言模型和嵌入模型:
2.1.1 语言模型 (LLMs/Chat Models)
LLM:文本输入,文本输出的模型(如 GPT-3.5, Llama 2)
ChatModel:结构化输入(消息),结构化输出的模型(如ChatGPT, Claude)
示例:
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
# 传统LLM
llm = OpenAI(temperature=0)
result = llm.predict("一个 AI 走进了酒吧...")
# 聊天模型
chat_model = ChatOpenAI(temperature=0)
messages = [
SystemMessage(content="你是一个有幽默感的助手"),
HumanMessage(content="讲一个 AI 笑话")
]
response = chat_model.predict_messages(messages)
2.1.2 嵌入模型 (Embeddings)
嵌入模型将文本转换为数值向量,用于语义搜索和其他相似性比较:
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vector = embeddings.embed_query("Hello world")
2.2 提示模板 (Prompts)
提示模板用于构建结构化的提示:
PromptTemplate:构建简单的文本提示
ChatPromptTemplate:构建聊天消息格式的提示
支持变量和条件逻辑:动态构建提示
示例:
from langchain.prompts import PromptTemplate, ChatPromptTemplate
# 基本提示模板
template = "给我提供关于{topic}的摘要,长度约{length}个字"
prompter = PromptTemplate.from_template(template)
prompt = prompter.format(topic="量子计算", length="100")
# 聊天提示模板
template = "你是{role},请回答关于{topic}的问题"
chat_prompter = ChatPromptTemplate.from_messages([
("system", template),
("human", "{question}")
])
2.3 记忆 (Memory)
记忆组件用于管理对话历史或持久状态:
ConversationBufferMemory:存储完整对话历史
ConversationSummaryMemory:存储对话摘要以节省空间
VectorStoreRetrieverMemory:使用向量存储实现的语义记忆
示例:
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=ChatOpenAI(),
memory=memory,
verbose=True
)
conversation.predict(input="你好,我叫王小明")
conversation.predict(input="你记得我的名字吗?")
2.4 检索 (Retrievers)
检索组件用于从各种数据源获取相关信息:
向量存储检索:基于语义相似度检索文档
多查询检索:使用多个不同查询增强检索结果
上下文压缩检索:删减不相关内容以优化上下文窗口
示例:
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
# 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(["内容1", "内容2", "内容3"], embeddings)
# 基本检索器
retriever = vectorstore.as_retriever()
# 上下文压缩检索器
compressor = LLMChainExtractor.from_llm(ChatOpenAI())
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=retriever
)
2.5 输出解析器 (Output Parsers)
输出解析器将语言模型的输出转换为结构化的格式:
PydanticOutputParser:解析为 Pydantic 模型
StrOutputParser:提取纯文本输出
JsonOutputParser:解析 JSON 格式输出
示例:
from langchain.output_parsers import PydanticOutputParser
from pydantic import BaseModel, Field
from typing import List
class Movie(BaseModel):
title: str = Field(description="电影标题")
director: str = Field(description="导演姓名")
year: int = Field(description="上映年份")
class MovieList(BaseModel):
movies: List[Movie] = Field(description="电影列表")
parser = PydanticOutputParser(pydantic_object=MovieList)
3. 单智能体系统
3.1 智能体架构
智能体系统是 LangChain 中的高级组件,允许语言模型使用工具并进行推理。智能体架构包括:
智能体 (Agent):决定下一步行动的语言模型
工具 (Tools):智能体可以使用的函数
执行器 (AgentExecutor):协调智能体与工具之间的交互
3.2 主要智能体类型
3.2.1 ReAct 智能体
ReAct(Reasoning + Acting)智能体结合了推理和行动的能力,是最常用的智能体类型之一。
特点:
结合推理(思考)和行动的能力
提供中间推理步骤
支持"链式思考"过程
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.chat_models import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain_community.utilities import WikipediaAPIWrapper
# 创建工具
wikipedia = WikipediaAPIWrapper()
tools = [Tool(name="维基百科", func=wikipedia.run, description="用于查询信息的工具")]
# 创建LLM
llm = ChatOpenAI(temperature=0)
# 创建记忆组件
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 初始化ReAct智能体
agent = initialize_agent(
tools,
llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
verbose=True,
memory=memory
)
3.2.2 OpenAI函数智能体
OpenAI函数智能体利用OpenAI模型的函数调用能力,提供更结构化的工具使用方式。
特点:
基于OpenAI的函数调用API
工具调用更加可靠
减少解析错误和幻觉
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.chat_models import ChatOpenAI
# 创建工具
tools = [Tool(name="计算器", func=lambda x: eval(x), description="用于数学计算")]
# 创建OpenAI函数智能体
llm = ChatOpenAI(temperature=0)
agent = initialize_agent(
tools,
llm,
agent=AgentType.OPENAI_FUNCTIONS,
verbose=True
)
4. 多智能体系统
4.1 多智能体编排模式
4.1.1 团队监督者模式
团队监督者模式使用一个监督者智能体协调多个专家智能体,类似于团队领导与成员的关系。
核心特性:
一个监督者智能体协调多个专家智能体
任务分解与分配
结果整合和协调
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# 创建专家智能体
researcher = initialize_agent(...) # 研究员智能体
coder = initialize_agent(...) # 编码员智能体
critic = LLMChain(...) # 评论员智能体
# 创建监督者
supervisor_prompt = PromptTemplate(template="...", input_variables=[...])
supervisor = LLMChain(llm=ChatOpenAI(), prompt=supervisor_prompt)
# 执行工作流
def run_workflow(task):
# 1. 监督者制定计划
plan = supervisor.run(task=task)
# 2. 研究员收集信息
research_result = researcher.run(task)
# 3. 编码员实现解决方案
code_solution = coder.run(f"{task}\n{research_result}")
# 4. 评论员评估解决方案
critique = critic.run(solution=code_solution)
# 5. 监督者整合结果
final_solution = supervisor.run(results=[research_result, code_solution, critique])
return final_solution
4.1.2 经理-工人模式
经理-工人模式中,一个经理智能体分配和协调任务,多个工人智能体执行具体工作。
核心特性:
层级结构的任务分配
经理智能体负责规划和监督
工人智能体负责执行具体任务
# 经理-工人模式需要自定义实现,基本逻辑如下:
# 1. 创建经理智能体
manager_agent = create_manager_agent()
# 2. 创建多个工人智能体
worker_agents = create_worker_agents()
# 3. 实现工作流
def manager_worker_workflow(task):
# 经理分解任务
subtasks = manager_agent.plan_task(task)
# 分配任务给工人
results = {}
for subtask in subtasks:
worker = select_appropriate_worker(subtask, worker_agents)
results[subtask.id] = worker.execute(subtask)
# 经理整合结果
final_result = manager_agent.integrate_results(results)
return final_result
4.1.3 计划执行模式
计划执行模式中,一个智能体负责规划,另一个负责执行,适用于需要精确规划的复杂任务。
核心特性:
明确的规划-执行分离
规划者智能体设计详细计划
执行者智能体负责实施计划
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.agents import initialize_agent
# 创建规划者智能体
planner_prompt = PromptTemplate(template="...", input_variables=["task"])
planner = LLMChain(llm=ChatOpenAI(), prompt=planner_prompt)
# 创建执行者智能体
executor = initialize_agent(...)
# 执行计划-执行模式
def plan_execute_workflow(task):
# 1. 制定计划
plan = planner.run(task=task)
# 2. 执行计划
execution_result = executor.run(f"根据以下计划执行任务:\n任务: {task}\n计划:\n{plan}")
return execution_result
4.2 多智能体通信协议
多智能体系统中,智能体之间需要有效沟通:
消息格式化:定义结构化消息格式
状态共享:共享任务状态和进度
冲突解决:处理不同智能体之间的意见分歧
示例 (使用消息格式):
from typing import Dict, List, Any
class Message:
def __init__(self, sender: str, receiver: str, content: str, message_type: str, metadata: Dict[str, Any] = None):
self.sender = sender
self.receiver = receiver
self.content = content
self.message_type = message_type # request, response, update等
self.metadata = metadata or {}
# 消息传递函数
def send_message(message: Message, agents: Dict[str, Any]):
if message.receiver in agents:
return agents[message.receiver].process_message(message)
return None
5. 搜索与智能体集成
5.1 检索增强生成(RAG)与智能体结合
RAG系统可以增强智能体的知识,为其提供更多相关信息。
实现方法:
5.1.1 RAG作为工具
智能体可以将RAG系统作为一个工具来使用:
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.agents import AgentType, initialize_agent, Tool
from langchain.chat_models import ChatOpenAI
# 创建RAG系统
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000)
chunks = text_splitter.split_documents(documents)
vectorstore = FAISS.from_documents(chunks, OpenAIEmbeddings())
retriever = vectorstore.as_retriever()
# 创建RAG查询工具
def query_knowledge_base(query):
docs = retriever.get_relevant_documents(query)
return "\n\n".join(doc.page_content for doc in docs)
# 将RAG作为智能体工具
rag_tool = Tool(
name="知识库查询",
func=query_knowledge_base,
description="当你需要查询专业知识时使用此工具"
)
# 创建使用RAG工具的智能体
agent = initialize_agent(
tools=[rag_tool],
llm=ChatOpenAI(),
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
5.1.2 上下文增强
在智能体处理之前使用RAG增强提示:
# 先检索相关文档
query = "量子计算的应用场景?"
docs = retriever.get_relevant_documents(query)
context = "\n\n".join(doc.page_content for doc in docs)
# 创建增强的提示
enhanced_prompt = f"基于以下信息回答问题。\n\n信息: {context}\n\n问题: {query}"
# 创建智能体并使用增强提示
agent = initialize_agent(...)
result = agent.run(enhanced_prompt)
5.2 高级搜索技术
5.2.1 混合检索
混合检索结合多种检索策略,提高相关性和准确性:
from langchain.retrievers import EnsembleRetriever
from langchain.vectorstores import FAISS
from langchain_community.retrievers import BM25Retriever
# 创建向量检索器
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# 创建关键词检索器
keyword_retriever = BM25Retriever.from_documents(documents)
# 创建集成检索器
ensemble_retriever = EnsembleRetriever(
retrievers=[vector_retriever, keyword_retriever],
weights=[0.7, 0.3]
)
# 获取混合检索结果
docs = ensemble_retriever.get_relevant_documents(query)
5.2.2 上下文压缩
上下文压缩技术可以优化检索结果,提取最相关内容:
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
# 创建基本检索器
retriever = vectorstore.as_retriever()
# 创建压缩器
compressor = LLMChainExtractor.from_llm(ChatOpenAI())
# 创建上下文压缩检索器
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=retriever
)
# 获取压缩后的检索结果
compressed_docs = compression_retriever.get_relevant_documents(query)
5.2.3 查询重写
使用语言模型改进原始查询以提高检索质量:
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
# 创建查询重写器
rewriter_prompt = PromptTemplate(
input_variables=["query"],
template="请将以下查询重写为更有效的搜索查询,以便于在知识库中检索信息:\n\n{query}\n\n改进后的查询:"
)
rewriter = LLMChain(llm=ChatOpenAI(), prompt=rewriter_prompt)
# 重写查询
original_query = "量子计算机什么时候能实用化?"
improved_query = rewriter.run(original_query)
# 使用改进后的查询
docs = retriever.get_relevant_documents(improved_query)
6. 多智能体工作流设计模式
6.1 研究-规划-执行模式
这种模式将工作流分为三个阶段:研究、规划和执行,由不同专长的智能体负责。
工作流程:
研究阶段: 研究智能体收集和分析信息
规划阶段: 规划智能体基于研究结果制定计划
执行阶段: 执行智能体实施计划并完成任务
from langchain.agents import initialize_agent
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
# 创建研究智能体
research_agent = initialize_agent(
[search_tool, knowledge_tool],
ChatOpenAI(temperature=0),
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 创建规划智能体
planner_prompt = PromptTemplate(
template="基于以下研究结果,为解决{task}制定详细计划:\n\n{research_results}\n\n详细计划:",
input_variables=["task", "research_results"]
)
planner = LLMChain(llm=ChatOpenAI(temperature=0), prompt=planner_prompt)
# 创建执行智能体
execution_agent = initialize_agent(
[code_tool, calculator_tool, api_tool],
ChatOpenAI(temperature=0),
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 执行工作流
def research_plan_execute_workflow(task):
# 1. 研究阶段
research_results = research_agent.run(f"收集关于{task}的所有必要信息")
# 2. 规划阶段
plan = planner.run(task=task, research_results=research_results)
# 3. 执行阶段
result = execution_agent.run(f"按照以下计划执行任务:\n\nTask: {task}\n\n计划:\n{plan}\n\n研究信息:\n{research_results}")
return result
6.2 分析-创建-评估模式
这种模式适合创造性任务,包含问题分析、创建解决方案和评估改进三个阶段。
工作流程:
分析阶段: 分析智能体理解问题和需求
创建阶段: 创造智能体生成解决方案
评估阶段: 评估智能体检查和改进解决方案
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
# 创建分析智能体
analysis_prompt = PromptTemplate(
template="深入分析以下问题,确定关键需求、约束条件和成功标准:\n\n{problem}\n\n详细分析:",
input_variables=["problem"]
)
analyzer = LLMChain(llm=ChatOpenAI(temperature=0), prompt=analysis_prompt)
# 创建创造智能体
creation_prompt = PromptTemplate(
template="基于以下分析,为问题{problem}创建解决方案:\n\n分析:\n{analysis}\n\n创新解决方案:",
input_variables=["problem", "analysis"]
)
creator = LLMChain(llm=ChatOpenAI(temperature=0.7), prompt=creation_prompt)
# 创建评估智能体
evaluation_prompt = PromptTemplate(
template="评估以下解决方案,指出优点、缺点和改进建议:\n\n问题: {problem}\n\n分析:\n{analysis}\n\n解决方案:\n{solution}\n\n详细评估:",
input_variables=["problem", "analysis", "solution"]
)
evaluator = LLMChain(llm=ChatOpenAI(temperature=0), prompt=evaluation_prompt)
# 执行工作流
def analyze_create_evaluate_workflow(problem):
# 1. 分析阶段
analysis = analyzer.run(problem=problem)
# 2. 创建阶段
solution = creator.run(problem=problem, analysis=analysis)
# 3. 评估阶段
evaluation = evaluator.run(problem=problem, analysis=analysis, solution=solution)
# 4. 返回完整结果
return {
"analysis": analysis,
"solution": solution,
"evaluation": evaluation
}
6.3 协作迭代模式
多个智能体并行工作,定期同步和迭代改进解决方案。
工作流程:
问题分解: 将任务分解为可并行处理的部分
并行工作: 多个智能体同时处理不同子任务
同步协调: 定期交流和整合进展
迭代改进: 基于反馈不断调整和优化
from langchain.chat_models import ChatOpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from concurrent.futures import ThreadPoolExecutor
# 创建任务分解器
decomposer_prompt = PromptTemplate(
template="将以下任务分解为可以并行处理的子任务:\n\n任务: {task}\n\n子任务列表 (JSON格式):",
input_variables=["task"]
)
decomposer = LLMChain(llm=ChatOpenAI(temperature=0), prompt=decomposer_prompt)
# 创建协调器
coordinator_prompt = PromptTemplate(
template="基于以下子任务的处理结果,协调并整合信息:\n\n子任务结果:\n{subtask_results}\n\n整合后的结果:",
input_variables=["subtask_results"]
)
coordinator = LLMChain(llm=ChatOpenAI(temperature=0), prompt=coordinator_prompt)
# 创建工作者(可使用不同的专业智能体)
def create_worker(worker_name):
worker_prompt = PromptTemplate(
template="你是专门负责{worker_name}的专家。处理以下子任务并给出结果:\n\n{subtask}\n\n详细结果:",
input_variables=["worker_name", "subtask"]
)
return LLMChain(llm=ChatOpenAI(temperature=0.2), prompt=worker_prompt)
# 执行协作迭代工作流
def collaborative_workflow(task, num_iterations=3):
# 分解任务
subtasks_json = decomposer.run(task=task)
subtasks = json.loads(subtasks_json)
# 创建专家工作者
workers = {
"研究": create_worker("研究"),
"设计": create_worker("设计"),
"实现": create_worker("实现"),
"测试": create_worker("测试")
}
# 执行多轮迭代
results = {}
for iteration in range(num_iterations):
print(f"执行第 {iteration+1} 轮迭代")
# 并行处理子任务
iteration_results = {}
with ThreadPoolExecutor() as executor:
futures = {}
for i, subtask in enumerate(subtasks):
worker_name = list(workers.keys())[i % len(workers)]
futures[executor.submit(workers[worker_name].run, worker_name=worker_name, subtask=subtask)] = i
for future in futures:
idx = futures[future]
iteration_results[idx] = future.result()
# 协调和整合结果
subtask_results = "\n\n".join([f"子任务 {k}: {v}" for k, v in iteration_results.items()])
if iteration < num_iterations - 1:
feedback = coordinator.run(subtask_results=subtask_results)
print(f"第 {iteration+1} 轮反馈: {feedback}")
# 更新子任务,加入反馈
subtasks = [f"{subtask}\n\n前一轮反馈: {feedback}" for subtask in subtasks]
else:
# 最后一轮,生成最终结果
final_result = coordinator.run(subtask_results=subtask_results)
results = final_result
return results
7. 最佳实践与优化技巧
7.1 智能体设计原则
明确角色和职责: 每个智能体应有明确的专长和任务范围
提供足够上下文: 智能体需要充分的背景信息来做出决策
设计适当的提示: 提示模板直接影响智能体的效果
错误处理机制: 添加错误检测和恢复机制
循环避免: 防止智能体陷入无限循环
7.2 多智能体协作优化
有效的通信协议: 定义智能体间交流的格式和规则
任务分解粒度: 适当的任务分解粒度可提高效率
结果整合机制: 设计合理的结果整合和冲突解决方案
监控和干预: 实现监控机制,必要时允许人类干预
7.3 性能优化
批量处理: 尽可能批量处理查询以减少API调用
缓存机制: 缓存常用查询和中间结果
异步处理: 使用异步API减少等待时间
选择合适的模型: 根据任务复杂度选择合适的底层模型
8. 结论
LangChain提供了一个强大的框架,用于构建基于大语言模型的应用程序。通过组合模型、提示工程、记忆系统、检索组件和输出解析器等核心组件,开发者可以创建功能丰富的智能应用。从单一智能体到复杂的多智能体编排,从基本的问答系统到搜索增强的数据处理系统,LangChain提供了灵活而强大的工具集。
随着框架的不断发展,我们可以期待更多的组件、更高效的编排模式和更强大的功能。通过理解和应用本文介绍的各种模式和技术,开发者可以充分发挥大语言模型的潜力,构建解决实际问题的智能应用。
参考资料
LangChain 官方文档: https://python.langchain.com/docs/introduction/
LangChain GitHub 仓库: https://github.com/langchain-ai/langchain
LangChain 示例集: https://python.langchain.com/docs/use_cases/
LangChain 集成: https://python.langchain.com/docs/integrations/
- 感谢你赐予我前进的力量