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

NeMo Guardrails自定义动作DetectLanguageAction未识别问题求助

问题

在NeMo Guardrails(v0.14)中实现自定义动作时,遇到自定义动作DetectLanguageAction无法被识别的错误,无论使用register还是@action装饰器都无法解决。项目结构包含同目录下的config.yml、rails.co、actions.py,相关代码及错误信息如下:

代码片段

actions.py

from langdetect import detect

@action(name="DetectLanguageAction")
async def detect_language(userMessage: str):
    try:
        language = detect(userMessage)
        print(f"Detected language: {language}")  # 调试用
        return language
    except Exception as e:
        # 调试用
        print(f"Error detecting language: {e}. Returning 'en'.")
        return "en"

rails.co

define bot respond with language restriction english
    "Unfortunately, I currently support communication only in Ukrainian and English. Could you please rephrase your request in one of those languages?"

define bot respond with language restriction ukrainian
    "Вибачте, я підтримую спілкування тільки українською та англійською мовами. Будь ласка, переформулюйте свій запит однією з цих мов."

define flow language_validation
    $language = DetectLanguageAction($userMessage)
    if $language == "ru" or $language == "mk"
        bot respond with language restriction ukrainian
    else if $language != "en" and $language != "uk"
        bot respond with language restriction english
    else
        bot pass

config.yml

models:
  - type: main
    engine: openai
    model: gpt-3.5-turbo-instruct

rails:
  flows:
    - language_validation

错误信息

[agent] [backend] File "/app/venv/lib/python3.11/site-packages/nemoguardrails/colang/v1_0/runtime/eval.py", line 71, in eval_expression
[agent] [backend] raise Exception(f"Error evaluating '{expr}': {str(ex)}")
[agent] [backend] Exception: Error evaluating 'DetectLanguageAction($userMessage)': Function 'DetectLanguageAction' not defined, for expression 'DetectLanguageAction(var_userMessage)'.
[agent] [backend] An error occurred: Error evaluating 'DetectLanguageAction($userMessage)': Function 'DetectLanguageAction' not defined, for expression 'DetectLanguageAction(var_userMessage)'.

环境:Python 3.9(venv),NeMo Guardrails v0.14。

解决方案

1. 修正action装饰器的导入路径

@action装饰器必须从nemoguardrails.actions模块导入,修改actions.py的导入语句:

from nemoguardrails.actions import action
from langdetect import detect

@action(name="DetectLanguageAction")
async def detect_language(userMessage: str):
    # 原有逻辑保持不变

2. 手动注册自定义动作

若自动加载机制失效,需在初始化Guardrails的代码中显式导入并注册动作:

from nemoguardrails import RailsConfig, LLMRails
from actions import detect_language

# 加载当前目录的配置文件
config = RailsConfig.from_path(".")
# 创建Guardrails实例
rails = LLMRails(config)
# 注册自定义动作
rails.register_action(detect_language, name="DetectLanguageAction")

3. 确保动作名称完全匹配

检查rails.co中调用的动作名称与@action(name="...")定义的名称完全一致,包括大小写、拼写,无多余空格。

4. 配置文件中指定动作路径(可选)

如果自动扫描动作文件失败,在config.yml中添加actions字段指定路径:

models:
  - type: main
    engine: openai
    model: gpt-3.5-turbo-instruct

rails:
  flows:
    - language_validation

actions:
  - actions.py

5. 验证依赖安装

确保langdetect库已正确安装:

pip install langdetect

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:45:10