LangChain是一个基于大语言模型(LLM)的开源框架,专门用于构建端到端的语言模型应用程序。它就像是为开发者准备的一套多功能工具箱,让原本复杂的大模型应用开发变得像搭积木一样简单。想象一下,如果你要开发一个能理解文档内容的问答系统,传统方式可能需要自己处理文本分割、向量存储、查询优化等一系列繁琐工作,而LangChain把这些常见任务都封装成了标准化组件。
这个框架的核心价值在于解决了大模型应用开发中的三个关键痛点:
当前最新稳定版本是0.1.x系列,社区活跃度非常高,GitHub星标数已突破6万。框架采用Python作为主要开发语言,同时也提供了TypeScript版本支持前端集成。
LangChain的模型抽象层就像是个万能适配器,目前支持的主流模型包括:
python复制from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_community.llms import HuggingFaceHub
# 初始化不同厂商的模型
openai_llm = ChatOpenAI(model="gpt-4-turbo")
claude_llm = ChatAnthropic(model="claude-3-opus")
hf_llm = HuggingFaceHub(repo_id="google/flan-t5-xxl")
模型层的关键设计在于:
传统Prompt往往就是字符串拼接,而LangChain的提示模板支持:
python复制from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位专业的{role},请用{style}风格回答"),
("human", "{input}")
])
formatted = prompt.format(
role="技术文档工程师",
style="简明扼要",
input="如何配置LangSmith?"
)
高级功能包括:
LangChain的检索系统工作原理如下:
mermaid复制graph LR
A[原始文档] --> B(文本分割)
B --> C[向量嵌入]
C --> D[(向量数据库)]
D --> E[相似度检索]
E --> F[上下文注入]
典型实现代码:
python复制from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
documents = text_splitter.split_documents(raw_docs)
vectorstore = FAISS.from_documents(
documents,
OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
记忆模块主要解决两类问题:
实现示例:
python复制from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# 在链中使用
conversation_chain = LLMChain(
llm=llm,
prompt=prompt,
memory=memory
)
高级记忆模式包括:
链的核心思想是将多个操作串联起来,形成可复用的流程。比如经典的RAG链:
python复制from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
verbose=True
)
response = qa_chain.run("LangSmith的主要功能是什么?")
链的组合方式:
代理系统赋予LLM使用工具的能力:
python复制from langchain.agents import AgentExecutor, create_openai_functions_agent
tools = [retriever_tool, calculator_tool, search_tool]
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
result = agent_executor.invoke({
"input": "请查询LangSmith的最新版本号,然后计算比0.1.7版本提升了多少"
})
代理的核心组件:
推荐使用Python 3.9+环境:
bash复制# 基础安装
pip install langchain==0.1.7 langchain-core langchain-community
# 可选组件
pip install langchain-openai faiss-cpu beautifulsoup4 tavily-python
# 开发工具
pip install langsmith langserve
环境变量配置(.env文件):
ini复制OPENAI_API_KEY=sk-your-key-here
TAVILY_API_KEY=tvly-your-key-here
LANGCHAIN_TRACING_V2=true
LANGCHAIN_API_KEY=ls__your_key_here
完整代码示例:
python复制from langchain_community.document_loaders import WebBaseLoader
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
# 1. 文档加载
loader = WebBaseLoader(["https://docs.smith.langchain.com"])
docs = loader.load()
# 2. 文本处理
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", " ", ""]
)
splits = text_splitter.split_documents(docs)
# 3. 向量存储
vectorstore = FAISS.from_documents(
splits,
OpenAIEmbeddings(model="text-embedding-3-small")
)
# 4. 问答链
qa_chain = RetrievalQA.from_chain_type(
ChatOpenAI(model="gpt-3.5-turbo", temperature=0),
retriever=vectorstore.as_retriever(search_kwargs={"k": 4}),
chain_type="stuff"
)
# 5. 查询测试
question = "LangSmith如何帮助调试模型?"
result = qa_chain.invoke({"query": question})
print(result["result"])
分块策略优化:
检索增强:
python复制retriever = vectorstore.as_retriever(
search_type="mmr", # 最大边际相关性
search_kwargs={
"k": 5,
"score_threshold": 0.8,
"filter": {"source": "official_docs"}
}
)
python复制from langchain.cache import SQLiteCache
import langchain
langchain.llm_cache = SQLiteCache(database_path=".langchain.db")
python复制from langchain.agents import Tool, AgentExecutor
from langchain.agents import create_openai_functions_agent
from langchain import hub
# 工具定义
tools = [
Tool(
name="DocumentSearch",
func=retriever.invoke,
description="用于搜索技术文档内容"
),
Tool(
name="WebSearch",
func=TavilySearchResults(max_results=3),
description="当需要最新信息时使用"
),
Tool(
name="Calculator",
func=calculate,
description="数学计算时使用"
)
]
# Agent创建
prompt = hub.pull("hwchase17/openai-functions-agent")
agent = create_openai_functions_agent(
ChatOpenAI(model="gpt-4", temperature=0),
tools,
prompt
)
# 执行器
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
max_iterations=5,
early_stopping_method="generate"
)
# 执行查询
response = agent_executor.invoke({
"input": "LangSmith最新版本有什么新特性?与0.1.7相比有哪些改进?"
})
使用LangSmith进行跟踪:
python复制from langsmith import Client
client = Client()
run = client.create_run(
project_name="my-agent",
inputs={"input": "查询天气"},
run_type="chain"
)
# 查看跟踪结果
feedback = client.create_feedback(
run.id,
key="accuracy",
score=0.9,
comment="回答准确"
)
关键监控指标:
服务端代码(serve.py):
python复制from fastapi import FastAPI
from langserve import add_routes
from my_chain import qa_chain # 导入之前构建的链
app = FastAPI(
title="文档问答API",
version="1.0",
description="基于LangChain构建的技术文档问答服务"
)
# 添加路由
add_routes(
app,
qa_chain,
path="/qa",
enabled_endpoints=["invoke", "stream"]
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
启动命令:
bash复制python serve.py
Python客户端:
python复制from langserve import RemoteRunnable
qa_app = RemoteRunnable("http://localhost:8000/qa")
response = qa_app.invoke({
"query": "如何配置LangChain的记忆系统?"
})
cURL调用:
bash复制curl -X POST "http://localhost:8000/qa/invoke" \
-H "Content-Type: application/json" \
-d '{"input": {"query": "LangServe支持哪些部署方式?"}}'
生产环境建议:
python复制app = FastAPI()
add_routes(
app,
qa_chain,
batch=True,
max_batch_size=10
)
python复制from fastapi.middleware import Middleware
from slowapi import Limiter
from slowapi.util import get_remote_address
limiter = Limiter(key_func=get_remote_address)
middleware = [Middleware(limiter)]
app = FastAPI(middleware=middleware)
python复制from prometheus_fastapi_instrumentator import Instrumentator
Instrumentator().instrument(app).expose(app)
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 返回无关内容 | 检索质量差 | 调整分块大小,优化检索器score_threshold |
| 代理循环卡死 | max_iterations设置过高 | 设置合理的max_iterations(3-5) |
| 响应速度慢 | 模型选择不当 | 对小任务使用gpt-3.5-turbo |
| 记忆丢失 | memory_key配置错误 | 检查链中memory_key与提示模板匹配 |
| 工具调用失败 | 参数格式不符 | 使用Pydantic验证工具输入输出 |
python复制from langsmith import traceable
@traceable(run_type="chain")
def my_chain(input):
# 链逻辑
return result
python复制client = Client()
dataset = client.create_dataset(
name="retrieval-test",
data_type="kv"
)
client.create_examples(
inputs=[{"query": "LangChain是什么"}],
outputs=[{"expected": "一个LLM应用开发框架"}],
dataset_id=dataset.id
)
test_run = client.run_on_dataset(
dataset_name="retrieval-test",
llm_or_chain_factory=lambda: retriever,
evaluation=evaluators
)
python复制from langsmith.evaluation import evaluate
results = evaluate(
qa_chain,
data=test_data,
metrics={
"accuracy": lambda x, y: int(x["output"] == y["expected"]),
"latency": lambda x, _: x["metrics"]["invoke_time"]
}
)
python复制from langchain.callbacks import StdOutCallbackHandler
chain.run(
input="...",
callbacks=[StdOutCallbackHandler()]
)
python复制from langchain.callbacks import FileCallbackHandler
chain.run(
input="...",
callbacks=[FileCallbackHandler("debug.log")]
)
python复制from langchain import hub
optimized_prompt = hub.pull("hwchase17/optimized-qa-prompt")
LangSmith:全生命周期管理平台
LangGraph:复杂工作流设计
python复制from langgraph.graph import Graph
workflow = Graph()
workflow.add_node("research", research_agent)
workflow.add_node("write", writing_chain)
workflow.add_edge("research", "write")
LangServe:一键式部署
bash复制langserve deploy --chain my_chain --port 8000
LlamaIndex:增强检索能力
python复制from llama_index import VectorStoreIndex
index = VectorStoreIndex.from_documents(docs)
AutoGen:多Agent协作
python复制from autogen import AssistantAgent
assistant = AssistantAgent("coder")
Haystack:工业级管道
python复制from haystack.document_stores import FAISSDocumentStore
document_store = FAISSDocumentStore()
私有化部署方案:
bash复制ollama pull llama3
ollama serve
混合架构设计:
mermaid复制graph TB
A[客户端] --> B{路由层}
B -->|简单查询| C[本地小模型]
B -->|复杂任务| D[云端大模型]
安全合规措施:
服务分层架构:
code复制┌─────────────────┐
│ 表现层 │ ◄─ API/Web界面
├─────────────────┤
│ 应用层 │ ◄─ 链/Agent
├─────────────────┤
│ 领域层 │ ◄─ 业务逻辑
├─────────────────┤
│ 基础设施层 │ ◄─ 存储/模型
└─────────────────┘
缓存策略:
python复制from langchain.cache import RedisCache
import redis
langchain.llm_cache = RedisCache(redis.Redis())
灾备方案:
python复制from langchain.fallbacks import FallbackToHuman
chain = main_chain.with_fallbacks([backup_chain, FallbackToHuman()])
| 场景 | 优化手段 | 预期提升 |
|---|---|---|
| 高并发查询 | 请求批处理 | 3-5倍吞吐量 |
| 大文档处理 | 分层索引 | 50%延迟降低 |
| 复杂逻辑 | Agent并行化 | 2-3倍速度 |
| 成本敏感 | 小模型路由 | 60%成本节约 |
python复制from pydantic import BaseModel, Field
class QAInput(BaseModel):
query: str = Field(max_length=500)
user_id: str = Field(pattern=r'^[a-z0-9-]+$')
python复制from langchain.output_parsers import CommaSeparatedListOutputParser
parser = CommaSeparatedListOutputParser()
chain = prompt | llm | parser
python复制from fastapi import Depends, HTTPException
async def verify_token(token: str):
if not valid_token(token):
raise HTTPException(status_code=403)
app = FastAPI(dependencies=[Depends(verify_token)])
多模态融合:
python复制from langchain_community.tools import ImageCaptioner
tools.append(ImageCaptioner())
代码生成优化:
python复制from langchain_experimental.autonomous_agents import CodeWritingAgent
分布式Agent:
python复制from langchain.distributed import DistributedAgentExecutor
基础阶段:
进阶阶段:
专家阶段:
官方资源:
学习材料:
云服务集成: