
最近开源社区里AI虚拟伴侣类的项目越来越多了但大多数要么是套壳网页要么重度依赖云端付费接口真正能本地跑起来、数据自己掌控、还能按需自定义人格的其实没几个。AIRI 算是我近期实测下来比较有诚意的一个方向——它把大模型对话、语音交互、长期记忆和角色设定都整合到了一套开源框架里目的很明确让你自己部署一个“懂你”的 AI 伙伴而不是那种问一句答一句的聊天机器人。这篇文章我会从项目定位、核心模块、本地部署实操、常见坑位排查这几个维度完整拆一遍。如果你是有一定动手能力的技术爱好者或者想给团队/实验室做一套可定制的对话 Agent 底座这篇应该能帮你省下不少自己从零拼装的时间。1. 项目定位与整体设计思路1.1 这个项目到底解决什么问题先聊一个被我反复和身边朋友确认过的需求很多人在用各类大模型产品时其实真正想要的不只是“万能问答机”而是一个有连贯人格、能记住偏好、愿意听你把话说完的陪伴型角色。AIRI 这类项目的核心价值就是尝试把“人格化陪伴”这件事从云端产品里剥离出来变成你可以在本地硬件上私有化部署的开源方案。我自己体验下来的感受是AIRI 的设计目标并不是在通用知识问答上跟 ChatGPT 这种级别的产品硬碰硬而是着力解决三件事一是对话的记忆连续性让它记得你昨天聊过什么二是角色设定的灵活性让它可以是一般朋友、导师、树洞甚至是有特定语气风格的助手三是交互方式的完整性不只有文字还包含语音入口和语音出口整体上更接近“伙伴”而非“工具”的体验。1.2 为什么选择本地部署而不是纯云端方案AIRI 最大的一个选型倾向是支持本地推理这一点我特别认可。纯云端方案最大的问题不是不好用而是你没法控制数据和对话风格。比如你不想让对话记录上传到第三方服务器或者你希望它接入一个私有知识库这些需求在 SaaS 产品里往往很难实现而本地部署的 AI 伴侣框架能天然规避这些限制。本地部署还有另一个实际好处你可以自由切换底层模型。今天想用参数量小一点的模型跑在边缘设备上明天想接一个效果更好但更吃显存的大模型只要接口兼容改个配置就能切换。AIRI 在架构上对模型推理做了抽象不是跟某一个模型强绑定这对喜欢折腾的人来说是很大的自由度。1.3 哪些人适合参考这个项目我的判断是以下几类人最值得关注 AIRI 这类项目有编程基础、想自己做一个人格化 AI 助手的开发者不想从零写对话管理、记忆、语音等底层逻辑。对数据隐私比较在意希望 AI 交互记录完全留在本机的用户。做智能硬件、桌面机器人、智能音箱类产品的团队需要一个可二次开发的对话交互底座。想研究 RAG、向量记忆、角色人设提示词工程等技术点的同学AIRI 是一个不错的综合样例。说白了这是一个拿来即用又能拆开学习的项目。你既可以把它当作最终产品来部署也可以把它当作一个参考架构来阅读源码。2. 核心模块拆解与技术实现要点2.1 对话引擎的架构思路AIRI 的对话引擎是我觉得全项目最值得细看的部分。很多初级项目是直接把用户输入丢给大模型然后把模型输出返回中间没有任何状态管理。AIRI 的做法类似一个“三层管线”第一层是输入处理会对用户的文本做预处理、意图粗略分类和敏感词过滤。第二层是对话上下文管理将历史消息按窗口大小做取舍结合摘要机制保留长期信息。第三层才是模型调用通过统一的 Completion 接口把组装好的 prompt 发给后端模型。这个设计的好处是当你想要调整对话策略时不需要动模型本身。比如想让 AI 在回答时更啰嗦一点直接改 prompt 模板想让它在某个话题上更谨慎加规则过滤就行。我自己改过几次 prompt发现它的提示词模板结构分得很细有角色设定区、短期记忆区、长期记忆区、用户输入区这种分区方式对控制输出风格非常有效。2.2 记忆系统短期记忆与长期记忆的配合记忆是所有陪伴类 AI 项目里最难做好的部分AIRI 的思路是分层存储。短期记忆直接放在对话上下文中类似大模型常见的 sliding window用于保证当前对话连贯长期记忆则通过向量数据库存储系统会定期把关键信息抽取出来、向量化然后存进一个本地向量库。实际使用中当用户开启新一轮对话时AIRI 会先从向量库里检索与当前输入相关的历史记忆片段把它们作为背景信息加入 prompt。这个机制配合得好的话AI 会在几天后还记得你喜欢喝美式、最近在准备某场面试这种“被记住”的感觉确实是提升陪伴感的关键。我建议你部署时给长期记忆一个独立的存储目录方便定期备份和清理。如果你用的是默认配置它会把向量和原始文本都存在本地这点对于数据安全很友好。不过也提醒一句向量检索的召回质量直接影响体验如果你发现 AI 经常“忘事”大概率是 embedding 模型或者召回阈值设置的问题后面我会单独说。2.3 人设与角色设定动态人格的加载机制AIRI 里的人格系统做得比较有特色。它不是把角色设定写死在代码里而是给每个角色单独建一个配置目录里面包含系统提示词、语气词偏好、话题禁区、对话风格示例等文件。加载不同的角色就等于切换到一套全新的行为模式。我在调整角色设定时发现它支持多段人格描述的权重叠加比如你可以定义一个人物同时具备“温柔”“理性”“偶尔幽默”的特质并通过强度参数控制每个特质的权重。这种方式比较接近真正的角色扮演而不是单纯换一个 system prompt 前缀。但这里有一个要注意的点角色设定文本的长度和质量直接影响模型表现。如果你设定得太泛AI 会表现得平平无奇如果设定里全是“你必须”式的命令句又容易让模型变得僵硬。我自己的经验是给角色提供几个具体的对话示例比单纯描述性格效果要好很多——AIRI 的角色配置文件里预留了 few-shot 示例的位置这个设计很实用。2.4 语音交互链路ASR TTS 的选型与调优AIRI 的语音交互链路包含语音识别ASR和语音合成TTS两部分。ASR 负责把用户说的话转成文本TTS 负责把 AI 的回复读出来。整体链路是麦克风采集 → ASR 识别 → 文本进入对话引擎 → 生成回复文本 → TTS 合成语音 → 播放。在选型上项目对多种本地语音方案做了适配。ASR 这边常用的有 PaddleSpeech、whisper.cpp 等TTS 这边支持 edge-tts、Piper 等。我的建议是如果你的机器性能够用中文场景下优先试 PaddleSpeech 加一个高质量的语音合成模型如果部署在树莓派这类小设备上whisper.cpp 加 Piper 会更轻量。语音链路里的延迟是个大坑。实测下来一个完整的语音交互循环如果超过三秒体验感会明显下降。优化方向有两个一是启用流式 ASR让识别结果边说话边出二是把 TTS 生成的音频做缓存对高频回复直接走缓存播放能省掉不少无效计算。2.5 前端与接入层多端适配的设计AIRI 的接入层设计得比较开放除了自带的 Web 聊天界面还提供了 API 接口和 WebSocket 实时通道。这意味着你可以很轻松地把它的对话能力接到其他前端比如一个桌面小组件、一个智能音箱项目甚至一个机器人硬件。Web 端界面能完成对话、角色管理、记忆查看等功能比较适合日常使用。API 接口则更适合二次开发比如我就在本地写了一个简单的命令行客户端通过 HTTP 接口和 AIRI 对话这样即使不打开浏览器也能在终端里直接交互。项目文档里关于 API 的部分写得还挺清晰字段命名都比较直觉没有太多多余封装。3. 本地部署实操指南3.1 环境准备与依赖安装我实际部署时用的是一台 Ubuntu 22.04 的机器显卡是 RTX 3080 10GB。AIRI 对硬件的要求取决于你想跑多大的模型如果只是 7B 级别的中文模型10GB 显存足够如果要跑 13B 甚至更大的模型建议上 24GB 显存或者考虑 CPU 加内存的混合推理方案。部署的第一步是获取项目和初始化环境。基本流程是这样的git clone https://github.com/your-airi-repo/airi.git cd airi python3 -m venv venv source venv/bin/activate pip install -r requirements.txt这里有一个细节值得注意requirements.txt 里包含了 PyTorch 的 CPU 版本依赖如果机器有 NVIDIA 显卡装完依赖后还要手动把 PyTorch 换成 CUDA 版本否则推理会慢到怀疑人生。我习惯的做法是先装 requirements.txt 的依赖然后再单独执行一次pip install torch --index-url https://download.pytorch.org/whl/cu118来覆盖安装 GPU 版。3.2 底层模型配置与切换AIRI 支持通过环境变量或配置文件来指定底层模型。常见的大模型接入方式有两类一是直接加载本地 HuggingFace 模型二是通过 OpenAI 兼容接口调用远端或本地推理服务比如 vLLM、Ollama、llama.cpp 启动的服务。以我自己实际在用的配置为例在 config 目录下的.env文件里做了这样的配置MODEL_BACKENDopenai_compatible OPENAI_API_BASEhttp://127.0.0.1:11434/v1 OPENAI_API_KEYollama MODEL_NAMEqwen2.5:7b这个配置的意思是AIRI 把 Ollama 启动的本地模型服务当作一个兼容 OpenAI 格式的远端接口来调用。好处是 AIRI 本身不需要加载模型把显存压力转移给了 Ollama 进程两边可以独立重启、升级调试的时候很方便。如果是直接在 AIRI 进程里加载模型就要设置MODEL_BACKENDhuggingface并指定模型路径。这种方式少了一层网络开销但模型加载和切换不如接口方式灵活。我实际测试下来在千问 7B 这个级别接口方式的一次请求延迟多几十毫秒但换来的是更干净的进程隔离个人觉得值得。3.3 角色初始化与提示词模板配置AIRI 的角色配置文件通常放在characters/目录下每个角色一个子目录。初始化一个角色最少需要一个system_prompt.md文件和一个config.json文件前者定义角色的说话风格和行为准则后者定义模型参数和记忆策略。我第一个角色是按照“一个研究 AI 技术的学长”来设定的。system_prompt 的初版只写了一句“你是一个懂技术的学长回答要专业且亲切”结果效果很平淡。后来参考项目自带的示例角色改成包含具体对话范例的写法效果立刻不一样了# 角色设定 你是 AIRI 学长一个在 AI 领域做了三年研究的工程师。 你乐于分享知识但不会刻意说教。 # 说话风格 - 用口语化表达偶尔夹杂一两个英文技术术语 - 回答问题时先给结论再展开解释 - 看到朋友遇到 bug 时会先安慰再给方案 # 对话示例 用户我好烦训练模型一直 loss 不降。 AIRI 学长先别急着调参你数据归一化做了吗我上次遇到类似问题最后发现是 learning rate 太大降到 3e-5 就好了。体验下来这种带场景示例的提示词能让模型更快进入角色状态而不是一味地重复“作为一个人工智能助手”这种沙雕模板回答。3.4 语音模块安装与本地资源准备如果你要启用语音交互还需要安装额外的依赖。AIRI 在文档里单独列出了语音扩展的安装方式一般是在基础依赖之外再装一组音频相关的包pip install -r requirements-voice.txtASR 模型和 TTS 模型首次启用时会自动下载但如果你部署的机器网络条件不理想建议手动下载好模型文件放到指定缓存目录。以 PaddleSpeech 为例模型文件会放在~/.paddlespeech目录下提前放好模型可以避免启动后卡在下载阶段。启用语音后需要在配置里指定音频输入输出设备。Linux 环境下我一般用arecord -l查看麦克风设备编号然后填到配置文件里。如果你用了默认设备但发现没声音十有八九是设备索引不对这个在后面排查部分我会再提。3.5 启动与功能验证安装配置完毕后启动服务只需要两条命令python main.py --mode web python main.py --mode voiceweb模式启动 Web 界面和 API 服务voice模式启动语音交互循环。两个模式可以同时跑互不冲突。第一次启动时AIRI 会创建数据库和向量索引然后加载角色配置。如果配置正常终端里会出现类似“AIRI service started on port 8080”的日志。这时候在浏览器打开http://localhost:8080选择你创建的角色就能开始对话了。我建议拿到手后先做三个快速验证文本对话是否正常回复回复风格是否符合角色设定连续对话几轮后问它“你还记得我刚才说了什么吗”验证短期记忆是否生效输入语音看 ASR 能不能准确识别TTS 能不能正常播报这三个验证覆盖了 AIRI 最核心的三条链路只要它们都通了项目就算真正跑起来了。4. 常见问题与排查技巧实录4.1 显存不足与模型加载失败显存不足是我见过最多的报错。如果你启动后发现进程直接崩溃终端提示CUDA out of memory根本原因通常是模型参数量超出了显卡显存。解决方案按优先级排列换更小的模型。7B 模型量化到 4bit 大概需要 6GB 显存3B 模型量化后 2GB 左右就能跑。如果没有大显存显卡用 llama.cpp 的 CPU 推理方案速度慢一些但能跑起来。减少上下文长度。AIRI 配置里有max_context_tokens这个参数默认值偏大时显存占用会飙高。我在 8GB 显存的笔记本上就遇到过模型加载到一半被系统杀掉的情况后来把上下文从 4096 降到 2048同时开了 4bit 量化才顺利跑起来。多试几组不同参数的组合比硬扛一个大模型要实在。4.2 中文识别不准的问题排查语音交互最让人崩溃的就是 ASR 把中文识别得乱七八糟。我踩过几个坑麦克风离嘴太远或房间噪声大识别率断崖式下降。可以先用一个录音软件测试原始音频质量。默认的 ASR 模型可能不是针对中文优化的需要在配置里明确指定中文模型路径。采样率不匹配也会导致识别异常。AIRI 的语音模块默认用 16kHz 采样率如果你的麦克风输出格式不同需要在音频输入配置里做重采样。自己调的时候可以先绕开 AIRI 单独测试 ASR 模块跑一段预录的 wav 文件看识别结果。如果文件识别没问题但实时语音不行那就是设备或环境问题而不是模型问题。4.3 角色人设维持不住总说崩很多朋友反馈角色设定在一两轮对话后就开始“出戏”AI 又变回千篇一律的助手口吻。这个问题说到底还是提示词与上下文管理的问题。我的解决办法有两步。第一步是把角色的核心风格关键词在每轮系统提示里固化不要让它被多轮对话历史冲掉。AIRI 支持在配置里设置 system prompt 的替换频率默认是每一轮都注入这个要保持开启。第二步是减少历史消息中的无关内容因为上下文窗口有限历史消息过多时模型会逐渐模糊掉最初的角色设定。另外如果你用的是 7B 这种小模型人设维持能力本来就比大模型弱一些这是模型能力的瓶颈不是项目代码的 bug。真要追求稳定人设建议至少上 13B 级别的模型或者用带较强指令遵循能力的微调模型。4.4 记忆功能不生效AI 总是“失忆”如果你发现 AIRI 的长期记忆形同虚设大概率是下面三个原因之一向量库检索的相似度阈值设得太高导致几乎不会有记忆被召回。没有配置 embedding 模型或 embedding 模型下载失败导致记忆写入时静默失败。对话中没有值得抽取的关键信息记忆抽取策略没有生效。排查时建议去看一下 AIRI 的日志它会记录每次记忆写入和检索的详细信息。我自己遇到的是第二种情况模型配置指到了不存在的路径结果系统一直报 embedding 错误但我没注意。修正路径并重新启动服务后记忆功能才真正开始工作。4.5 几个部署与日常使用效率技巧额外分享几个让整体体验更顺畅的小技巧使用 systemd 或 supervisor 把 AIRI 配成开机自启避免服务器重启后手动拉起进程。定期备份角色配置和记忆数据库目录防止数据丢失我一般用 cron 每天压缩备份一次。如果只是日常聊天用 API 模式接一个终端客户端就够了浏览器开着的内存占用比终端高不少。调整 TTS 语速和音调时直接改配置里的语音参数不用重新启动服务改完保存后热加载即可。5. 二次开发与扩展方向5.1 接入外部知识库与工具调用AIRI 的一个高阶玩法是给它接入外部知识库。默认的长期记忆是向量库但你完全可以再挂一个额外的知识库检索服务比如用本地跑一个知识库 API然后让 AIRI 在对话时请求这个 API拿到相关内容后再组织回答。工具调用也是我比较看好的扩展方向。虽然 AIRI 本身没有内置复杂的 Agent 能力但只要底层模型支持 function calling你可以在对话引擎里加一层工具调用的逻辑。比如接一个天气查询接口、待办事项管理接口甚至控制家里的智能设备。这等于把 AI 从“陪你聊天”升级成“能帮你做点事”的伙伴。5.2 把 AIRI 接入智能硬件AIRI 的语音交互链路天然适合往智能硬件上迁移。社区里有不少朋友把它跑在树莓派上配合一个 USB 麦克风加小音箱组装一个桌面级的 AI 语音助手盒子。从软件角度来说你只需要保证三点一是设备有足够的算力跑 ASR 和模型推理或者能通过网络访问另一台机器的推理服务二是音频输入输出设备能正常被系统识别三是开机启动脚本配置好让盒子通电即用。硬件成本大概几百块钱整体开发量也不大但做出来的东西很酷送人也很有面子。5.3 多角色管理与场景化切换实际用久了你会发现单一角色并不能满足所有场景需求。AIRI 支持多角色共存这意味着你可以同时维护“工作导师”、“闲聊伙伴”、“树洞朋友”等多个角色在不同场景下切换使用。我目前的做法是按对话主题来切换角色写代码遇到问题用“工程师学长”心情不好想吐槽用“温柔朋友”需要梳理思路时用“理性观察者”。切换方式很简单在 Web 界面点一下角色名就行不需要重新启动服务。这种做法背后其实利用了一个原理不同角色对应的提示词模板不同模型在相同输入下会走完全不同的表达路径。这比用一个万金油角色去应对所有场景要自然得多。AIRI 这个项目最让我满意的地方是它把复杂的技术栈整合得比较恰到好处没有过度设计同时又保留了足够的扩展空间。如果你也打算上手建议先跑通默认配置再逐步替换模型和调整角色不要一上来就追求完美效果。AI 伴侣这种项目核心不是模型多先进而是你有没有耐心调出真正适合自己交互习惯的那套配置。我到现在还在不断微调角色的说话方式和记忆策略这个过程本身就是一种乐趣。