LangChain
LangChain 是一个用于构建大语言模型应用的开源框架,提供了丰富的组件和工具,帮助开发者快速构建复杂的 AI 应用。
核心概念
什么是 LangChain
LangChain 提供:
- 标准化接口: 统一的 LLM 调用方式
- 组件库: 预构建的功能组件
- 链式组合: 灵活的工作流编排
- Agent 框架: 自主决策能力
- 记忆系统: 对话状态管理
核心组件
| 组件 | 说明 |
|---|---|
| Models | LLM 和聊天模型封装 |
| Prompts | 提示词模板管理 |
| Chains | 多步骤工作流编排 |
| Agents | 自主决策和工具调用 |
| Memory | 对话记忆管理 |
| Retrievers | 数据检索组件 |
| Tools | 外部工具集成 |
快速开始
安装
pip install langchain langchain-openai
基础用法
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
# 初始化模型
llm = ChatOpenAI(
model="gpt-4o",
api_key="your-api-key",
base_url="https://api.weelinking.com/v1"
)
# 简单对话
messages = [
SystemMessage(content="你是一个有帮助的助手。"),
HumanMessage(content="什么是机器学习?")
]
response = llm.invoke(messages)
print(response.content)
提示词模板
基础模板
from langchain_core.prompts import ChatPromptTemplate
# 创建模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个{role}专家。"),
("human", "{question}")
])
# 格式化
formatted = prompt.format_messages(
role="Python",
question="如何读取 JSON 文件?"
)
response = llm.invoke(formatted)
复杂模板
from langchain_core.prompts import PromptTemplate
template = """
你是一位{expertise}专家。
用户问题:{question}
请按以下格式回答:
1. 简要回答
2. 详细解释
3. 示例代码(如适用)
"""
prompt = PromptTemplate(
input_variables=["expertise", "question"],
template=template
)
链式调用(Chains)
简单链
from langchain_core.output_parsers import StrOutputParser
# 使用 LCEL (LangChain Expression Language)
chain = prompt | llm | StrOutputParser()
result = chain.invoke({
"expertise": "Python",
"question": "什么是装饰器?"
})
顺序链
from langchain_core.runnables import RunnablePassthrough
# 第一步:生成代码
code_prompt = ChatPromptTemplate.from_template(
"用 Python 实现以下功能:{task}"
)
# 第二步:解释代码
explain_prompt = ChatPromptTemplate.from_template(
"请解释以下代码:\n{code}"
)
# 组合链
chain = (
{"task": RunnablePassthrough()}
| code_prompt
| llm
| StrOutputParser()
| (lambda code: {"code": code})
| explain_prompt
| llm
| StrOutputParser()
)
result = chain.invoke("计算斐波那契数列")
RAG 实现
文档加载
from langchain_community.document_loaders import (
TextLoader,
PyPDFLoader,
WebBaseLoader
)
# 加载文本文件
text_loader = TextLoader("document.txt")
docs = text_loader.load()
# 加载 PDF
pdf_loader = PyPDFLoader("document.pdf")
pdf_docs = pdf_loader.load()
# 加载网页
web_loader = WebBaseLoader("https://example.com")
web_docs = web_loader.load()
文本分割
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", "。", ".", " ", ""]
)
chunks = splitter.split_documents(docs)
向量存储
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
# 创建嵌入模型
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small",
api_key="your-api-key",
base_url="https://api.weelinking.com/v1"
)
# 创建向量存储
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
# 创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 5}
)
完整 RAG 链
from langchain_core.runnables import RunnableParallel
# RAG 提示词
rag_prompt = ChatPromptTemplate.from_template("""
基于以下信息回答问题。如果信息中没有相关内容,请说明。
信息:
{context}
问题:{question}
""")
# 构建 RAG 链
rag_chain = (
RunnableParallel({
"context": retriever | (lambda docs: "\n\n".join(d.page_content for d in docs)),
"question": RunnablePassthrough()
})
| rag_prompt
| llm
| StrOutputParser()
)
# 使用
answer = rag_chain.invoke("什么是机器学习?")
Agent
基础 Agent
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain.tools import tool
# 定义工具
@tool
def search_web(query: str) -> str:
"""搜索网络获取信息"""
# 实际的搜索实现
return f"搜索结果:{query}"
@tool
def calculate(expression: str) -> str:
"""计算数学表达式"""
try:
return str(eval(expression))
except:
return "计算错误"
tools = [search_web, calculate]
# 创建 Agent
agent_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有帮助的助手,可以使用工具来帮助用户。"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}")
])
agent = create_openai_tools_agent(llm, tools, agent_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 运行
result = agent_executor.invoke({"input": "计算 123 * 456"})
ReAct Agent
from langchain.agents import create_react_agent
from langchain import hub
# 使用预定义的 ReAct 提示词
react_prompt = hub.pull("hwchase17/react")
react_agent = create_react_agent(llm, tools, react_prompt)
react_executor = AgentExecutor(agent=react_agent, tools=tools, verbose=True)
result = react_executor.invoke({"input": "北京今天天气怎么样?"})
记忆系统
对话记忆
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
memory = ConversationBufferMemory()
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# 多轮对话
conversation.predict(input="我叫小明")
conversation.predict(input="我刚才说我叫什么?")
摘要记忆
from langchain.memory import ConversationSummaryMemory
summary_memory = ConversationSummaryMemory(llm=llm)
向量记忆
from langchain.memory import VectorStoreRetrieverMemory
# 使用向量存储的长期记忆
vector_memory = VectorStoreRetrieverMemory(
retriever=vectorstore.as_retriever()
)
输出解析
结构化输出
from langchain_core.output_parsers import JsonOutputParser
from pydantic import BaseModel, Field
class Person(BaseModel):
name: str = Field(description="姓名")
age: int = Field(description="年龄")
occupation: str = Field(description="职业")
parser = JsonOutputParser(pydantic_object=Person)
prompt = ChatPromptTemplate.from_messages([
("system", "提取以下文本中的人物信息。{format_instructions}"),
("human", "{text}")
]).partial(format_instructions=parser.get_format_instructions())
chain = prompt | llm | parser
result = chain.invoke({"text": "张三,25岁,是一名软件工程师。"})
# result = {"name": "张三", "age": 25, "occupation": "软件工程师"}
回调和监控
from langchain_core.callbacks import BaseCallbackHandler
class CustomCallback(BaseCallbackHandler):
def on_llm_start(self, serialized, prompts, **kwargs):
print(f"开始调用 LLM...")
def on_llm_end(self, response, **kwargs):
print(f"LLM 调用完成,Token: {response.llm_output}")
def on_llm_error(self, error, **kwargs):
print(f"LLM 错误: {error}")
# 使用回调
llm_with_callback = ChatOpenAI(
model="gpt-4o",
callbacks=[CustomCallback()]
)
最佳实践
1. 使用 LCEL
优先使用 LangChain Expression Language:
- 更简洁的语法
- 更好的类型支持
- 自动支持流式和批处理
2. 模块化设计
# 将复杂链拆分为可复用的组件
summarizer = prompt_summarize | llm | StrOutputParser()
translator = prompt_translate | llm | StrOutputParser()
# 组合使用
full_chain = summarizer | translator
3. 错误处理
from langchain_core.runnables import RunnableWithFallbacks
# 添加降级模型
chain_with_fallback = chain.with_fallbacks([
fallback_chain
])
相关资源
- LangChain 官方文档
- LangChain GitHub
- LangSmith - 调试和监控平台