一、核心问题:为什么需要LangChain?
在LangChain出现之前,我们使用大语言模型(LLM)的方式可能是这样的:
# 伪代码:传统的、硬编码的LLM使用方式
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "user", "content": "请问上海的房价怎么样?"}
]
)
print(response.choices[0].message.content)
这种模式存在几个严重问题:
- 提示词硬编码:业务逻辑和提示词模板耦合在一起,难以维护
- 无状态性:无法进行多轮对话,缺乏上下文管理
- 功能单一:无法连接外部数据源、工具和系统
- 流程僵化:复杂的推理流程需要大量胶水代码
LangChain的解决思路:将LLM应用开发“工程化”,提供一套标准化的组件和设计模式,就像Spring框架之于Java开发。
二、LangChain核心架构:六大组件深入解析
1. 模型I/O(Model I/O) - 统一接口层
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
# 统一的多模型接口
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 提示词模板化(避免硬编码)
from langchain.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("请用{style}的风格回答:{question}")
formatted_prompt = prompt.format(style="幽默", question="什么是机器学习?")
# 标准化输出解析
from langchain.schema import BaseOutputParser
class CommaSeparatedListOutputParser(BaseOutputParser):
def parse(self, text: str):
return [item.strip() for item in text.split(",")]
response = llm.invoke(formatted_prompt)
result = CommaSeparatedListOutputParser().parse(response.content)
设计价值:实现了业务逻辑与具体模型、提示词格式的解耦。
2. 数据连接(Data Connection) - 知识库集成
这是LangChain最核心的价值之一,解决了LLM的“知识时效性”和“领域特异性”问题。
# 文档加载与分割
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
loader = PyPDFLoader("行业报告.pdf")
documents = loader.load()
# 智能文本分割(保持语义完整性)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200, # 重叠避免上下文断裂
separators=["\n\n", "\n", "。", "!", "?", ";"] # 中文友好分隔符
)
chunks = text_splitter.split_documents(documents)
# 向量化存储
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)
# 语义检索
retriever = vectorstore.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={"score_threshold": 0.8, "k": 3} # 相关性阈值+TopK
)
关键技术点:
- 分块策略:直接影响检索质量,需要根据文档类型调整
- 向量检索:使用余弦相似度等算法找到最相关文本片段
- RAG架构:Retrieval-Augmented Generation,增强模型的知识能力
3. 链(Chains) - 业务流程编排
链是LangChain的灵魂,实现了复杂的推理流程。
from langchain.chains import SequentialChain
# 定义子链1:分析用户意图
intent_chain = LLMChain(
llm=llm,
prompt=ChatPromptTemplate.from_template("分析用户query的意图:{query}"),
output_key="intent"
)
# 定义子链2:根据意图生成回答
response_chain = LLMChain(
llm=llm,
prompt=ChatPromptTemplate.from_template("根据意图{intent}回答问题:{query}"),
output_key="response"
)
# 组合链(类似工作流引擎)
overall_chain = SequentialChain(
chains=[intent_chain, response_chain],
input_variables=["query"],
output_variables=["intent", "response"]
)
result = overall_chain.invoke({"query": "帮我推荐适合初学者的机器学习课程"})
高级模式:
- RouterChain:根据内容路由到不同的子链
- TransformChain:在链之间进行数据转换
4. 记忆(Memory) - 对话状态管理
from langchain.memory import ConversationBufferWindowMemory
# 带窗口的记忆(避免上下文过长)
memory = ConversationBufferWindowMemory(
k=5, # 保留最近5轮对话
return_messages=True,
memory_key="chat_history"
)
# 在链中使用记忆
from langchain.chains import ConversationChain
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True # 调试模式
)
# 多轮对话保持上下文
response1 = conversation.invoke("我喜欢Python编程")
response2 = conversation.invoke("刚才我说喜欢什么编程语言?") # 模型记得是Python
记忆类型:
ConversationSummaryMemory:摘要式记忆,适合长对话EntityMemory:实体记忆,记住特定实体信息VectorStoreMemory:向量存储记忆,支持大规模历史记录
5. 代理(Agents) - 工具使用与自主行动
这是LangChain最强大的特性,让LLM能够使用工具、执行动作。
from langchain.agents import AgentType, initialize_agent, Tool
from langchain_community.utilities import SerpAPIWrapper
# 定义工具集
search = SerpAPIWrapper()
tools = [
Tool(
name="网络搜索",
func=search.run,
description="用于搜索最新信息和实时数据"
),
Tool(
name="计算器",
func=lambda x: str(eval(x)), # 简单计算
description="用于数学计算"
)
]
# 创建代理(类似AI助手)
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, # 推理+行动循环
verbose=True,
handle_parsing_errors=True
)
# 代理自动选择工具解决问题
result = agent.invoke("特斯拉当前股价是多少?比去年同期涨了多少百分比?")
执行过程:
- 思考:我需要先获取特斯拉当前股价和一年前股价
- 行动:调用“网络搜索”工具搜索最新股价
- 观察:得到当前股价250,一年前股价180
- 思考:计算涨幅百分比:(250-180)/180 * 100%
- 行动:调用“计算器”工具计算具体数值
- 最终回答:特斯拉股价同比上涨约38.9%
6. 回调(Callbacks) - 可观测性与监控
from langchain.callbacks import FileCallbackHandler
import logging
# 日志记录
logging.basicConfig(level=logging.INFO, filename="langchain.log")
file_handler = FileCallbackHandler("langchain_verbose.log")
# 在链中启用回调
chain = ConversationChain(
llm=llm,
memory=memory,
callbacks=[file_handler],
verbose=True
)
三、高级架构模式
1. RAG优化架构
# 高级RAG:重排序+多路召回
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
# 重排序提升精度
compressor = CrossEncoderReranker(model="BAAI/bge-reranker-large")
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=vectorstore.as_retriever()
)
2. 智能路由架构
# 根据问题类型路由到不同的处理链
from langchain.chains.router import MultiRouteChain
route_chains = {
"technical": tech_chain, # 技术问题链
"business": biz_chain, # 业务问题链
"general": general_chain # 通用问题链
}
router_chain = MultiRouteChain.from_llm(llm, route_chains)
四、生产级最佳实践
1. 错误处理与重试
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def reliable_llm_call(prompt):
try:
return llm.invoke(prompt)
except Exception as e:
logger.error(f"LLM调用失败: {e}")
raise
2. 性能优化
# 批量处理提升吞吐量
from langchain.chains import TransformChain
batch_chain = TransformChain(
input_variables=["documents"],
output_variables=["processed_docs"],
transform=process_documents_batch # 批量处理函数
)
3. 安全与合规
# 内容审查链
safety_chain = SequentialChain(
chains=[content_filter_chain, sentiment_analysis_chain, main_chain],
input_variables=["query"]
)
五、总结:LangChain的价值定位
LangChain本质上是一个LLM应用开发框架,其核心价值在于:
- 工程化:将提示词工程、工作流编排、状态管理等标准化
- 组件化:提供可复用的模块,避免重复造轮子
- 生产就绪:解决实际业务中的状态管理、工具调用、知识增强等问题
- 生态整合:集成了大量第三方工具和数据源
适用场景:
- 复杂对话系统(客服、助手)
- 知识库问答(RAG应用)
- 自动化工作流(数据分析、报告生成)
- 多智能体系统(模拟、游戏NPC)
学习建议:从具体的业务场景出发,先理解单个组件的用法,再逐步组合成完整的应用。LangChain的学习曲线相对陡峭,但一旦掌握,能够极大提升LLM应用的开发效率和质量。
1934

被折叠的 条评论
为什么被折叠?



