尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于 Vision Agents 打造实时会议销售教练:Sales Assistant 系统提示词与全栈实现解析

基于 Vision Agents 打造实时会议销售教练:Sales Assistant 系统提示词与全栈实现解析 基于 Vision Agents 打造实时会议销售教练Sales Assistant 系统提示词与全栈实现解析【免费下载链接】Vision-AgentsOpen Vision Agents by Stream. Build voice and vision agents quickly with any model or video provider. Uses Streams edge network for ultra-low latency.项目地址: https://gitcode.com/GitHub_Trending/vi/Vision-Agents导读本文以 Vision Agents 仓库中的examples/09_sales_assistant_example为研究对象完整解析一个实时会议/面试教练AI Meeting CopilotAgent 的实现它静默监听麦克风与系统音频、通过 AssemblyAI 转写对话带说话人区分、由 Gemini 分析对话并生成 1–3 句话的即时行动建议最后以文本形式通过 Stream Chat 推送到半透明悬浮窗全程不发出声音、不被会议其他参与者察觉。读完本文你将掌握该示例的系统提示词instructions设计要点、Agent 组件组装方式、HTTP 服务化运行模式以及如何基于源码将其扩展为支持 RAG 知识库或实时画面分析的生产级方案。一、示例概览一个隐形的实时教练examples/09_sales_assistant_example/目录下的示例实现了一个面向销售通话、面试、团队站会等真实对话场景的 AI 教练组件位置说明Python Agentexamples/09_sales_assistant_example/main.pyVision Agents 后端加入 Stream Video 通话用 AssemblyAI 转写带说话人区分用 Gemini 分析文本并生成建议通过 Stream Chat 回传系统提示词examples/09_sales_assistant_example/instructions.md定义教练 Agent 的角色、行为规则与输出示例依赖声明examples/09_sales_assistant_example/pyproject.toml声明vision-agents及 assemblyai / getstream / gemini 三个插件整体流程见 README用户打开 macOS 悬浮窗并点击Start应用创建 Stream Video 通话并共享屏幕包含系统音频捕获应用通知 Python Agent 服务器加入该通话Agent 转写音频AssemblyAI STT带 diarization 说话人区分并用 Gemini 生成教练建议建议以文本形式经 Stream Chat 通道实时呈现在半透明悬浮窗上。与典型的语音对话 Agent 不同这个示例刻意不启用 TTS教练建议只以文字展示用户在大脑中默读即可不必打扰会议。这也简化了 WebRTC 的建立流程——Agent 只需订阅方subscriber连接无需发布音频轨main.py 的注释明确说明了这一点。二、核心系统提示词如何定义教练人格整个示例的灵魂是 instructions.md。它是 Agent 的系统提示词system prompt通过instructionsRead instructions.md注入 Agent。这一小节逐条拆解它的设计逻辑它本身就构成一套可复用的实时对话教练提示词模板。2.1 角色定义一句话说清职责You are a **Sales Assistant**, a real-time meeting and interview coach.角色声明只有一句话但信息量极大Sales Assistant表明身份real-time meeting and interview coach限定使用场景会议、面试、通话与输出性质实时、教练式。这种身份 场景 行为三合一的角色声明让 LLM 在生成建议时天然代入教练而非会议记录员或参与者视角。2.2 六条行为规则约束生成质量的边界提示词通过 6 条硬性规则约束输出Be concise保持简洁每条建议必须 1–3 句话。理由写得很实在——用户是在对话进行中实时阅读建议根本没时间读段落。Focus on what to say聚焦该说什么不要描述你听到了什么、不要转述会议直接给用户可以开口说的话。Be proactive主动出击有人提问就给出回答建议察觉犹豫就给出自信回应冷场就给出过渡话术。这一条把教练从被动响应升级为主动干预。Use the transcript利用转写稿音频转写文本包含了已说内容用它保持上下文连贯、避免重复已提过的点。Stay invisible保持隐形绝不提及自己、悬浮窗或教练系统建议要像用户自己的内心声音。这是隐形教练体验的关键。Adapt to the scenario适配场景无论求职面试、销售通话、团队站会还是 1-on-1教练风格要随情境调整。第 4 条与第 5 条尤其值得注意前者明确了 Agent 的输入上下文来自转写稿这与main.py中assemblyai.STT(speaker_labelsTrue)的说话人区分能力直接呼应后者则与产品体验强绑定——建议文本最终出现在悬浮窗上规则确保了文字读起来像自己的心声而非AI 外挂。2.3 示例建议给 LLM 的 few-shot 引导- Say: Thats a great point — we saw a 20% improvement after implementing that change. - Mention your experience with distributed systems here. - Ask them: What does success look like for this role in the first 90 days? - Wrap up this point and transition to the pricing discussion.4 条示例覆盖了 4 种典型动作引用数据佐证观点20% 改进、主动亮出自身经历分布式系统经验、向对方发问90 天成功标准、引导对话转场收尾并过渡到价格讨论。这种 few-shot 写法把教练建议具象化为可直接开口的语句而非抽象的指导原则能显著稳定 LLM 的输出形态。三、Agent 组装从提示词到可运行代码main.py 中create_agent函数L28–L43将提示词与各项能力组装成一个Agentagent Agent( edgegetstream_edge.Edge(), agent_userUser(nameSales Assistant, idsales-assistant-agent), instructionsRead instructions.md, llmgemini.LLM(gemini-flash-lite-latest), sttassemblyai.STT(speaker_labelsTrue), )各参数的职责与底层影响edgegetstream_edge.Edge()使用 Stream 的边缘网络插件位于 plugins/getstream/vision_agents/plugins/getstream/stream_edge_transport.py。该 Edge 负责加入 Stream Video 通话并自动把 LLM 响应同步到 Stream Chat 通道——从源码可见create_conversation会以self.channel_typecall.id定位频道并get_or_createstream_edge_transport.py的 L329–L335示例中通道即messaging:{call_id}Flutter 悬浮窗监听该通道即可收到建议。agent_userAgent 以Sales AssistantIDsales-assistant-agent身份出现在通话中。instructionsRead instructions.md引用上文解析的提示词文件这是 SDK 支持的指令加载机制——通过文件名语法把 instructions.md 读入并作为系统提示词。llmgemini.LLM(gemini-flash-lite-latest)选用 Gemini 轻量快速模型做对话分析与建议生成适合对延迟敏感、输出文本短的场景。sttassemblyai.STT(speaker_labelsTrue)AssemblyAI 转写并开启说话人标签diarization为使用转写稿、避免重复的规则第 4 条提供支撑。从流水线类型看这是非实时transcribingSTT LLM 流水线STT 先把整段音频转成文本再交给 LLM 分析而不是实时流式对话。配套的核心实现位于 agents-core/vision_agents/core/agents/inference/transcribing_flow.py、llm_turn.py等。四、会话生命周期join_call 与持续教练join_call函数main.py定义了 Agent 加入通话后的完整生命周期async with agent.join(call): prompt ( Listen to the conversation. Provide real-time coaching suggestions — tell the user what to say next. Keep every suggestion to 1-3 sentences. ) if _meeting_context: prompt fMeeting context: {_meeting_context}\n\n{prompt} await agent.simple_response(prompt) await agent.finish()关键设计agent.create_call(call_type, call_id)根据应用传入的通话类型与 ID 建立通话对象Agent.create_call定义于 agents-core/vision_agents/core/agents/agents.py 附近。agent.join(call)以异步上下文管理器的方式加入通话__aenter__时组件启动STT、LLM、Edge 依次初始化__aexit__时统一清理。agent.simple_response(prompt)发出初始提示后返回。此后STT 轮次检测turn detection会自动触发后续的 simple_response 调用——这正是持续教练的实现机制只要有人说话并停顿就会生成新一轮建议无需手写轮询循环。agent.finish()阻塞保持 Agent 存活直到通话结束。join_call与create_agent一起被包装进AgentLauncher最终由Runner驱动main.pyrunner Runner( AgentLauncher( create_agentcreate_agent, join_calljoin_call, ) )Runner类agents-core/vision_agents/core/runner/runner.py提供三种驱动方式run()单 Agent 控制台模式、serve()HTTP 服务器按需为通话孵化 Agent、cli()Click 命令行入口暴露run/serve子命令。五、服务化运行HTTP 服务器与两个辅助端点示例以 HTTP 服务器模式运行main.py的 docstringuv run main.py serve --host 0.0.0.0 --port 8000在if __name__ __main__块中示例通过runner.fast_api额外注册了两个端点main.pyPUT /context在开启会话前由 Flutter 应用写入会议上下文如候选人简历、销售对象背景。该上下文会被拼进join_call的初始 prompt 中Meeting context: {context}实现带背景知识的教练。GET /auth/token?user_id...为 Flutter 客户端签发 Stream 用户 token 并返回apiKey保证客户端与 Agent 使用同一 Stream 应用凭据。说明README 中提及 macOS 应用会调用POST /sessions开启教练会话该路由由Runner.serve内置的 HTTP API/sessions等提供位于 agents-core/vision_agents/core/runner/http/api.py。Runner.serve的 host/port 参数默认127.0.0.1:8000runner.py如需对外暴露需显式传入--host 0.0.0.0。serve子命令还支持--agents-log-level、--http-log-level、--debug、--no-splash等选项便于调试与日志分级runner.py。六、环境准备与依赖前置条件来自 READMEmacOS 13.0悬浮窗客户端侧Python 3.12推荐使用 uv 包管理器三个 API KeyStreamVideo API key secret、Google AI StudioGemini、AssemblyAISTT。依赖声明pyproject.tomldependencies [ python-dotenv1.0, vision-agents, vision-agents-plugins-assemblyai, vision-agents-plugins-getstream, vision-agents-plugins-gemini, getstream, ]其中三个插件通过[tool.uv.sources]以可编辑editable路径指向仓库内的plugins/assemblyai、plugins/getstream、plugins/gemini核心库指向agents-core便于在仓库内直接开发调试。启动步骤# 1. 复制并填写 API Key cp examples/09_sales_assistant_example/.env.example .env # 仓库内示例以 env.example 形式提供 # 2. 安装依赖 uv sync # 3. 启动 Agent HTTP 服务器 uv run main.py serve服务器监听http://localhost:8000。macOS 悬浮窗客户端独立仓库vision-agents-sales-assistant-demo启动后点击Start即开始一次教练会话Stop结束会话。整个使用链路中悬浮窗负责听与显示本示例负责分析与会话两者通过 Stream 的 Video Chat 能力衔接。七、扩展路径RAG 知识库与实时画面分析README 给出了两条官方认可的扩展方向7.1 接入 RAG / 自定义知识库The agent can be extended with RAG and custom knowledge bases to tailor suggestions to your product, company playbook, or deal context.即把提示词中的通用教练升级为懂你产品的教练将产品手册、销售打法、客户背景等注入知识库让建议贴合你的业务。仓库已提供 RAG 相关的插件实现如plugins/qdrant、plugins/turbopuffer可与本示例的上下文注入机制组合使用。7.2 切换为实时画面分析模式Tip:To add screen analysis, swapgemini.LLMforgemini.Realtime(fps3). Note that Realtime mode also outputs audio, so the agent would speak its suggestions aloud in addition to writing them to chat.若想让教练看见共享屏幕例如监控演示文稿、观察对方视频画面可将gemini.LLM(gemini-flash-lite-latest)替换为gemini.Realtime(fps3)。需要留意两点一是fps3指定每秒分析 3 帧画面会带来更高算力消耗二是 Realtime 模式会同时输出音频Agent 除了把建议写入 Chat还会把建议朗读出来——这改变了隐形教练的体验需要权衡是否开启。八、源码级佐证建议如何从 LLM 到达悬浮窗把整条链路在源码层面串起来转写assemblyai.STT(speaker_labelsTrue)产生带说话人标签的文本作为 LLM 的上下文输入对应规则第 4 条Use the transcript。分析gemini.LLM依据 instructions.md 生成 1–3 句建议文本。回传getstream_edge.Edge的create_conversation在messaging:{call_id}频道上get_or_create聊天通道stream_edge_transport.pySDK 自动将 LLM 响应同步进该 Chat 通道悬浮窗订阅该通道即可实时渲染建议。无需 TTS因为没有音频输出Agent 的 WebRTC 连接只需 subscriber PC实现被显著简化见create_agent注释。这一设计验证了instructions.md中Stay invisible的产品意图建议以文本抵达、以内心独白的形式呈现Agent 在整个会议中始终处于在场但不发声的状态。结语examples/09_sales_assistant_example是一个小体量、高完成度的参考实现核心提示词 instructions.md 用一套精炼的角色声明、六条规则与四个 few-shot 示例把通用 LLM 塑造成克制的实时教练main.py 则以约 110 行代码完成 Agent 组装、通话生命周期管理与 HTTP 服务化配合 README 给出的架构说明和 RAG / Realtime 扩展路径它可以作为构建各类隐形对话助手会议教练、面试陪练、销售陪访、1-on-1 辅导的直接起点。【免费下载链接】Vision-AgentsOpen Vision Agents by Stream. Build voice and vision agents quickly with any model or video provider. Uses Streams edge network for ultra-low latency.项目地址: https://gitcode.com/GitHub_Trending/vi/Vision-Agents创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表