在大语言模型(Large Language Model, LLM)应用开发领域,许多开发者最初都怀揣着美好的愿景:只需调用OpenAI或其他厂商的API,就能轻松构建出功能强大的AI应用。然而现实往往比理想骨感得多。当真正投入开发后,开发者们很快会面临一系列令人头疼的问题。
想象你正在开发一个客服聊天机器人。用户第一次询问:"我的订单状态如何?"你让用户提供了订单号,模型正确返回了订单信息。但当用户接着问"预计什么时候能送达?"时,模型却回复:"请先提供您的订单号"。这种"健忘"行为会让用户体验极其糟糕。
传统解决方案是手动管理对话历史:
python复制conversation_history = []
def ask_llm(user_input):
conversation_history.append({"role": "user", "content": user_input})
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=conversation_history
)
assistant_reply = response.choices[0].message.content
conversation_history.append({"role": "assistant", "content": assistant_reply})
return assistant_reply
这种方案存在明显缺陷:
当需要LLM调用外部工具(如搜索引擎、数据库)时,传统方式需要开发者:
这种硬编码的集成方式极其脆弱,添加新工具需要修改多处代码,维护成本呈指数级增长。
不同LLM提供商的API设计差异显著。从OpenAI切换到Claude时,开发者需要:
这种高切换成本使得多模型策略变得难以实施。
LLM会"自信地"生成看似合理实则错误的信息。在金融、医疗等严谨场景,这种幻觉可能造成严重后果。虽然可以通过Prompt工程(如添加"如果你不确定,请说不知道")部分缓解,但效果有限且不可靠。
当LLM应用出现异常行为时,传统调试方式包括:
编排框架(如LangChain)通过组件化设计解决了上述痛点:
这种架构使得开发者可以专注于业务逻辑而非基础设施,显著提升开发效率和系统可维护性。
LangChain采用了"乐高积木"式的设计理念:
这种设计与传统OOP的继承体系形成鲜明对比。在继承体系中,添加新功能通常需要扩展类层次结构,导致代码僵化。而组合方式则保持了系统的灵活性和可扩展性。
LangChain将AI模型抽象为三类:
这种抽象使得切换模型只需修改配置,无需重写业务逻辑:
python复制# 使用OpenAI
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4")
# 切换到Claude
from langchain_anthropic import ChatAnthropic
llm = ChatAnthropic(model="claude-3-opus")
# 调用方式完全一致
response = llm.invoke("Hello world")
LangChain的Prompt模板解决了传统字符串拼接的痛点:
python复制from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位专业的{subject}导师"),
("user", "请用{style}风格解释:{question}")
])
formatted = prompt.invoke({
"subject": "物理学",
"style": "幽默",
"question": "什么是量子纠缠?"
})
Chain是LangChain的核心抽象,它将多个组件串联成执行流水线。常见的Chain类型包括:
python复制from langchain.chains import LLMChain, SimpleSequentialChain
# 定义总结链
summary_prompt = ChatPromptTemplate.from_template("总结这段文本:{text}")
summary_chain = LLMChain(llm=llm, prompt=summary_prompt)
# 定义翻译链
translate_prompt = ChatPromptTemplate.from_template("翻译成英文:{text}")
translate_chain = LLMChain(llm=llm, prompt=translate_prompt)
# 组合两个链
pipeline = SimpleSequentialChain(
chains=[summary_chain, translate_chain],
verbose=True
)
result = pipeline.run("长文本内容...")
Agent是LangChain最强大的功能,它赋予LLM使用工具、自主决策的能力。其工作流程为:
python复制from langchain.agents import create_react_agent
@tool
def search(query: str) -> str:
"""搜索网络信息"""
return "搜索结果..."
@tool
def calculate(expr: str) -> str:
"""执行数学计算"""
return eval(expr)
agent = create_react_agent(llm, [search, calculate])
response = agent.invoke({
"input": "特斯拉当前股价是多少?如果我有100股,总价值多少?"
})
LangChain应用中的数据流动遵循清晰的生命周期:
这种架构确保了各组件职责单一,便于调试和扩展。
推荐使用分层依赖安装:
bash复制# 核心包(必须)
pip install langchain-core
# 模型集成(按需选择)
pip install langchain-openai langchain-anthropic
# 工具集成
pip install langchain-community
# 调试部署
pip install langsmith langserve
绝对避免硬编码API密钥!推荐方案:
bash复制export OPENAI_API_KEY="sk-xxx"
python复制from dotenv import load_dotenv
load_dotenv() # 加载.env文件
下面是一个集成了网络搜索、文档处理和多步推理的复杂Agent实现:
python复制from langchain import hub
from langchain.agents import AgentExecutor, create_react_agent
from langchain_community.tools import WikipediaQueryRun
from langchain_community.utilities import ArxivAPIWrapper
from langchain_openai import ChatOpenAI
# 初始化工具
arxiv = ArxivAPIWrapper()
wikipedia = WikipediaQueryRun()
tools = [
{
"name": "arxiv",
"func": lambda query: arxiv.run(query),
"description": "查询arXiv学术论文"
},
{
"name": "wikipedia",
"func": lambda query: wikipedia.run(query),
"description": "查询维基百科知识"
}
]
# 创建Agent
prompt = hub.pull("hwchase17/react-chat")
llm = ChatOpenAI(model="gpt-4", temperature=0)
agent = create_react_agent(llm, tools, prompt)
# 执行查询
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = agent_executor.invoke({
"input": "请比较Transformer和CNN在计算机视觉领域的优缺点,并列举3篇相关论文"
})
python复制from langchain.cache import InMemoryCache
langchain.llm_cache = InMemoryCache()
python复制# 同时处理多个输入
inputs = [{"text": "文本1"}, {"text": "文本2"}]
results = chain.batch(inputs)
python复制for chunk in chain.stream({"input": "问题"}):
print(chunk, end="", flush=True)
python复制async def run_chain():
result = await chain.ainvoke({"input": "问题"})
python复制from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
memory.save_context({"input": "你好"}, {"output": "你好!有什么可以帮您?"})
python复制from langchain.memory import ConversationSummaryMemory
memory = ConversationSummaryMemory(llm=llm)
python复制from langchain.memory import VectorStoreRetrieverMemory
from langchain_community.vectorstores import FAISS
vectorstore = FAISS.from_texts([], embedding_model)
memory = VectorStoreRetrieverMemory(retriever=vectorstore.as_retriever())
对于生产系统,推荐:
对于需要条件逻辑、循环等复杂流程,可以使用LangGraph:
python复制from langgraph.graph import Graph
workflow = Graph()
# 定义节点
workflow.add_node("search", search_tool)
workflow.add_node("analyze", analysis_chain)
# 定义边
workflow.add_edge("search", "analyze")
# 设置入口点
workflow.set_entry_point("search")
# 编译执行
app = workflow.compile()
result = app.invoke({"query": "最新AI研究进展"})
bash复制export LANGSMITH_API_KEY=ls_xxx
export LANGSMITH_PROJECT="my-project"
LangChain v0.1+进行了重大重构,主要变化包括:
包拆分:
langchain-core:核心接口langchain-community:第三方集成langchain-openai:OpenAI专用集成API变更:
LLMChain → RunnableSequenceAgentExecutor初始化方式变更迁移建议:
langchain.compat)python复制from langchain.retrievers import WikipediaRetriever
retriever = WikipediaRetriever()
chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
python复制validation_prompt = ChatPromptTemplate.from_messages([
("system", "验证以下回答是否基于提供的上下文。如果不是,回答'信息不足'"),
("user", "上下文:{context}\n\n问题:{question}\n\n回答:{answer}")
])
validation_chain = validation_prompt | llm | StrOutputParser()
python复制llm = ChatOpenAI(timeout=30, max_retries=2)
LangSmith提供了企业级的监控能力:
追踪查看器:
数据集管理:
评估工具:
将LangChain应用部署为生产API的最佳实践:
python复制from fastapi import FastAPI
from langserve import add_routes
app = FastAPI()
add_routes(app, chain, path="/chat")
python复制add_routes(
app,
chain,
path="/chat",
input_type=ChatInput, # 自定义输入类型
output_type=ChatOutput, # 自定义输出类型
middleware=[AuthMiddleware] # 认证中间件
)
对于需要条件分支、循环等复杂逻辑的场景:
python复制from langgraph.graph import Graph
workflow = Graph()
# 定义节点
workflow.add_node("generate", generation_chain)
workflow.add_node("validate", validation_chain)
workflow.add_node("correct", correction_chain)
# 定义条件边
def should_validate(state):
return state.get("needs_validation", False)
workflow.add_conditional_edges(
"generate",
should_validate,
{
True: "validate",
False: END
}
)
# 设置入口点
workflow.set_entry_point("generate")
生产级LangChain应用推荐采用分层架构:
接入层:
业务逻辑层:
数据层:
基础设施层:
将不同功能拆分为独立服务:
python复制llm = ChatOpenAI(max_retries=3, retry_min_seconds=1, retry_max_seconds=10)
降级策略:
超时控制:
python复制chain = chain.with_config(run_name="MyChain", max_execution_time=30)
整合图像、音频等多模态能力:
python复制from langchain_community.tools import ImageCaptioningTool
multimodal_agent = initialize_agent(
tools=[ImageCaptioningTool()],
llm=llm,
agent_type="structured-chat-react"
)
使用RL优化Agent决策:
python复制from langchain.experimental.rl_chain import RLChain
rl_chain = RLChain(
base_chain=chain,
reward_fn=lambda inputs, outputs: calculate_reward(outputs),
update_interval=100
)
在移动设备、IoT设备上运行轻量级Chain:
python复制from langchain.mobile import CoreMLChain
coreml_chain = CoreMLChain.from_pretrained("distilled-model.mlmodel")