🐛 LangChain 1.0 故障排除指南
快速诊断和解决常见问题,掌握调试技巧,提升开发效率。
🔍 问题分类
📦 导入错误
错误 1: ModuleNotFoundError: No module named 'langchain'
⚠️ 错误信息
ModuleNotFoundError: No module named 'langchain'
原因:未安装 LangChain 包
解决方案:
Bash
# 安装核心包
pip install langchain
# 安装特定提供商的包
pip install langchain-openai
pip install langchain-anthropic
pip install langchain-google-genai
错误 2: ImportError: cannot import name 'create_agent'
⚠️ 错误信息
ImportError: cannot import name 'create_agent' from 'langchain'
原因:导入路径错误或版本不匹配
解决方案:
Python
# ❌ 错误的导入
from langchain import create_agent
# ✅ 正确的导入
from langchain.agents import create_agent
# 确保版本正确
# pip install langchain>=1.0.0
错误 3: 使用了 langchain-classic 的 API
⚠️ 错误信息
AttributeError: module 'langchain' has no attribute 'LLMChain'
原因:使用了 0.x 版本的 API(已废弃)
解决方案:
Python
# ❌ 0.x 版本的 API(已废弃)
from langchain import LLMChain
# ✅ 1.0 版本推荐方式
from langchain.agents import create_agent
# 或者使用兼容包(不推荐)
from langchain_classic import LLMChain
🔑 API 错误
错误 4: AuthenticationError: Invalid API key
⚠️ 错误信息
AuthenticationError: Incorrect API key provided
原因:API 密钥未设置或错误
解决方案:
Python
import os
# 方式 1:环境变量(推荐)
os.environ["OPENAI_API_KEY"] = "your-api-key-here"
# 方式 2:直接传入
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="gpt-4o",
api_key="your-api-key-here"
)
# 验证 API 密钥是否设置
print(os.getenv("OPENAI_API_KEY")) # 应输出密钥(前几位)
错误 5: RateLimitError: Rate limit exceeded
⚠️ 错误信息
RateLimitError: You exceeded your current quota
原因:API 调用频率或配额超限
解决方案:
Python
import time
from tenacity import retry, stop_after_attempt, wait_exponential
# 添加重试逻辑
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=10)
)
def call_model_with_retry():
return model.invoke("your query")
# 添加延迟
time.sleep(1) # 每次调用间隔 1 秒
# 检查配额
# 访问:https://platform.openai.com/usage
错误 6: TimeoutError: Request timeout
⚠️ 错误信息
TimeoutError: Request timed out
原因:网络慢或请求超时
解决方案:
Python
from langchain_openai import ChatOpenAI
# 增加超时时间
model = ChatOpenAI(
model="gpt-4o",
timeout=60, # 60 秒超时
max_retries=3 # 最多重试 3 次
)
🤖 模型错误
错误 7: ValueError: Model not found
⚠️ 错误信息
ValueError: Model 'gpt-5' not found
原因:模型名称错误或不存在
解决方案:
Python
# ✅ 正确的模型名称(2025 年 1 月)
valid_models = [
"gpt-4o",
"gpt-4o-mini",
"gpt-3.5-turbo",
"claude-3-5-sonnet-20241022",
"gemini-2.0-flash-exp"
]
# 使用 init_chat_model 自动验证
from langchain import init_chat_model
model = init_chat_model("gpt-4o", model_provider="openai")
错误 8: 模型不支持某些功能
⚠️ 错误信息
NotImplementedError: This model does not support tool calling
原因:使用了模型不支持的功能
解决方案:
| 功能 | 支持的模型 | 不支持的模型 |
|---|---|---|
| 工具调用 | GPT-4, GPT-3.5-turbo, Claude 3+ | 早期模型 |
| 流式输出 | 所有主流模型 | - |
| 结构化输出 | GPT-4o, Claude 3.5 Sonnet | GPT-3.5-turbo(部分) |
Python
# 检查模型是否支持工具调用
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o")
# 查看模型能力
if hasattr(model, "bind_tools"):
print("支持工具调用")
else:
print("不支持工具调用,请升级模型")
🔧 工具错误
错误 9: 工具调用失败
⚠️ 错误信息
ToolExecutionError: Tool 'my_tool' failed to execute
原因:工具函数内部出错
解决方案:
Python
from langchain.tools import tool
# ❌ 没有错误处理
@tool
def search_database(query: str) -> str:
"""搜索数据库"""
result = database.query(query) # 可能抛出异常
return result
# ✅ 添加错误处理
@tool
def search_database(query: str) -> str:
"""搜索数据库"""
try:
result = database.query(query)
return result
except Exception as e:
return f"搜索失败:{str(e)}"
错误 10: 工具参数验证失败
⚠️ 错误信息
ValidationError: Invalid tool arguments
原因:工具调用参数类型或值不正确
解决方案:
Python
from langchain.tools import tool
from typing import Literal
# 使用类型提示和验证
@tool
def set_status(
status: Literal["active", "inactive", "pending"]
) -> str:
"""设置状态
Args:
status: 状态值,必须是 active, inactive, 或 pending
"""
if status not in ["active", "inactive", "pending"]:
return f"错误:无效的状态 '{status}'"
return f"状态已设置为:{status}"
错误 11: Runtime 上下文缺失
⚠️ 错误信息
KeyError: 'user_id'
原因:工具需要 Runtime 上下文,但调用时未提供
解决方案:
Python
from langchain.tools import tool, ToolRuntime
from typing_extensions import TypedDict
class UserContext(TypedDict):
user_id: str
@tool
def get_user_data(runtime: ToolRuntime[UserContext]) -> str:
"""获取用户数据"""
user_id = runtime.context["user_id"]
return f"用户数据:{user_id}"
# ❌ 错误:未提供上下文
result = agent.invoke({"messages": [...]})
# ✅ 正确:提供上下文
config = {
"configurable": {"thread_id": "thread_001"},
"context": {"user_id": "user_123"}
}
result = agent.invoke({"messages": [...]}, config=config)
🎯 Agent 错误
错误 12: Agent 无限循环
⚠️ 症状
Agent 一直调用工具,不停止
原因:Agent 陷入循环,无法判断任务完成
解决方案:
Python
# 1. 在 system_prompt 中明确终止条件
system_prompt = """
你是AI助手。
重要:完成任务后,直接给出最终答案,不要继续调用工具。
如果已经获得足够信息,请总结并回答用户。
"""
# 2. 使用 LangGraph 设置递归限制
from langgraph.graph import StateGraph
graph = StateGraph(MessagesState)
# ... 添加节点和边 ...
compiled = graph.compile(
checkpointer=checkpointer,
recursion_limit=25 # 最多执行 25 步
)
# 3. 监控执行步数
step_count = 0
for chunk in agent.stream({...}):
step_count += 1
if step_count > 20:
print("警告:执行步数过多,可能陷入循环")
break
错误 13: 状态更新失败
⚠️ 错误信息
KeyError: 'messages'
原因:状态字段名称错误或未初始化
解决方案:
Python
# ❌ 错误:字段名拼写错误
result = agent.invoke({"message": [...]}) # 应该是 messages
# ✅ 正确:使用正确的字段名
result = agent.invoke({"messages": [...]})
# 验证状态结构
from langgraph.graph import MessagesState
print(MessagesState.__annotations__)
# 输出:{'messages': ...}
💾 内存错误
错误 14: Checkpointer 连接失败
⚠️ 错误信息
OperationalError: could not connect to server
原因:PostgreSQL 数据库连接失败
解决方案:
Python
from langgraph.checkpoint.postgres import PostgresSaver
# 检查数据库连接
import psycopg2
try:
conn = psycopg2.connect(
"postgresql://user:pass@localhost:5432/langchain"
)
print("数据库连接成功")
conn.close()
except Exception as e:
print(f"数据库连接失败:{e}")
# 开发环境:使用内存 Checkpointer
from langgraph.checkpoint.memory import InMemorySaver
checkpointer = InMemorySaver() # 不需要数据库
错误 15: Store 数据未找到
⚠️ 错误信息
AttributeError: 'NoneType' object has no attribute 'value'
原因:Store 中数据不存在
解决方案:
Python
from langchain.tools import tool, ToolRuntime
@tool
def get_preference(key: str, runtime: ToolRuntime) -> str:
"""获取用户偏好"""
user_id = runtime.context["user_id"]
store = runtime.store
# ❌ 错误:直接访问可能不存在的数据
# item = store.get(("users", user_id), key)
# return item.value
# ✅ 正确:检查数据是否存在
item = store.get(("users", user_id), key)
if item is None:
return f"偏好 '{key}' 未设置"
return f"{key} = {item.value}"
⚡ 性能问题
问题 1: 响应速度慢
症状:Agent 响应时间 > 10 秒
诊断步骤:
Python
import time
# 1. 测量各阶段耗时
start = time.time()
# 工具调用耗时
tool_start = time.time()
result = my_tool.invoke({"query": "test"})
print(f"工具调用耗时: {time.time() - tool_start:.2f}s")
# 模型调用耗时
model_start = time.time()
response = model.invoke("test")
print(f"模型调用耗时: {time.time() - model_start:.2f}s")
# 总耗时
print(f"总耗时: {time.time() - start:.2f}s")
优化方案:
| 瓶颈 | 优化方法 | 预期提升 |
|---|---|---|
| 工具调用慢 | 添加缓存、优化数据库查询 | 50-70% |
| 模型调用慢 | 使用更快的模型、启用流式输出 | 30-50% |
| 对话历史过长 | 使用 SummarizationMiddleware | 40-60% |
| 检索慢 | 使用向量索引、限制检索数量 | 60-80% |
问题 2: 内存占用过高
症状:进程内存持续增长
解决方案:
Python
# 1. 限制对话历史长度
from langchain.agents.middleware import SummarizationMiddleware
summarization = SummarizationMiddleware(
max_messages=10, # 只保留最近 10 条消息
summarize_older=True
)
# 2. 定期清理 Checkpointer(开发环境)
if isinstance(checkpointer, InMemorySaver):
# 清理超过 1 小时的会话
# checkpointer.clear_old_sessions(max_age=3600)
pass
# 3. 使用 PostgreSQL(生产环境)
# PostgreSQL 会自动管理内存
🔬 调试工具
LangSmith 追踪
Python
import os
# 启用 LangSmith 追踪
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "your-langsmith-api-key"
os.environ["LANGCHAIN_PROJECT"] = "my-project"
# 所有 Agent 调用会自动追踪
result = agent.invoke({"messages": [...]})
# 访问 https://smith.langchain.com/ 查看追踪结果
详细日志配置
Python
import logging
# 配置日志级别
logging.basicConfig(
level=logging.DEBUG, # 显示所有日志
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
# 只显示 LangChain 相关日志
logger = logging.getLogger("langchain")
logger.setLevel(logging.DEBUG)
# 禁用其他库的日志
logging.getLogger("httpx").setLevel(logging.WARNING)
logging.getLogger("openai").setLevel(logging.WARNING)
打印中间状态
Python
# 使用 stream_mode 查看执行过程
for stream_mode, chunk in agent.stream(
{"messages": [...]},
stream_mode=["messages", "updates", "values"]
):
if stream_mode == "updates":
print(f"\n节点更新: {chunk}")
elif stream_mode == "values":
print(f"\n当前状态: {chunk.keys()}")
elif stream_mode == "messages":
token, metadata = chunk
if token:
print(token, end="", flush=True)
诊断流程图
graph TB
Start[遇到错误] --> CheckError{错误类型?}
CheckError -->|导入错误| Import[检查包安装和版本]
CheckError -->|API错误| API[检查API密钥和配额]
CheckError -->|模型错误| Model[检查模型名称和能力]
CheckError -->|工具错误| Tool[检查工具定义和参数]
CheckError -->|性能问题| Perf[使用 LangSmith 追踪]
Import --> Fix1[pip install 相关包]
API --> Fix2[设置环境变量或检查配额]
Model --> Fix3[使用支持的模型]
Tool --> Fix4[添加错误处理]
Perf --> Fix5[优化瓶颈环节]
Fix1 --> Test[测试修复]
Fix2 --> Test
Fix3 --> Test
Fix4 --> Test
Fix5 --> Test
Test --> Success{问题解决?}
Success -->|是| End[完成]
Success -->|否| Logs[查看详细日志]
Logs --> LangSmith[使用 LangSmith]
LangSmith --> Community[社区求助]
style Start fill:#3b82f6,color:#fff
style End fill:#10b981,color:#fff
style CheckError fill:#f59e0b,color:#fff
style Success fill:#f59e0b,color:#fff
❓ 常见问题 FAQ
Q1: 如何查看 Agent 的执行过程?
使用 stream_mode=["updates"] 查看每个节点的执行,
或使用 LangSmith 可视化追踪。
Q2: Agent 一直不返回结果怎么办?
可能原因:
- 陷入无限循环 - 设置
recursion_limit - 等待模型响应 - 检查网络连接和 API 配额
- 工具执行慢 - 优化工具或添加超时
Q3: 如何调试工具调用失败?
Python
# 1. 直接调用工具测试
result = my_tool.invoke({"param": "value"})
print(result)
# 2. 检查工具定义
print(my_tool.name)
print(my_tool.description)
print(my_tool.args_schema)
# 3. 查看 Agent 的工具调用
for msg in result["messages"]:
if hasattr(msg, "tool_calls"):
print(f"工具调用: {msg.tool_calls}")
Q4: 如何减少 Token 消耗?
- 精简系统提示词
- 使用
SummarizationMiddleware摘要历史对话 - 限制工具返回的数据量
- 使用更小的 Embedding 模型
Q5: 生产环境应该监控哪些指标?
| 指标类型 | 具体指标 | 告警阈值 |
|---|---|---|
| 性能 | P95 响应时间 | > 5s |
| 可靠性 | 错误率 | > 1% |
| 成本 | 每日 Token 消耗 | 超出预算 |
| 质量 | 用户满意度 | < 4.0/5.0 |
📋 错误代码速查表
| 错误类型 | 常见错误 | 快速修复 |
|---|---|---|
| ModuleNotFoundError | langchain 未安装 | pip install langchain |
| ImportError | 导入路径错误 | 检查导入语句 |
| AuthenticationError | API 密钥无效 | 设置正确的环境变量 |
| RateLimitError | API 配额超限 | 添加重试逻辑或升级计划 |
| TimeoutError | 请求超时 | 增加 timeout 参数 |
| ValueError | 参数值错误 | 检查参数类型和范围 |
| KeyError | 字段不存在 | 检查状态结构和上下文 |
| ValidationError | 工具参数验证失败 | 添加类型提示和验证 |