如何将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
相关产品推荐
相关产品推荐

