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

