构建智能航空客服系统:基于 Agent Guardrail 的相关性检测
构建智能航空客服系统:基于 Agent Guardrail 的相关性检测
在现代人工智能应用中,确保对话系统能够专注于特定领域并提供相关响应至关重要。本文将介绍如何使用 Agent Guardrail 技术构建一个智能航空客服系统,该系统能够自动检测用户输入是否与航空服务相关,并在检测到无关内容时提供适当的引导。
系统架构概述
系统基于以下几个核心组件:
- Agent 框架:提供智能对话能力
- Guardrail 机制:实现输入内容的相关性检测
- 通义千问模型:作为底层大语言模型
- Pydantic 数据验证:确保数据格式的正确性
环境配置与初始化
首先,我们需要配置系统环境并初始化必要的组件:
from __future__ import annotationsfrom pydantic import BaseModel
import re
import json
from agents import (Agent,GuardrailFunctionOutput,InputGuardrailTripwireTriggered,RunContextWrapper,Runner,TResponseInputItem,input_guardrail,
)from dotenv import load_dotenv
import os
from openai import AsyncOpenAI
from agents import OpenAIChatCompletionsModel, set_tracing_disabled# 加载环境配置
load_dotenv()
QWEN_API_KEY = os.getenv("QWEN_API_KEY")
QWEN_BASE_URL = os.getenv("QWEN_BASE_URL")
QWEN_MODEL_NAME = os.getenv("QWEN_MODEL_NAME")# 初始化通义千问客户端
client = AsyncOpenAI(base_url=QWEN_BASE_URL, api_key=QWEN_API_KEY)
set_tracing_disabled(disabled=True)
qwen_model = OpenAIChatCompletionsModel(model=QWEN_MODEL_NAME, openai_client=client)
环境变量配置
在 .env
文件中配置以下环境变量:
QWEN_API_KEY=你的通义千问API密钥
QWEN_BASE_URL=通义千问API基础地址
QWEN_MODEL_NAME=使用的模型名称
核心组件详解
1. 数据模型定义
我们使用 Pydantic 定义相关性检测的输出格式:
class RelevanceOutput(BaseModel):"""用于相关性守护规则判定的模式。"""reasoning: stris_relevant: bool
这个数据模型包含两个字段:
reasoning
:模型对相关性判断的分析过程is_relevant
:布尔值,表示输入是否与航空服务相关
2. 相关性检测 Agent
核心的相关性检测逻辑封装在专门的 Agent 中:
class RelevanceOutput(BaseModel):"""用于相关性守护规则判定的模式。"""reasoning: stris_relevant: boolguardrail_agent = Agent(name="相关性守护规则",instructions="""判断用户的消息是否与常见的航空公司客服对话(如机票、预订、行李、值机、航班状态、政策、会员计划等)高度无关。重要:你只需评估最新的一条用户消息,不要考虑聊天历史中的任何先前消息。对于类似“Hi”“OK”这类具有对话性质的简单消息是可以的;但如果该消息不是对话性质,则它应当与航空旅行有所关联。请返回一个 JSON 对象,其中包含:- 'reasoning':你对该消息是否与航空客服相关的分析- 'is_relevant':一个布尔值,表示该消息是否相关示例输出:```json{"reasoning": "用户正在询问即将出行的机票预订选项,这与航空公司服务直接相关。","is_relevant": true}```""",model=qwen_model)@input_guardrail(name="相关性守护规则")async def relevance_guardrail(context: RunContextWrapper[None], agent: Agent, input: str | list[TResponseInputItem]) -> GuardrailFunctionOutput:"""用于检查输入是否与航空主题相关的守护规则。"""result = await Runner.run(guardrail_agent, input, context=context.context)print(result.final_output)cleaned_json_str = re.sub(r"```(json)?", "", result.final_output).strip()final_output = json.loads(cleaned_json_str)return GuardrailFunctionOutput(output_info=final_output,tripwire_triggered=not final_output["is_relevant"],)
关键处理步骤:
- 运行检测 Agent:使用
Runner.run()
执行相关性分析 - 清理 JSON 响应:移除可能存在的代码块标记
- 解析 JSON 结果:将字符串响应转换为结构化数据
- 触发条件判断:当
is_relevant
为 False 时触发防护机制
主程序实现
主程序集成了所有组件,提供完整的对话体验:
async def main():agent = Agent(name="客服代理",instructions="你是一名客服代理。你将帮助客户解决他们的问题。",input_guardrails=[relevance_guardrail],model=qwen_model)input_data: list[TResponseInputItem] = []while True:user_input = input("请输入消息:")if user_input == "exit":breakinput_data.append({"role": "user","content": user_input,})try:result = await Runner.run(agent, input_data)print(result.final_output)input_data = result.to_input_list()except InputGuardrailTripwireTriggered:message = "抱歉,我无法帮助处理该问题。请提问与航空旅行相关的内容。"print(message)input_data.append({"role": "assistant","content": message,})if __name__ == "__main__":import asyncioasyncio.run(main())
系统工作流程
正常对话流程
- 用户输入消息
- 系统通过 Guardrail 检测相关性
- 如果相关,客服 Agent 正常回复
- 对话历史更新,继续下一轮对话
防护触发流程
- 用户输入无关消息
- Guardrail 检测到
is_relevant: false
- 抛出
InputGuardrailTripwireTriggered
异常 - 系统返回预设的引导消息
- 引导消息加入对话历史,保持上下文连贯
实际应用场景
相关对话示例
用户:我想查询明天从北京到上海的航班
系统:找到以下航班信息...
(正常处理)用户:行李限额是多少?
系统:经济舱旅客可携带...
(正常处理)
无关对话处理
用户:你能帮我解一道数学题吗?
系统:抱歉,我无法帮助处理该问题。请提问与航空旅行相关的内容。用户:今天天气怎么样?
系统:抱歉,我无法帮助处理该问题。请提问与航空旅行相关的内容。
操作示例
总结
本文介绍的基于 Agent Guardrail 的航空客服系统展示了如何将大语言模型与业务规则相结合,构建既智能又可控的对话系统。通过相关性检测机制,系统能够确保专注于专业领域,提供高质量的服务体验。
这种架构模式可以轻松适配到其他垂直领域,如金融客服、医疗咨询、法律助手等,为构建专业级AI对话系统提供了可靠的技术方案。
参考链接:https://github.com/openai/openai-cs-agents-demo