You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在LangChain中创建create_sql_agent时,如何获取prompt、thought与observation?

在LangChain的SQL Agent中获取Prompt、Thought和Observation的方法

默认情况下agent_executor.run()仅返回最终答案,要捕获中间的Prompt、思考过程(Thought)和观察结果(Observation),可以通过以下两种方式实现:

方法1:自定义回调函数捕获全流程信息

通过继承BaseCallbackHandler实现自定义回调器,在Agent运行的各个阶段拦截并记录关键信息:

from langchain.callbacks.base import BaseCallbackHandler
from langchain.schema import AgentAction, AgentFinish
from langchain.agents import create_sql_agent
from langchain.sql_database import SQLDatabase
from langchain.chat_models import OpenAI
from langchain.agents.agent_toolkits import SQLDatabaseToolkit

# 初始化数据库和LLM
dbsql = SQLDatabase.from_uri("your_database_uri")
llm = OpenAI(temperature=0, verbose=True)
toolkit = SQLDatabaseToolkit(llm=llm, db=dbsql)

# 自定义回调处理器
class AgentStepLogger(BaseCallbackHandler):
    def __init__(self):
        self.execution_steps = []

    def on_prompt(self, prompt: str, **kwargs) -> None:
        # 记录初始Prompt
        self.execution_steps.append({"type": "prompt", "content": prompt})

    def on_agent_action(self, action: AgentAction, **kwargs) -> None:
        # 拆分并记录Thought
        thought_content = action.log.split("Action:")[0].strip()
        self.execution_steps.append({"type": "thought", "content": thought_content})
        # 记录工具调用信息
        self.execution_steps.append({
            "type": "tool_call",
            "tool": action.tool,
            "input": action.tool_input
        })

    def on_tool_end(self, output: str, **kwargs) -> None:
        # 记录工具返回的Observation
        self.execution_steps.append({"type": "observation", "content": output})

    def on_agent_finish(self, finish: AgentFinish, **kwargs) -> None:
        # 记录最终结论
        self.execution_steps.append({"type": "finish", "content": finish.log})

# 实例化回调器并创建Agent
step_logger = AgentStepLogger()
agent_executor = create_sql_agent(
    llm=OpenAI(temperature=0),
    toolkit=toolkit,
    verbose=True,
    callbacks=[step_logger]
)

# 执行查询
output = agent_executor.run("MY QUESTION")

# 输出捕获的所有步骤
for step in step_logger.execution_steps:
    print(f"[{step['type'].upper()}] {step['content']}")

方法2:使用invoke方法获取完整运行轨迹

agent_executor.invoke()会返回包含中间步骤的完整结果字典,其中intermediate_steps字段存储了所有(AgentAction, Observation)元组:

# 用invoke替代run执行查询
result = agent_executor.invoke({"input": "MY QUESTION"})

# 提取最终答案
print(f"最终答案: {result['output']}")

# 解析并输出中间步骤
print("\n=== 中间执行详情 ===")
for action, observation in result["intermediate_steps"]:
    # 从action.log中提取Thought内容
    thought = action.log.split("Action:")[0].strip()
    print(f"思考: {thought}")
    print(f"调用工具: {action.tool},输入参数: {action.tool_input}")
    print(f"观察结果: {observation}\n")

步骤可视化示例

基于捕获的步骤数据,可以快速实现文本形式的可视化:

def visualize_execution(steps):
    print("=== Agent执行流程可视化 ===")
    step_count = 1
    for step in steps:
        match step["type"]:
            case "prompt":
                print(f"📝 初始Prompt:\n{step['content']}\n")
            case "thought":
                print(f"💡 第{step_count}轮思考: {step['content']}")
            case "tool_call":
                print(f"🔧 调用工具: {step['tool']},输入: {step['input']}")
            case "observation":
                print(f"👀 观察结果: {step['content']}\n")
                step_count +=1
            case "finish":
                print(f"🏁 最终结论: {step['content']}")

# 使用回调器捕获的步骤进行可视化
visualize_execution(step_logger.execution_steps)

内容的提问来源于stack exchange,提问作者peterlandis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:02:45