提供Chains、Agents、Memory等可组合组件,灵活构建复杂AI应用。
支持100+ LLM集成,300+ 工具和数据源,社区活跃。
LangSmith监控,LangServe部署,完整的DevOps工具链。
提示词模板管理,支持变量替换和Few-shot示例
统一的LLM接口,支持OpenAI、Anthropic等100+模型
链式调用组件,串联多个步骤完成复杂任务
对话记忆管理,支持短期、长期和向量记忆
自主决策代理,动态选择工具完成任务
文档检索组件,支持向量数据库和混合检索
Python版本(推荐):
# 核心库 pip install langchain # 包含所有集成(推荐) pip install langchain-community # OpenAI集成 pip install langchain-openai # Anthropic集成 pip install langchain-anthropic # 本地模型集成 pip install langchain-ollama
JavaScript版本:
npm install langchain npm install @langchain/openai npm install @langchain/anthropic
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
# 初始化模型
llm = ChatOpenAI(
model="gpt-4",
temperature=0.7,
api_key="your-api-key"
)
# 调用模型
messages = [HumanMessage(content="解释一下什么是LangChain")]
response = llm.invoke(messages)
print(response.content)
from langchain_core.prompts import ChatPromptTemplate
# 创建提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的{domain}专家"),
("human", "{question}")
])
# 创建链
chain = prompt | llm
# 调用链
result = chain.invoke({
"domain": "Python编程",
"question": "如何优化代码性能?"
})
print(result.content)
from langchain_core.output_parsers import StrOutputParser
# 完整的链:提示词 → 模型 → 解析器
chain = prompt | llm | StrOutputParser()
# 直接获取字符串结果
result = chain.invoke({
"domain": "数据分析",
"question": "如何进行数据清洗?"
})
print(result) # 直接是字符串,不需要.content
管理和重用提示词,支持变量替换、Few-shot学习和聊天历史。
from langchain_core.prompts import PromptTemplate
# 简单模板
template = PromptTemplate.from_template(
"将以下文本翻译成{target_language}:{text}"
)
# Few-shot模板
from langchain_core.prompts import FewShotPromptTemplate
examples = [
{"input": "happy", "output": "快乐"},
{"input": "sad", "output": "悲伤"}
]
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="英文:{input}\n中文:{output}"
)
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="你是一个专业翻译:",
suffix="英文:{input}\n中文:",
input_variables=["input"]
)
组合多个步骤,使用LCEL(LangChain Expression Language)构建复杂流程。
from langchain_core.runnables import RunnablePassthrough
# 简单链:提示词 | 模型 | 解析器
simple_chain = prompt | llm | StrOutputParser()
# 并行链
from langchain_core.runnables import RunnableParallel
chain = RunnableParallel({
"summary": summary_chain,
"keywords": keyword_chain,
"sentiment": sentiment_chain
})
# 条件链
from langchain_core.runnables import RunnableBranch
branch = RunnableBranch(
(lambda x: "code" in x, code_chain),
(lambda x: "data" in x, data_chain),
default_chain
)
保持对话上下文,支持多种记忆类型。
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 简单缓冲记忆
memory = ConversationBufferMemory()
# 限制长度的记忆
from langchain.memory import ConversationBufferWindowMemory
memory = ConversationBufferWindowMemory(k=5) # 只保留最近5轮
# 摘要记忆(长对话)
from langchain.memory import ConversationSummaryMemory
memory = ConversationSummaryMemory(llm=llm)
# 使用记忆的对话链
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
response = conversation.predict(input="你好,我是小明")
response = conversation.predict(input="我刚才说我叫什么?")
检索增强生成(RAG)是LangChain的核心应用场景,从基础到高级的完整实现
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
# 1. 加载文档
loader = TextLoader("docs/my_document.txt")
documents = loader.load()
# 2. 文档分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
texts = text_splitter.split_documents(documents)
# 3. 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
documents=texts,
embedding=embeddings
)
# 4. 创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 3}
)
# 5. 创建问答链
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4"),
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
# 6. 提问
result = qa_chain.invoke({"query": "文档的主要内容是什么?"})
print(result["result"])
print("来源文档:", result["source_documents"])
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
# 向量检索器
vector_retriever = vectorstore.as_retriever(k=5)
# BM25关键词检索器
bm25_retriever = BM25Retriever.from_documents(texts)
bm25_retriever.k = 5
# 混合检索(0.5权重各占一半)
ensemble_retriever = EnsembleRetriever(
retrievers=[vector_retriever, bm25_retriever],
weights=[0.5, 0.5]
)
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
# 创建压缩器
compressor = LLMChainExtractor.from_llm(llm)
# 压缩检索器
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=retriever
)
# 只返回相关部分
compressed_docs = compression_retriever.get_relevant_documents(
"什么是LangChain?"
)
from langchain.retrievers.multi_query import MultiQueryRetriever
# 自动生成多个查询变体
multi_query_retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=ChatOpenAI(temperature=0)
)
# 用户问题 → 生成3-5个变体 → 分别检索 → 合并去重
docs = multi_query_retriever.get_relevant_documents(
"LangChain的主要优势"
)
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
qa = ConversationalRetrievalChain.from_llm(
llm=ChatOpenAI(),
retriever=retriever,
memory=memory
)
# 多轮对话
qa.invoke({"question": "LangChain是什么?"})
qa.invoke({"question": "它有哪些核心组件?"}) # 理解"它"指代LangChain
Agent是能够自主决策的AI助手,它可以:
from langchain.agents import initialize_agent, Tool, AgentType
from langchain_openai import ChatOpenAI
from langchain_community.tools import DuckDuckGoSearchRun
# 定义工具
search = DuckDuckGoSearchRun()
tools = [
Tool(
name="搜索",
func=search.run,
description="当需要查找最新信息或你不知道的内容时使用"
),
Tool(
name="计算器",
func=lambda x: eval(x),
description="当需要进行数学计算时使用,输入数学表达式"
)
]
# 初始化Agent
agent = initialize_agent(
tools=tools,
llm=ChatOpenAI(model="gpt-4", temperature=0),
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 运行Agent
result = agent.run("2024年诺贝尔物理学奖得主是谁?获奖理由是什么?")
print(result)
🔍 Agent执行过程:
from langchain.tools import tool
@tool
def get_word_length(word: str) -> int:
"""返回单词的长度"""
return len(word)
# 使用工具
tools = [get_word_length]
from langchain.tools import BaseTool
from typing import Optional
class CustomTool(BaseTool):
name = "自定义工具"
description = "工具描述"
def _run(self, query: str) -> str:
# 工具逻辑
return f"处理结果:{query}"
async def _arun(self, query: str):
# 异步版本
raise NotImplementedError()
结合推理(Reasoning)和行动(Acting)的模式
from langchain.agents import create_react_agent
from langchain import hub
# 使用社区prompt
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(
llm=llm,
tools=tools,
prompt=prompt
)
from langchain.agents import AgentExecutor
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=10
)
利用OpenAI的函数调用能力
from langchain.agents import create_openai_functions_agent
agent = create_openai_functions_agent(
llm=ChatOpenAI(model="gpt-4"),
tools=tools,
prompt=prompt
)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True
)
构建支持多文档格式的智能问答系统,包含增量更新和来源追踪。
from langchain_community.document_loaders import (
PyPDFLoader,
Docx2txtLoader,
UnstructuredMarkdownLoader
)
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Qdrant
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
import os
class KnowledgeBase:
def __init__(self, collection_name="company_kb"):
self.embeddings = OpenAIEmbeddings()
self.vectorstore = Qdrant(
collection_name=collection_name,
embeddings=self.embeddings,
path="./qdrant_db"
)
self.llm = ChatOpenAI(model="gpt-4", temperature=0)
def load_documents(self, directory):
"""加载多种格式文档"""
docs = []
for filename in os.listdir(directory):
filepath = os.path.join(directory, filename)
if filename.endswith('.pdf'):
loader = PyPDFLoader(filepath)
elif filename.endswith('.docx'):
loader = Docx2txtLoader(filepath)
elif filename.endswith('.md'):
loader = UnstructuredMarkdownLoader(filepath)
else:
continue
docs.extend(loader.load())
# 分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?", ";", " "]
)
texts = text_splitter.split_documents(docs)
# 添加到向量库
self.vectorstore.add_documents(texts)
print(f"已索引 {len(texts)} 个文档块")
def create_qa_chain(self):
"""创建问答链"""
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True,
output_key="answer"
)
qa_chain = ConversationalRetrievalChain.from_llm(
llm=self.llm,
retriever=self.vectorstore.as_retriever(
search_type="mmr", # 最大边际相关性
search_kwargs={"k": 5, "fetch_k": 20}
),
memory=memory,
return_source_documents=True,
verbose=True
)
return qa_chain
# 使用示例
kb = KnowledgeBase()
kb.load_documents("./company_docs")
qa_chain = kb.create_qa_chain()
# 提问
result = qa_chain.invoke({"question": "公司的休假政策是什么?"})
print("回答:", result["answer"])
print("来源:", [doc.metadata for doc in result["source_documents"]])
💡 核心要点:
结合工具调用和知识库的智能客服系统,能够查询订单、搜索FAQ、转人工等。
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_core.tools import tool
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
# 定义客服工具
@tool
def query_order_status(order_id: str) -> str:
"""查询订单状态,输入订单号"""
# 实际应该查询数据库
return f"订单{order_id}状态:已发货,预计明天送达"
@tool
def search_faq(question: str) -> str:
"""搜索常见问题,输入问题关键词"""
# 实际应该查询FAQ知识库
return "根据FAQ:退货需在收货后7天内申请"
@tool
def transfer_to_human() -> str:
"""转接人工客服"""
return "正在为您转接人工客服,请稍候..."
# 客服提示词
prompt = ChatPromptTemplate.from_messages([
("system", """你是一个专业的客服助手,负责帮助用户解决问题。
【服务准则】
1. 友好、耐心、专业
2. 优先使用工具查询准确信息
3. 无法解决时转人工客服
4. 保护用户隐私
可用工具:
- query_order_status: 查询订单
- search_faq: 搜索常见问题
- transfer_to_human: 转人工"""),
MessagesPlaceholder(variable_name="chat_history", optional=True),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
# 创建Agent
tools = [query_order_status, search_faq, transfer_to_human]
agent = create_openai_functions_agent(
llm=ChatOpenAI(model="gpt-4", temperature=0),
tools=tools,
prompt=prompt
)
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=5
)
# 测试
result = agent_executor.invoke({
"input": "我的订单ORD123456什么时候能到?"
})
print(result["output"])
能够读取CSV、执行Python代码、生成图表的数据分析助手。
from langchain_experimental.agents import create_pandas_dataframe_agent
import pandas as pd
# 加载数据
df = pd.read_csv("sales_data.csv")
# 创建数据分析Agent
agent = create_pandas_dataframe_agent(
ChatOpenAI(model="gpt-4", temperature=0),
df,
verbose=True,
agent_type=AgentType.OPENAI_FUNCTIONS,
allow_dangerous_code=True # 允许执行代码
)
# 自然语言查询数据
questions = [
"这个数据集有多少行?",
"销售额最高的前5个产品是什么?",
"计算平均订单金额",
"哪个月份的销售额最高?",
"帮我找出销售额异常的记录"
]
for q in questions:
print(f"\n问题:{q}")
answer = agent.invoke(q)
print(f"回答:{answer}")
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
# 方法1:回调函数
llm = ChatOpenAI(
streaming=True,
callbacks=[StreamingStdOutCallbackHandler()]
)
# 方法2:stream方法
for chunk in llm.stream("讲一个故事"):
print(chunk.content, end="", flush=True)
# 方法3:astream异步流式
async for chunk in llm.astream("讲一个故事"):
print(chunk.content, end="")
# 批量调用,提升效率
questions = [
"什么是Python?",
"什么是JavaScript?",
"什么是Go?"
]
# 并行处理多个请求
results = chain.batch([
{"question": q} for q in questions
])
# 异步批处理
results = await chain.abatch([
{"question": q} for q in questions
])
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 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", "提取人物信息。\n{format_instructions}"),
("human", "{text}")
])
chain = prompt | llm | parser
result = chain.invoke({
"text": "小明今年25岁,是一名软件工程师",
"format_instructions": parser.get_format_instructions()
})
print(result) # {"name": "小明", "age": 25, "occupation": "软件工程师"}
from langchain.chains import LLMChain
from langchain.callbacks import get_openai_callback
# 追踪成本
with get_openai_callback() as cb:
result = chain.invoke({"question": "..."})
print(f"Token使用:{cb.total_tokens}")
print(f"成本:${cb.total_cost}")
# 重试机制
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def call_with_retry(chain, input_data):
return chain.invoke(input_data)
# 超时控制
from langchain.callbacks import TimeoutCallback
chain.invoke(
{"question": "..."},
config={"callbacks": [TimeoutCallback(timeout=30)]}
)
调试、测试、监控LLM应用的平台
import os os.environ["LANGCHAIN_TRACING_V2"] = "true" os.environ["LANGCHAIN_API_KEY"] = "your-key" # 所有调用自动追踪到LangSmith
将LangChain应用部署为REST API
from langserve import add_routes from fastapi import FastAPI app = FastAPI() add_routes(app, chain, path="/chat") # uvicorn main:app --reload # API: http://localhost:8000/chat
构建有状态的多Agent工作流
from langgraph.graph import StateGraph
graph = StateGraph(AgentState)
graph.add_node("research", research_node)
graph.add_node("write", write_node)
graph.add_edge("research", "write")
app = graph.compile()
from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cache
set_llm_cache(InMemoryCache())
# Redis缓存(生产环境)
from langchain.cache import RedisCache
import redis
set_llm_cache(
RedisCache(
redis.Redis(host="localhost", port=6379)
)
)
# 限制并发数
from langchain_core.runnables import RunnableConfig
config = RunnableConfig(
max_concurrency=5
)
results = await chain.abatch(
inputs,
config=config
)
from langchain.callbacks import get_openai_callback
with get_openai_callback() as cb:
result = chain.invoke({...})
print(f"Tokens: {cb.total_tokens}")
print(f"Cost: ${cb.total_cost:.4f}")
LangChain:功能全面,适合构建复杂应用(Agent、多步骤工作流)
LlamaIndex:专注数据索引和RAG,更简单易用
建议:RAG应用用LlamaIndex,需要Agent或复杂流程用LangChain,也可以混合使用
多种策略结合使用:
设置合理的限制和指导:
多种策略可选:
确保稳定性和可维护性:
使用多种调试工具:
1-2周
2-3周
3-4周
持续学习
📚 推荐学习资源