实时语音与 RAG 的结合:构建特定领域的 AI 聊天机器人
社会
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
这是参加AssemblyAI 语音代理挑战赛的作品。
我建造的
最近做了一个小型副项目:一个基于语音的聊天机器人,它使用经过领域训练的 RAG 代理来回答社会学问题。它的名字叫 Sociopal。
它由 LangGraph 提供技术支持,支持纠错式红绿灯拼写检查,并且在找不到答案时还能进行网络搜索。AssemblyAI 负责语音转文本,ElevenLabs 则负责语音输出。
你用语音提出一个与社会学相关的问题。应用会将你的语音转录成文本,查询一个经过社会学文档训练的后端代理,并给出答案。如果向量数据库中找不到答案,它会回退到网络搜索并再次尝试。
最终答案会通过 ElevenLabs 以显示和语音两种方式呈现。
演示
尚未部署,但这里有一个简短的演示视频:
GitHub 仓库
⭐ Github 👇
社会
一款面向社会学领域的专家型人工智能语音代理。
了解更多关于Sociopal的信息
Sociopal 是一款基于矢量数据库(包含精选的社会学信息和网络搜索功能)的矫正型 RAG(CRAG)智能体。它旨在回答与社会学相关的问题并提供详细的解释。
技术栈
前端:
- Next.js
- AssemblyAI(语音转文本)
- ElevenLabs(文本转语音)
后端:
- FastAPI
- LangGraph
- 格罗克
- ChromaDB
- DuckDuckGo(网络搜索)
入门
1. 克隆代码库
git clone https://github.com/k0msenapati/sociopal.git
2. 导航至项目目录
cd sociopal
前端设置
cd ui
bun i
cp .env.example .env.local
在此处填写您的 ElevenLabs 和 AssemblyAI API 密钥.env.local。
启动开发服务器:
bun dev
后端设置
cd ../agent-py
uv sync
source .venv/bin/activate
cp .env.example .env
在此处填写您的 Groq API 密钥.env。
索引数据
uv run --active -m sociology_agent.index
运行服务器
uv run --active uvicorn sociology_agent.server:app --reload
安装步骤包含在 README 文件中。
技术实施
AssemblyAI 集成
我正在使用 AssemblyAI 的Universal-Streaming API来处理实时语音输入。大致流程如下:
1. 获取临时令牌
有一个 API 路由(/api/token)可以获取临时令牌:
const url = `https://streaming.assemblyai.com/v3/token?expires_in_seconds=60`
2. 通过 WebSocket 连接
令牌准备就绪后,即可打开 WebSocket 连接来传输音频:
wss://streaming.assemblyai.com/v3/ws?sample_rate=16000&formatted_finals=true&token=${token}
在前端,我使用getUserMedia()麦克风,然后将音频转换为 16 位 PCM 格式并通过套接字发送。AssemblyAI 会实时返回转录文本,我会在用户说话的同时将其显示出来。
它运行流畅,延迟低,即使是日常对话,转录结果也出奇地准确。
后端代理
后端运行一个带有/query路由的 FastAPI 应用。它接收用户查询,将查询传递给 LangGraph 代理,并返回响应。
该代理使用纠错红绿灯算法,因此如果第一个答案不完整或不相关,它会尝试使用更精确的查询。此外,它还连接到网络搜索工具,以防答案不在向量数据库中。
最后想说的话
构建这个系统让我以一种有趣的方式探索了语音如何增强人工智能代理的功能。结合AssemblyAI 的实时转录和ElevenLabs的自然语音处理,语音界面的实现非常流畅。
虽然这个模型是用社会学数据训练的,但它的设置实际上是与领域无关的。你可以将向量数据库替换成任何其他特定领域的资料,智能体仍然可以正常工作。
如果你对语音用户界面或构建更智能的助手感兴趣,那绝对值得一试。
感谢阅读,期待很快能再次与您交流!
关注我,获取更多类似内容!
Twitter | GitHub | YouTube
文章来源:https://dev.to/k0msenapati/real-time-voice-meets-rag-building-a-domain-specific-ai-chatbot-5heh