使用create_react_agent创建React Agent报错:'str'无input_variables属性
问题原因及解决方案
核心问题:变量名冲突
代码存在变量名重复问题:一开始通过prompt=hub.pull("hwchase17/react")获取了LangChain的PromptTemplate对象,但后续用if prompt:=st.chat_input(...)将prompt变量覆盖成了用户输入的字符串。调用create_react_agent(model, tools, prompt)时,传入的是字符串而非PromptTemplate对象,因此触发'str' object has no attribute 'input_variables'错误。修复步骤
- 修改chat_input的变量名,避免覆盖PromptTemplate对象:将
if prompt:=st.chat_input(...)改为if user_prompt:=st.chat_input(...),同步修改后续所有相关引用。 - 修复消息角色拼写错误:将
assisstant改为assistant(session_state初始消息中的角色字段)。 - 正确处理AgentExecutor返回结果:
search_agent.invoke()返回的是包含output键的字典,需提取response['output']作为助手回复内容,而非直接使用整个字典。 - 调整invoke参数:REACT Agent的Prompt期望接收单个
input变量,因此调用search_agent.invoke()时需传入{"input": user_prompt}而非完整消息列表。
- 修改chat_input的变量名,避免覆盖PromptTemplate对象:将
修复后的完整代码
import streamlit as st from langchain_groq import ChatGroq from langchain_community.tools import DuckDuckGoSearchRun from langchain.agents import AgentExecutor, create_react_agent from langchain_community.callbacks.streamlit import StreamlitCallbackHandler from langchain import hub import os from dotenv import load_dotenv load_dotenv() os.environ['GROQ_API_KEY'] = os.getenv("GROQ_API_KEY") search = DuckDuckGoSearchRun(name="Search") prompt = hub.pull("hwchase17/react") st.title("🔎 LangChain - Chat with search") if "messages" not in st.session_state: st.session_state["messages"] = [ {"role":"assistant","content":"Hi,I'm a chatbot who can search the web. How can I help you?"} ] for msg in st.session_state.messages: st.chat_message(msg["role"]).write(msg['content']) if user_prompt := st.chat_input(placeholder="What is machine learning?"): st.session_state.messages.append({"role":"user","content":user_prompt}) st.chat_message("user").write(user_prompt) model = ChatGroq(model_name="Llama3-8b-8192", streaming=True) tools = [search] agent = create_react_agent(model, tools, prompt) search_agent = AgentExecutor(agent=agent, tools=tools) with st.chat_message("assistant"): st_cb = StreamlitCallbackHandler(st.container(), expand_new_thoughts=False) response = search_agent.invoke({"input": user_prompt}, callbacks=[st_cb]) assistant_response = response['output'] st.session_state.messages.append({'role':'assistant',"content":assistant_response}) st.write(assistant_response)
内容的提问来源于stack exchange,提问作者Faraz Fazal
相关产品推荐
相关产品推荐

