拒绝AI幻觉与跑题:利用CrewAI护栏机制掌控智能体输出质量

拒绝AI幻觉与跑题:利用CrewAI护栏机制掌控智能体输出质量

文章目录

  • 什么是任务护栏?
  • 1. 基于函数的防护机制
  • 2. 基于LLM的防护措施
  • 为什么要使用任务护栏?
  • 1. 质量控制
  • 2. 安全性和合规性
  • 3. 可靠性和可预测性
  • 4. 自动重试逻辑
  • 任务防护机制如何工作?
  • 主要特性和最佳实践
  • 函数式防护机制与LLM防护机制
  • 防护机制链
  • 幻觉防护栏
  • 重试策略
  • 日志记录和可观测性
  • 实践示例:验证产品描述
  • 步骤 1:设置和导入
  • 步骤 2:定义验证函数
  • 步骤 3:定义代理和任务
  • 步骤 4:执行工作流
  • 步骤 5:显示输出
  • 小结
  • 常见问题解答

拒绝AI幻觉与跑题:利用CrewAI护栏机制掌控智能体输出质量插图

随着人工智能变得越来越智能,智能体现在可以处理复杂的任务。人们在整个工作流程中做出决策,效率很高,出发点也很好,但永远无法做到完美无缺。很容易出现偏离任务、过度解释、解释不足、误解提示,或者给后续工作带来麻烦的情况。有时,结果会偏离主题、不完整,甚至存在安全隐患。随着这些智能体开始承担实际工作,我们需要一种机制来检查它们的输出,然后再允许它们继续执行。这正是 CrewAI 开发任务护栏功能的原因之一。护栏为每个任务设定了相同的预期:长度、语气、质量、格式和准确性都由规则明确规定。如果智能体偏离了护栏,系统会温和地纠正方向,并强制智能体重试。这有助于稳定工作流程。护栏将帮助智能体从始至终保持正轨、一致性和可靠性。

什么是任务护栏?

在 CrewAI 中,任务护栏是应用于特定任务的验证检查。任务防护机制会在 AI 代理完成任务相关输出后立即运行。AI 生成输出后,如果符合您的规则,我们将继续执行工作流程中的下一步操作。否则,我们将停止执行或根据您的配置重试。

您可以将防护机制想象成一个过滤器。代理完成其工作后,在工作对其他任务产生影响之前,防护机制会检查代理的工作。它是否符合预期格式?是否包含所需的关键字?是否足够长?是否相关?是否满足安全标准?只有当工作符合这些参数后,工作流程才会继续。

CrewAI 提供两种类型的防护机制来帮助您确保工作流程的合规性:

1. 基于函数的防护机制

这是最常用的方法。您只需用 Python 编写一个函数来检查代理的输出即可。该函数将返回:

  • 如果输出有效,则返回 True
  • 如果输出无效,则返回 False 并提供可选反馈

基于函数的防护措施最适合基于规则的场景,例如:

  • 字数统计
  • 必需短语
  • JSON 格式
  • 格式验证
  • 关键词检查

例如,您可以这样写:“Output must include the phrases electric kettle and be at least 150 words long.” 

2. 基于LLM的防护措施

这些防护措施利用 LLM 来评估代理的输出是否满足一些不太严格的标准,例如:

  • 语气
  • 风格
  • 创意
  • 主观质量
  • 专业性

无需编写代码,只需提供一段文本描述,例如:“确保文字友好,不使用俚语,并且适合一般受众。” 然后,模型将检查输出并判断其是否合格。

这两种类型都很强大。您甚至可以将它们结合起来,实现分层验证。

为什么要使用任务护栏?

AI 工作流程中存在护栏的原因有很多,而且都很重要。以下是它们的典型用途:

1. 质量控制

AI 生成的输出质量可能参差不齐,因为一个提示可能产生非常好的响应,而下一个提示则可能完全偏离目标。护栏有助于控制输出质量,因为它们设定了最低输出标准。如果输出太短、与请求无关或组织混乱,护栏会确保采取相应措施。

2. 安全性和合规性

某些工作流程需要严格的准确性。这条经验法则在医疗保健、金融、法律或企业用例中尤为重要。护栏用于防止出现幻觉和违反准则的不安全合规输出。CrewAI 内置了“幻觉护栏”,它会寻找基于事实的内容来增强安全性。

3. 可靠性和可预测性

在多步骤工作流中,一个错误的输出可能会导致下游所有步骤崩溃。例如,一个查询的输出格式错误可能会导致另一个代理的查询崩溃。防护机制可以防止无效输出,从而建立可靠且可预测的流程。

4. 自动重试逻辑

如果您不想手动修复输出,您可以让 CrewAI 自动重试。如果防护机制失效,CrewAI 最多可以重试两次输出信息。此功能可以创建弹性工作流,并减少工作流运行期间所需的人工干预。

任务防护机制如何工作?

任务防护机制

CrewAI 的任务防护机制提供了一个简单而强大的流程。代理执行任务并生成输出,然后防护机制被激活并接收输出。防护机制会根据您配置的规则检查输出结果。如果输出结果通过了防护机制的检查,则工作流继续执行。如果输出结果未能通过防护机制的检查,防护机制会尝试触发重试或生成错误。您可以通过定义最大重试次数、重试间隔和自定义消息来定制重试机制。CrewAI 会记录每次尝试,并提供工作流每个步骤的详细操作信息。这种循环有助于确保系统保持稳定,提高准确性,并使工作流整体更加可靠。

主要特性和最佳实践

函数式防护机制与LLM防护机制

对于显式规则,请使用基于函数的防护机制。对于可能存在主观判断的连接点,请使用基于 LLM 的防护机制。

防护机制链

您可以运行多个防护机制。

  1. 长度检查
  2. 关键词检查
  3. 语气检查
  4. 格式检查

如果所有检查都通过,工作流程将继续。

幻觉防护栏

为了实现更基于事实的工作流程,请使用 CrewAI 内置的幻觉防护栏。它会将输出与上下文参考进行比较,并检测是否标记了不支持的声明。

重试策略

谨慎设置重试次数限制。重试次数越少,工作流程越严格;重试次数越多,则更具创造性。

日志记录和可观测性

CrewAI 显示:

  • 失败内容
  • 失败原因
  • 成功尝试

这有助于您调整防护栏。

实践示例:验证产品描述

在本示例中,我们将演示防护栏如何在接受产品描述之前对其进行检查。要求很明确:产品描述必须至少包含 150 个单词,包含“electric kettle”一词,并符合规定的格式。

步骤 1:设置和导入

在此步骤中,我们将安装 CrewAI、导入库并加载 API 密钥。这样可以正确设置所有变量,以便代理能够运行并异步连接到所需的工具。

%pip install -U -q crewai crewai-tools
from crewai import Agent, Task, LLM, Crew, TaskOutput
from crewai_tools import SerperDevTool
from datetime import date
from typing import Tuple, Any
import os, getpass, warnings
warnings.filterwarnings("ignore")
SERPER_API_KEY = getpass.getpass('Enter your SERPER_API_KEY: ')
OPENAI_API_KEY = getpass.getpass('Enter your OPENAI_API_KEY: ')
if SERPER_API_KEY and OPENAI_API_KEY:
    os.environ['SERPER_API_KEY'] = SERPER_API_KEY
    os.environ['OPENAI_API_KEY'] = OPENAI_API_KEY
print("API keys set successfully!")

步骤 2:定义验证函数

接下来,您需要定义一个函数来验证代理的输出。该函数可以检查输出是否包含“electric kettle”,并统计输出单词的总数。如果未找到预期文本或输出过短,则返回失败响应。如果描述输出正确,则返回成功响应。

def validate_product_description(result: TaskOutput) -> Tuple[bool, Any]:
text = result.raw.lower().strip()
    word_count = len(text.split())
if "electric kettle" not in text:
        return (False, "Missing required phrase: 'electric kettle'")
if word_count < 150:
        return (False, f"Description too short ({word_count} words). Must be at least 150.")
return (True, result.raw.strip())

步骤 3:定义代理和任务

最后,您需要定义之前创建的用于编写描述的代理。为其指定角色和目标。接下来,定义任务并添加安全机制。如果代理输出失败,任务将最多重试 3 次。

llm = LLM(model="gpt-4o-mini", api_key=OPENAI_API_KEY)
product_writer = Agent(
role="Product Copywriter",
goal="Write high-quality product descriptions",
backstory="An expert marketer skilled in persuasive descriptions.",
tools=[SerperDevTool()],
    llm=llm,
verbose=True
)
product_task = Task(
description="Write a detailed product description for {product_name}.",
    expected_output="A 150+ word description mentioning the product name.",
agent=product_writer,
markdown=True,
guardrail=validate_product_description,
    max_retries=3
)
crew = Crew(
agents=[product_writer],
tasks=[product_task],
verbose=True
)

步骤 4:执行工作流

您启动任务。代理程序编写产品描述。防护机制对其进行评估。如果评估失败,代理程序将创建新的描述。此过程持续进行,直到输出通过评估或达到最大迭代次数为止。

results = crew.kickoff(inputs={"product_name": "electric kettle"}) 
print("\n Final Summary:\n", results)

执行工作流

步骤 5:显示输出

最后,您将显示通过了所有检查的正确输出。这是符合所有要求的已验证产品描述。

from IPython.display import display, Markdown
display(Markdown(results.raw))

符合所有要求的已验证产品描述

一些实用建议

  • 务必明确您的 expected_output
  • 不要设置过于严格的防护规则。
  • 记录失败原因。
  • 尽早使用防护规则,避免对下游造成损害。
  • 测试边界情况。

防护规则应该保护您的工作流程,而不是阻碍它。

小结

任务防护规则是 CrewAI 中最重要的功能之一。防护规则确保多代理工作流程的安全性、准确性和一致性。防​​护规则在输出流向下游之前对其进行验证;因此,它们是构建强大且可靠的 AI 系统的基础功能。无论是构建自动写入器、分析管道还是决策框架,防护规则都能创建一个质量层,帮助保持所有环节的一致性。最终,防护规则确保自动化流程从始至终更加流畅、安全和可预测。

常见问题解答

问 1:为什么要在 CrewAI 中使用任务防护规则?

答:它们可以确保输出的一致性、安全性和可用性,避免一次错误的响应破坏整个工作流程。

问 2:基于功能的防护规则和基于 LLM 的防护规则有什么区别?

答:基于功能的防护规则检查长度或关键词等严格规则,而基于 LLM 的防护规则则处理语气、风格和主观质量。

问 3:当防护规则失效时,重试机制如何运作?

答:CrewAI 可以自动重新生成输出,直到达到您设定的重试次数上限,直到满足规则或重试次数用尽为止。

评论留言

闪电侠

(工作日 10:00 - 18:30 为您服务)

2025-12-13 14:36:09

您好,无论是售前、售后、意见建议……均可通过联系工单与我们取得联系。

您也可选择聊天工具与我们即时沟通或点击查看:

您的工单我们已经收到,我们将会尽快跟您联系!
取消
选择聊天工具: