惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
PCI Perspectives
PCI Perspectives
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
H
Heimdal Security Blog
S
Security @ Cisco Blogs
N
News | PayPal Newsroom
J
Java Code Geeks
罗磊的独立博客
Security Archives - TechRepublic
Security Archives - TechRepublic
N
News and Events Feed by Topic
V
V2EX
WordPress大学
WordPress大学
Google Online Security Blog
Google Online Security Blog
N
News and Events Feed by Topic
www.infosecurity-magazine.com
www.infosecurity-magazine.com
月光博客
月光博客
AI
AI
小众软件
小众软件
The GitHub Blog
The GitHub Blog
MongoDB | Blog
MongoDB | Blog
A
Arctic Wolf
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
美团技术团队
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
F
Full Disclosure
B
Blog RSS Feed
Forbes - Security
Forbes - Security
S
SegmentFault 最新的问题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
Jina AI
Jina AI
Cisco Talos Blog
Cisco Talos Blog
U
Unit 42
Project Zero
Project Zero
H
Hacker News: Front Page
Y
Y Combinator Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The Cloudflare Blog
大猫的无限游戏
大猫的无限游戏
S
Secure Thoughts
The Hacker News
The Hacker News
Microsoft Azure Blog
Microsoft Azure Blog

重归混沌的BLOG

给silly实现了一个ernro模块 | 重归混沌的BLOG 给silly实现了一个ernro模块 | 重归混沌的BLOG 第一次在生产环境使用 Vibe Coding | 重归混沌的BLOG 第一次在生产环境使用 Vibe Coding | 重归混沌的BLOG API 设计的艰难抉择 | 重归混沌的BLOG API 设计的艰难抉择 | 重归混沌的BLOG 十年 | 重归混沌的BLOG 十年 | 重归混沌的BLOG 在Go语言中如何使XML加载内存无限趋近于0 | 重归混沌的BLOG 在Go语言中如何使XML加载内存无限趋近于0 | 重归混沌的BLOG 对跨服玩法中的分布式一致性问题进行简单抽象 | 重归混沌的BLOG 对跨服玩法中的分布式一致性问题进行简单抽象 | 重归混沌的BLOG Go语言逃逸分析之slice和map | 重归混沌的BLOG Go语言逃逸分析之slice和map | 重归混沌的BLOG 谈谈观测 | 重归混沌的BLOG 谈谈观测 | 重归混沌的BLOG 写了个AI Agent服务端 | 重归混沌的BLOG 谈谈代码设计中“严丝合缝” | 重归混沌的BLOG 谈谈代码设计中“严丝合缝” | 重归混沌的BLOG 一次艰难的线上游戏服务器内存排查经历 | 重归混沌的BLOG 一次艰难的线上游戏服务器内存排查经历 如何基于LanguageServerProtocol来编写lint工具 谈谈游戏服务器中RPC模块的设计 谈谈游戏服务器代码抽象 最近碰到的一个分布式一致性问题 谈谈游戏服务器的自动化测试 对Raft协议的一点理解 使用mmap来学习/proc/pid/smaps 2023(完) 再次实现了一个Lua性能分析器 终于给Silly的定时器增加了取消功能 一次虚拟内存排查经历 游戏服务器分布式数据的一种同步的思路 为silly增加了互斥锁 2022(完) Go语言之闭包篇 一例误用unsafe包引起的内存问题 Go语言之内存篇 初识Go语言 重新抽象图形API 给Lua实现了一个数学库 谈谈跨平台图形API的抽象 寻路和Flocking算法的结合 行为树的一种高效实现 内测过程中Shader出现的问题 彻底解决多国语言 谈谈数据库的选型 再谈Lua热更新(终) 初窥Rust 关于游戏服务器的服务拆分 ECS的初步实现 ECS初探 屏幕空间(SreenSpace)的想象力 一些对辐射度量学的理解 深度缓冲和半透明渲染 Mysql的间隙锁 更新一些GPU相关知识 2020 地形渲染之爬过的坑 Lua5.3 GC源码阅读(5) 实现一个数据库存储队列 再学计算机图形学入门 再谈分布式服务架构 游戏上线一个月后的反思 一次并发Bug 双向链表的三种实现 谈谈随机数的使用 再谈性能优化 2019 Lua中的函数式编程 重构登录逻辑 Unity资源管理(续) 谈谈Unity的资源管理 一次关于Cache的性能分析 历史之2018 DC3算法 移动平台native代码遭遇的坑 从CPU层面谈谈优化 开卷有益(UNIX编程艺术篇) GC竞争问题 通过Mesh投影来实现贴花系统 谈谈我对数据同步的理解 又一个类型提升引起的Bug Lua5.3 GC源码阅读(4) Lua5.3 GC源码阅读(3) Lua5.3 GC源码阅读(2) Lua5.3 GC源码阅读(1) 三角形光栅化时遇到的坑 一次git事故 再见2017 又一个lua调试器 客户端缓存落地方案 Paxos算法 HTTP服务器的特点 一次性能优化经历 关于CPU分支预测 C程序中让两个不同版本的库共存 实现了一个AOI模块 一个高可伸缩的游戏服务器架构 关于网络协议封装的一些新想法
写了个AI Agent服务端 | 重归混沌的BLOG
重归混沌 · 2025-04-30 · via 重归混沌的BLOG

TL;DR: 本文没有任何技术观点,只是总结了一下最近正在做的事

去年我在"星际蜗牛"上折腾Home Assistant时一直想找个方法把"小爱同学"或"天猫精灵"的语音输入给接管了。

折腾了几天之后,没找到比较好的方案,最后搁置了。

过年时,deepseek爆红之后,这个心思又活络起来,如果我能让智能音响的输入直接转发给deepseek就可以让家里小朋友尽快体验到大模型的便利。

这次我仔细分析了一下需求,输入端到底是不是智能音响其实一点都不重要,我要的只是一个可以语音唤醒的语音终端。

既然这样,我自己直接做个这样的语音终端可能也不会太难,这样至少可以All in control

实现以前我去Github搜了一下(毕竟10多年没画过PCB了,还是不太想碰这块,做起来太麻烦), 发现了一个可以完美实现我需求的方案,xiaozhi-esp32

作者开源了电路板方案、固件还有通信协议,甚至还有适配好有外壳的开发板可以购买。

我直接买了个立创·实战派ESP32-S3开发板的开发板(固件是一点都不想碰:D), 直接去开发对应的服务端程序了。

目前为止,家里24小时开机的设备,只有一台"星际蜗牛的黑群晖", 这上面还同时跑了一个"图书馆", 一个Home Assistant

这也注定了我不可能有太多资源来跑这个服务端, 所以我打算将目标内存限制在100MB以内。

当然这个内存限制直接就让我放弃了Python

最后我选择了我自己的网络框架来开发这个服务端, 这样也可以让我自己更好的了解大模型的调用方式。

100MB的内存太少了,他甚至都跑不起来一个VAD模型,更别提嵌入向量模型BAAI/bge-m3

因此在设计之初,我就已经打算非业务逻辑的功能全部独立出去,先本地部署,然后通过网络调用。

这样当我找到互联网上的免费平替后,可以直接替换。

也只有全部替换成功,这个服务端才有可能真正在"黑群晖"上跑起来。

以前从没来涉及过大模型相关的知识,比如怎么调用openai, 什么是嵌入向量,怎么做内容召回。

再加上,年后开工之后周末空闲时间也比较少, 所以一直到上周才算有了一个可以运行的版本。


整个系统跑下来分为这么几个部分。

语音唤醒和输入 (使用xiaozhi-esp32来实现)

这个没什么说的,直接使用官方的固件即可。

VAD 静音检查

当设备被唤醒之后,它会源源不断的发送声音片段给服务端。

如果服务端一股脑全部发给ASR服务,那这个价格是承受不起的。

所以一般都需要先用VAD模型找出有信息的声音片段, 再将这些片段发给ASR服务。

ASR 语音识别

拿到有信息声音片段之后,我们想知道用户说了什么,就需要使用ASR服务, 来将声音片段转换为文字。

这里真的要感谢腾讯,每月可以有5000次免费调用,对于个人使用场景足够了。

嵌入向量模型

在获取到用户的文本信息之后,在调用大模型之前,我们需要先召回与本次对话相关的聊天记录或知识。

这时就需要用到嵌入向量模型,将用户的问题转换为向量,然后去向量数据库中召回与该向量最相似的聊天记录。

这里要感谢SiliconFlow,他们提供了5种免费的向量模型,其实刚好有我需要的BAAI/bge-m3

向量数据库

为了召回记忆,还需要将聊天记录持久化,这里我选择了redis-stack, 巧的是redis-stack提供了30M的免费空间。

应该没有哪个话痨能聊满30M吧?至少我家小朋友暂时还没这个潜力, 尤其我还增加了记忆遗忘功能。

惟一的缺点是,公网链接redis可能会有延迟,不过等到延迟有明显影响时,再本地部署也来得及。

大模型

这里又要再次感谢SiliconFlow,他们提供了很多免费的小尺寸的大模型,在意图识别和参数提取等方面可以极大的降低延迟和成本。

甚至真正用来思考的全尺寸大模型,也可以用注册赠送的额度来使用。

直接使用官方DeepSeek V3价格也不是不能接受。

回答输出

大模型返回的回答以文字为主,语音大模型目前来看似乎不是主流。

因此我们还需要TTS服务,来将文字转换为语音然后发回给xiaozhi-esp32

其实这里有点纠结,因为国内给的额度都是一次性的,比如3个月多少字符,这种不具有可持续性,我更喜欢使用那种每个月有一定额度的。

所以最终注册了个Azure的账号,然后建了个Azure TTS F0层级的资源,然后使用Azure TTS的API来生成语音。

在试用了一周之后,发现Azure TTS由于节点不在国内,所以延迟非常高,甚至第一句话能延迟3s之多,这在语音交互中特别难受。

最后打算使用Edge TTS来生成语音,不过Edge TTS是逆向出来的API, 不是很稳定,只能先将就用了。


最后,谈谈对目前大模型的感受。

在做这个服务端之前,我其实预设了4个简单的Agent。 也许都不能够称为Agent, 因为它们没有Workflow, 仅仅是系统提示词和调用参数的不同。

  • 普通对话
  • 全科小学老师
  • 英语口语老师
  • 脑筋急转弯伙伴

其中英语口语老师脑筋急转弯伙伴算是彻头彻尾的失败了,因为他们并不是简单的问答模式。

英语口语老师需要先主动说出一句对话,然后小朋友回答一句,老师再点评, 这样循环。

在仅靠系统提示词的情况下,使用全尺寸DeepSeekV3模型,在一轮对话之后,指令的遵从性就变的非常差,有时甚至都不用一轮。

脑筋急转弯伙伴就更复杂,他有可能需要AI出题, 小朋友回答,然后AI再点评。或者小朋友出题,AI回答,小朋友再点评。

在这种情况下,AI甚至都坚持不到一轮对话结束,就开始胡言乱语了。

刚好最近看到一篇文章, 我觉得在目前的情况下,即使在有记忆的情况下,Workflow是不可取代的。

现在的大模型似乎很难尊从超出惟一要求之外的系统指令。

上面的英语口语老师脑筋急转弯伙伴之所以失败,是因为他们希望每次对话执行A,第二次对话执行B, 第三次对话执行C, 然后再从A开始。

最后,代码在此