LangChain基础:构建LLM应用的核心框架
--- title: "LangChain基础:构建LLM应用的核心框架" description: "系统学习LangChain的核心组件、链式调用和代理机制,掌握LLM应用开发的完整流程" tags: ["LangChain", "LLM应用", "Chain", "Agent"] category: "llm" icon: "🧠"
LangChain基础:构建LLM应用的核心框架
LangChain简介
LangChain是一个用于开发LLM驱动应用的开源框架。它提供了一套完整的工具链,帮助开发者将大语言模型与外部数据源、API和工具集成,构建强大的AI应用。LangChain的设计理念是"可组合性",允许开发者像搭积木一样组合各种组件。
LangChain的核心组件:
- Models:统一的LLM和Chat模型接口
- Prompts:模板化的提示词管理
- Chains:组件间的链式调用
- Memory:对话历史管理
- Agents:基于LLM的决策代理
- Retrievers:文档检索组件
安装与配置
# 安装LangChain核心
pip install langchain
# 安装常用集成
pip install langchain-openai langchain-community langchain-chroma
# 设置环境变量
export OPENAI_API_KEY="your-api-key"
Models:模型接口
LangChain提供了统一的模型接口:
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
# Chat模型
llm = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7,
max_tokens=1000
)
# 调用模型
from langchain_core.messages import HumanMessage, SystemMessage
response = llm.invoke([
SystemMessage(content="你是一个有帮助的助手"),
HumanMessage(content="什么是机器学习?")
])
print(response.content)
# Embedding模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vector = embeddings.embed_query("机器学习")
print(f"向量维度: {len(vector)}")
Prompts:提示词模板
LangChain提供了强大的提示词管理系统:
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
# 简单模板
template = PromptTemplate(
input_variables=["topic"],
template="请用简洁的语言解释{topic}"
)
prompt = template.invoke({"topic": "深度学习"})
print(prompt)
# 聊天模板
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个{role}专家"),
("human", "{question}")
])
messages = chat_prompt.invoke({
"role": "Python",
"question": "如何学习Python?"
})
print(messages)
Chains:链式调用
Chains是LangChain的核心概念,用于组合多个组件:
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 创建简单的Chain
llm = ChatOpenAI(model="gpt-3.5-turbo")
prompt = ChatPromptTemplate.from_template(
"用一句话解释{topic}"
)
parser = StrOutputParser()
# 使用LCEL(LangChain Expression Language)构建链
chain = prompt | llm | parser
# 调用链
result = chain.invoke({"topic": "量子计算"})
print(result)
# 带记忆的链
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.chat_history import BaseChatMessageHistory
# 会话存储
store = {}
def get_session_history(session_id):
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
# 添加记忆的链
with_message_history = RunnableWithMessageHistory(
chain,
get_session_history,
input_messages_key="question"
)
# 多轮对话
config = {"configurable": {"session_id": "abc123"}}
response1 = with_message_history.invoke(
{"topic": "机器学习"},
config=config
)
response2 = with_message_history.invoke(
{"topic": "深度学习"},
config=config
)
Output Parsers:输出解析
将LLM的输出转换为结构化数据:
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field
# 定义输出结构
class MovieReview(BaseModel):
title: str = Field(description="电影名称")
rating: float = Field(description="评分1-10")
summary: str = Field(description="简短总结")
# 创建解析器
parser = JsonOutputParser(pydantic_object=MovieReview)
# 提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "分析电影并返回JSON格式结果\n{format_instructions}"),
("human", "分析电影:{movie}")
])
# 构建链
chain = prompt | llm | parser
result = chain.invoke({
"movie": "盗梦空间",
"format_instructions": parser.get_format_instructions()
})
print(result)
实用工具
from langchain_core.tools import tool
# 自定义工具
@tool
def calculate(expression: str) -> str:
"""计算数学表达式"""
try:
result = eval(expression)
return str(result)
except Exception as e:
return f"计算错误: {e}"
# 使用工具
from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
llm = ChatOpenAI(model="gpt-3.5-turbo")
tools = [calculate]
# 创建Agent
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 运行
result = agent_executor.invoke({"input": "计算 123 * 456 + 789"})
print(result["output"])
最佳实践
- 使用LCEL:优先使用LangChain Expression Language构建链
- 错误处理:使用
try-except包装LLM调用 - 异步支持:使用
ainvoke进行异步调用 - 流式输出:使用
stream方法获取流式响应
# 流式输出示例
for chunk in chain.stream({"topic": "机器学习"}):
print(chunk, end="", flush=True)
LangChain通过其灵活的设计和丰富的组件,成为构建LLM应用的首选框架。