结合 RAG 使用 AI Agent
背景
在大语言模型(LLM)各场景应用实际落地时,依靠单一 LLM 输入输出往往达不到预期效果,经常会遇到 AI 出错、乱答等准确性问题,甚至对业务产生危害。
使用“外挂知识库”的方式可以有效优化这些 LLM 面临的问题。而 RAG(Retrieval-Augmented Generation,检索增强生成)技术就是其中一种。
本文将介绍如何结合 RAG 使用 AI Agent,为 AI Agent 的外挂知识库提供支持。
方案
实现方案如下图所示:
- 用户说话通过 ZEGO Express SDK 将语音流推到 ZEGO 实时音视频云
- AI Agent 后台收到语音流后,将语音流转换为文本后按 OpenAI 规范向您自定义的 LLM 服务发起 ChatCompletion 请求
- 您自定义的 LLM 服务在收到请求后进行 RAG 检索,将检索到的片段结合用户最新问题作为输入调用 LLM 生成流式响应
- AI Agent 后台将 LLM 的流式响应转换为语音流,通过实时音视频云推流到客户端,客户就听到 AI Agent 的回答了

- 图中“意图识别”和“问题增强”步骤不是必要的,但是为了提高 AI Agent 的回答准确性,建议您实现这两个步骤。
- 图中我们可以看到与“RAG 查询”步骤并列的还有“联网搜索”等步骤,这些步骤是可选的,您可以根据您的业务需求仿照 RAG 查询流程实现。
- 图中 LLM_A、LLM_B、LLM_C 旨在说明您在各个节点可以根据性能及成本考虑使用不同的 LLM 厂商模型,当然您也可以使用同一个 LLM 厂商模型。
示例代码
以下是接入实时互动 AI Agent API 的业务后台示例代码,您可以参考示例代码来实现自己的业务逻辑。
包含最基本的获取 ZEGO Token、注册智能体、创建智能体实例、删除智能体实例等能力。
以下是客户端示例代码,您可以参考示例代码来实现自己的业务逻辑。
包含最基本的登录、推流、拉流、退出房间等能力。
包含最基本的登录、推流、拉流、退出房间等能力。
包含最基本的登录、推流、拉流、退出房间等能力。
包含最基本的登录、推流、拉流、退出房间等能力。
以下视频演示了如何跑通服务端和客户端(iOS)示例代码并跟智能体进行语音互动。
- 服务端必须部署到可以访问的公网环境,不要使用 localhost 或者局域网地址。
- 部署时环境变量必须使用 rag 分支的环境变量。
实现服务端功能
实现 RAG 查询
要实现 RAG 查询我们有多种方案。以下是一些常见方案:
本文以 RAGFlow 和 阿里云百炼为例介绍实现方式。
实现自定义 LLM
创建符合 OpenAI API 协议的接口。
注册智能体并使用自定义 LLM
在注册智能体(RegisterAgent)时,设置使用自定义 LLM URL,并在 SystemPrompt
中要求 LLM 根据知识库内容回答用户问题。
// 请将以下示例中的 LLM 和 TTS 的 ApiKey、appid、token 等鉴权参数换成你实际的鉴权参数。
async registerAgent(agentId: string, agentName: string) {
// 请求接口:https://aigc-aiagent-api.zegotech.cn?Action=RegisterAgent
const action = 'RegisterAgent';
// !mark(4:9)
const body = {
AgentId: agentId,
Name: agentName,
LLM: {
Url: "https://your-custom-llm-service/chat/completions",
ApiKey: "your_api_key",
Model: "your_model",
SystemPrompt: "请根据用户提供的知识库内容用友好的语气回答用户问题,如果用户的问题不在知识库中,请礼貌的告诉用户我们没有相关的知识库内容。"
},
TTS: {
Vendor: "ByteDance",
Params: {
"app": {
"appid": "zego_test",
"token": "zego_test",
"cluster": "volcano_tts"
},
"audio": {
"voice_type": "zh_female_wanwanxiaohe_moon_bigtts"
}
}
}
};
// sendRequest 方法封装了请求的 URL 和公共参数。详情参考:https://doc-zh.zego.im/aiagent-server/api-reference/accessing-server-apis
return this.sendRequest<any>(action, body);
}
创建智能体实例
使用已注册的智能体为模板 创建多个智能体实例 加入不同房间与不同用户进行实时互动。创建智能体实例后,智能体实例会自动登录房间并推流,同时也会拉真实用户的流。
创建智能体实例成功后,真实用户在客户端监听流变化事件并拉流就可以与智能体进行实时互动了。
以下是调用创建智能体实例接口的示例:
async createAgentInstance(agentId: string, userId: string, rtcInfo: RtcInfo, messages?: any[]) {
// 请求接口:https://aigc-aiagent-api.zegotech.cn?Action=CreateAgentInstance
const action = 'CreateAgentInstance';
const body = {
AgentId: agentId,
UserId: userId,
RTC: rtcInfo,
MessageHistory: {
SyncMode: 1, // Change to 0 to use history messages from ZIM
Messages: messages && messages.length > 0 ? messages : [],
WindowSize: 10
}
};
// sendRequest 方法封装了请求的 URL 和公共参数。详情参考:https://doc-zh.zego.im/aiagent-server/api-reference/accessing-server-apis
const result = await this.sendRequest<any>(action, body);
console.log("create agent instance result", result);
// 在客户端要保存返回的 AgentInstanceId ,用于后续删除智能体实例。
return result.AgentInstanceId;
}
完成这一步骤后,您已经成功创建了一个智能体实例。集成客户端后可与该智能体实例进行语音互动。
实现客户端功能
请参考以下文档完成客户端的集成开发:
快速开始
快速开始
快速开始
快速开始
恭喜您🎉!完成这一步骤后,您已经成功集成客户端 SDK 并可以与智能体实例进行实时语音互动了。您可以用语音问智能体任何问题,智能体都会在查询知识库后回答您的问题!