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

如何将AgentExecutor(ReAct)反馈解析并流式输出到Streamlit?

解决方案

1. 自定义回调捕获Agent中间输出

通过LangChain的回调机制,捕获Agent运行时的每一步思考、动作及输入,替代默认的终端日志输出:

from langchain.callbacks.base import BaseCallbackHandler
import streamlit as st

class StreamlitCallbackHandler(BaseCallbackHandler):
    def __init__(self, placeholder):
        self.placeholder = placeholder
        self.full_response = ""

    def on_agent_action(self, action, **kwargs):
        # 提取并格式化思考、动作、动作输入
        thought_part = action.log.split('Action:')[0].strip()
        action_text = f"**思考:** {thought_part}\n**动作:** {action.tool}\n**动作输入:** {action.tool_input}\n\n"
        self.full_response += action_text
        self.placeholder.markdown(self.full_response + "▌")

    def on_agent_finish(self, finish, **kwargs):
        # 捕获最终回答
        finish_text = f"**最终答案:** {finish.return_values['output']}\n"
        self.full_response += finish_text
        self.placeholder.markdown(self.full_response)

2. 调整Agent初始化配置

关闭默认的verbose终端输出,避免冗余日志:

# 修改原Agent定义部分
agent = ZeroShotAgent(llm_chain=llm_chain, tools=tools, verbose=False, output_parser=output_parser)
agent_chain = AgentExecutor.from_agent_and_tools(
    agent=agent, tools=tools, verbose=False, memory=memory
)

3. 改造Streamlit调用逻辑

使用自定义回调将Agent输出流式渲染到前端:

if prompt := st.chat_input("What is up?"):
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

    with st.chat_message("assistant"):
        message_placeholder = st.empty()
        # 初始化回调处理器
        callback_handler = StreamlitCallbackHandler(message_placeholder)
        # 运行Agent并传入回调
        result = agent_chain.invoke(
            {"input": prompt},
            {"callbacks": [callback_handler]}
        )
        # 保存最终结果到会话历史
        st.session_state.messages.append({"role": "assistant", "content": result["output"]})

关键说明

  • 回调类通过on_agent_action捕获每一步执行细节,on_agent_finish捕获最终结果,实时更新Streamlit占位符实现流式效果。
  • 若使用低版本LangChain,可将invoke替换为run,保持callbacks参数传入即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:53:25