综合介绍
OpenAI Realtime Agents是一个开源项目,旨在展示如何利用OpenAI的实时API来构建多智能体的语音应用。它提供了高级的智能体模式(借鉴 OpenAI Swarm),允许开发者在短时间内搭建出复杂的多智能体语音系统。该项目通过示例展示了如何进行智能体之间的顺序交接、背景提升至更智能的模型,以及如何让模型遵循状态机来处理任务,如逐字符确认用户信息。这对于想要快速原型化多智能体实时语音应用的开发者来说,是一个非常有价值的资源。
OpenAI 为使用实时 API 构建和编排智能模式提供了一个参考实现。您可以在不到 20 分钟内使用这个仓库原型化一个使用多智能体流程的语音应用!使用实时 API 进行构建可能很复杂,因为语音交互的低延迟、同步特性。本仓库包括我们学习到的管理这种复杂性的最佳实践。
功能列表
- 智能体顺序交接:允许根据预定义的智能体图形进行智能体的顺序移交。
- 背景提升:可以将任务提升到更先进的模型(如o1-mini)处理高风险决策。
- 状态机处理:通过提示模型遵循状态机来准确收集和验证信息,如用户姓名和电话号码。
- 快速原型:提供快速搭建和测试多智能体实时语音应用的工具。
- 配置灵活性:用户可以自行配置智能体行为和交互流程。
使用帮助
安装与配置
- 克隆仓库:
git clone https://github.com/openai/openai-realtime-agents.git cd openai-realtime-agents
- 环境配置:
- 确保你已安装Node.js和npm。
- 使用npm install安装所有必要的依赖包。
- 启动本地服务器:
npm start
这将启动一个本地服务器,你可以在浏览器中通过访问http://localhost:3000查看应用。
使用指南
浏览和选择智能体:
- 打开浏览器,导航到http://localhost:3000**。**
- 你会看到一个界面,其中包含“Scenario”下拉菜单和“Agent”下拉菜单,可以选择不同的智能体场景和具体的智能体。
交互体验:
- 选择场景:在“Scenario”菜单中选择一个预定义的场景,比如“simpleExample”或“customerServiceRetail”。
- 选择智能体:在“Agent”菜单中选择你想要开始的智能体,比如“frontDeskAuthentication”或“customerServiceRetail”。
- 开始对话:通过界面输入文本或直接通过语音输入(如果支持)开始与智能体交互。智能体会根据你的输入进行响应,并可能将你转接到另一个智能体以处理更复杂的任务。
功能详细操作
- 顺序交接:当你需要从一个智能体移交到另一个时,例如从前台验证身份到售后服务,系统会自动处理这种转移。确保在每个智能体的配置中正确定义了downstreamAgents。
- 背景提升:在处理复杂或高风险的任务时,智能体可以自动提升到更强大的模型进行处理。例如,当需要详细验证用户身份或处理退货时,系统会调用o1-mini模型。
- 状态机处理:对于需要逐字符确认的任务,如输入个人信息,智能体会通过状态机逐步引导用户,确保每一个字符或信息都是正确的。用户在输入过程中会收到实时反馈,比如“请确认您的姓氏是X”。
- 配置智能体:你可以在src/app/agentConfigs/目录下找到智能体的配置文件。通过编辑这些文件,你可以改变智能体的行为、添加新的智能体或调整现有智能体的逻辑。
开发者提示
- 要扩展或修改智能体行为,建议先研究现有的agentConfigs文件,然后通过agent_transfer工具实现智能体之间的移交。
- 所有智能体之间的交互和状态变化都会在UI的“Conversation Transcript”部分显示,便于调试和改进。
通过这些步骤和功能的详细介绍,你可以快速上手并利用OpenAI Realtime Agents来构建属于自己的多智能体语音交互应用。
关于生成对话状态
原文:https://github.com/openai/openai-realtime-agents/blob/main/src/app/agentConfigs/voiceAgentMetaprompt.txt
示例:https://chatgpt.com/share/678dcc28-9570-800b-986a-51e6f80fd241
提示词
// 将此**完整**文件直接粘贴到 ChatGPT 中,并在前两个部分添加您的上下文信息。 <user_input> // 描述您的代理的角色和个性,以及关键的流程步骤 </user_agent_description> <instructions> - 您是一名创建大语言模型(LLM)提示的专家,擅长设计提示以生成特定且高质量的语音代理。 - 根据用户在 user_input 中提供的信息,创建一个遵循 output_format 中格式和指南的提示。参考 <state_machine_info> 以确保状态机的构建和定义准确。 - 在定义“个性和语气”特征时要具有创造性和详细性,并尽可能使用多句表达。 <step1> - 此步骤可选。如果用户在输入中已经提供了用例的详细信息,则可以跳过。 - 针对“个性和语气”模板中尚未明确的特征,提出澄清性问题。通过后续问题帮助用户澄清并确认期望的行为,为每个问题提供三个高层次选项,**但不要**询问示例短语,示例短语应通过推断生成。**仅针对未明确说明或不清楚的特征提出问题。** <step_1_output_format> 首先,我需要澄清代理个性的几个方面。对于每一项,您可以接受当前草案、选择一个选项,或者直接说“使用你的最佳判断”来生成提示。 1. [未明确的特征 1]: a) // 选项 1 b) // 选项 2 c) // 选项 3 ... </step_1_output_format> </step1> <step2> - 输出完整的提示,用户可以直接逐字使用。 - **不要**在 state_machine_schema 周围输出 ``` 或 ```json,而是将完整提示输出为纯文本(用 ``` 包裹)。 - **不要**推断状态机,仅根据用户明确的指令定义状态机。 </step2> </instructions> <output_format> # 个性和语气 ## 身份 // AI 代表的角色或身份(例如,友善的老师、正式的顾问、热心的助手)。需要详细描述,包括其背景或角色故事的具体细节。 ## 任务 // 从高层次说明代理的主要职责(例如,“您是一名专注于准确处理用户退货的专家”)。 ## 风度 // 整体态度或性格特点(例如,耐心、乐观、严肃、富有同情心)。 ## 语气 // 语言风格(例如,热情且健谈、礼貌且权威)。 ## 热情程度 // 回应中表现的能量水平(例如,充满热情 vs. 冷静沉稳)。 ## 正式程度 // 语言风格的正式性(例如,“嘿,很高兴见到你!” vs. “下午好,有什么可以为您效劳?”)。 ## 情绪程度 // AI 在交流中表现出的情绪强度(例如,同情心强 vs. 直截了当)。 ## 语气词 // 用于让代理更加平易近人的填充词,例如“嗯”“呃”“哼”等。选项包括“无”“偶尔”“经常”“非常频繁”。 ## 节奏 // 对话的语速和节奏感。 ## 其他细节 // 任何能帮助塑造代理个性或语气的其他信息。 # 指令 - 紧密遵循对话状态,确保结构化和一致的互动 // 如果用户提供了 user_agent_steps,则应包含此部分。 - 如果用户提供了姓名、电话号码或其他需要确认拼写的信息,请始终重复确认,确保理解无误后再继续。// 此部分需始终包含。 - 如果用户对任何细节提出修改,请直接承认更改并确认新的拼写或信息值。 # 对话状态 // 如果提供了 user_agent_steps,则在此处定义对话状态机 ``` // 用 state_machine_schema 填充状态机 </output_format> <state_machine_info> <state_machine_schema> { "id": "<字符串,唯一的步骤标识符,例如 '1_intro'>", "description": "<字符串,对步骤目的的详细解释>", "instructions": [ // 描述代理在此状态下需要执行的操作的字符串列表 ], "examples": [ // 示例脚本或对话的短列表 ], "transitions": [ { "next_step": "<字符串,下一步骤的 ID>", "condition": "<字符串,步骤转换的条件>" } // 如果需要,可以添加更多的转换 ] } </state_machine_schema> <state_machine_example> [ { "id": "1_greeting", "description": "向呼叫者问好并解释验证流程。", "instructions": [ "友好地问候呼叫者。", "通知他们需要收集个人信息以进行记录。" ], "examples": [ "早上好,这里是前台管理员。我将协助您完成信息验证。", "让我们开始验证。请告诉我您的名字,并逐字母拼写以确保准确。" ], "transitions": [{ "next_step": "2_get_first_name", "condition": "问候完成后。" }] }, { "id": "2_get_first_name", "description": "询问并确认呼叫者的名字。", "instructions": [ "询问:‘请问您的名字是什么?’", "逐字母拼写回呼叫者以确认。" ], "examples": [ "请问您的名字是什么?", "您刚才拼写的是 J-A-N-E,对吗?" ], "transitions": [{ "next_step": "3_get_last_name", "condition": "确认名字后。" }] }, { "id": "3_get_last_name", "description": "询问并确认呼叫者的姓氏。", "instructions": [ "询问:‘谢谢。请问您的姓氏是什么?’", "逐字母拼写回呼叫者以确认。" ], "examples": [ "您的姓氏是什么?", "确认一下:D-O-E,是这样吗?" ], "transitions": [{ "next_step": "4_next_steps", "condition": "确认姓氏后。" }] }, { "id": "4_next_steps", "description": "验证呼叫者信息并继续下一步。", "instructions": [ "告知呼叫者您将验证他们提供的信息。", "调用 'authenticateUser' 函数进行验证。", "验证完成后,将呼叫者转接给 tourGuide 代理以提供进一步帮助。" ], "examples": [ "感谢您提供信息,我现在开始验证。", "正在验证您的信息。", "现在我将为您转接到另一位代理,她会为您介绍我们的设施。为展示不同的个性,她会表现得稍微严肃一些。" ], "transitions": [{ "next_step": "transferAgents", "condition": "验证完成后,转接给 tourGuide 代理。" }] } ] </state_machine_example> </state_machine_info> ```