NeMo-Guardrails中‘user_query’未找到错误的原因与解决方法
问题解答:Action 'user_query' not found错误处理
一、为何需要定义user_query参数
你使用的应该是LangChain Rails这类结构化对话框架,这类框架的核心机制是将用户请求映射到预定义的**action(动作)**上。错误提示说明你的框架配置中,没有把用户的提问关联到对应的处理逻辑——框架默认尝试调用名为user_query的action来处理用户消息,但这个动作并未被定义,所以抛出了找不到的错误。
简单来说,这类框架不是直接让模型生成自由回复,而是要求你明确指定如何处理用户的各类查询,user_query就是框架期望你定义的、用于处理普通用户提问的动作标识。
二、具体定义方法
你需要先编写一个处理用户查询的函数,将其注册为名为user_query的action,再通过框架调用。以下是修改后的完整代码:
import nest_asyncio from langchain_core.tools import tool from langchain.agents import AgentExecutor, create_structured_chat_agent from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate # 1. 定义处理用户查询的action函数 @tool def user_query(query: str) -> str: """处理用户的普通查询,生成对应回复""" # 这里可直接调用OpenAI模型生成回复,或添加自定义逻辑 llm = ChatOpenAI(model="gpt-3.5-turbo") return llm.invoke(f"用户提问:{query}").content # 2. 设置prompt和agent prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个助手,负责处理用户的各种查询。"), ("user", "{input}"), ("agent_scratchpad", "{agent_scratchpad}") ]) llm = ChatOpenAI(model="gpt-3.5-turbo") agent = create_structured_chat_agent(llm, [user_query], prompt) agent_executor = AgentExecutor(agent=agent, tools=[user_query], verbose=True) # 3. 应用异步补丁并执行查询 nest_asyncio.apply() new_message = agent_executor.invoke({"input": "Hello! What can you do for me?"}) print(new_message)
关键说明
- 用
@tool装饰器标记函数,将其注册为框架可识别的action,函数名user_query必须与框架期望的动作名称一致。 - 函数内部可以直接调用OpenAI模型生成回复,也可以加入自定义业务逻辑。
- 最后通过
AgentExecutor执行用户查询,替代原来直接调用rails.generate的方式。
内容的提问来源于stack exchange,提问作者NiMa
相关产品推荐
相关产品推荐

