
1. 版本背景与1.5的目标定位先交代一下当前状态。龙呤AI走到1.5距离首次发布已经过了大约四个月。前几个版本解决的是“能不能用”的问题模型跑通、接口稳定、多端接入、基础对话体验调顺。但当用户真正开始高频使用之后问题就变了从“能用”变成了“好不好用、顶不顶用”。我翻了一下后台数据1.4版本运行这两周反馈最集中的几个点非常有指向性涉及多轮复杂任务的对话模型经常“失忆”让它处理需要多步骤推理的事情比如“帮我对比一下这两款显卡再给个购买建议”回答质量明显下滑另外知识库问答的命中率在高并发下会出现抖动。这些问题的共同根源本质上指向同一个方向底层的上下文管理和任务编排能力不够了。所以1.5版本的核心目标从版本规划之初就很明确不是加一堆花哨功能而是把“大脑回路”修得更粗更稳。具体拆成三条主线——提升复杂对话的上下文连续性与压缩效率、引入初步的多智能体协作框架、重构知识库RAG管线的切片与检索策略。三条线都偏向底层架构最终都要体现在用户能感知的体验上长对话不糊涂、复杂任务不乱、知识问答更准。为什么偏偏选这三个方向其实跟龙呤AI的产品定位强相关。它本身定位为个人AI助理使用场景横跨日常问答、信息整理、轻度数据分析用户往往会抛出一连串关联问题搜索式单轮交互远远不够。1.4实测数据显示平均每次会话长达3.2轮而涉及工具调用或上下文追问的会话超过21%这个比例还在涨。在这个前提下上下文管理与多阶段推理就是绕不开的命门。2. 开发前的基础基线验证一次大版本升级最忌讳拍脑袋改架构。动手之前我花了三天时间做基线验证把1.4版本在关键指标上的表现摸了个底。2.1 长对话压测结果用一套200轮的模拟长对话场景做了压测开场设定一个虚拟项目背景中间穿插用户偏好修正、信息补充、反问澄清三类干扰最后要求模型基于最早的信息和最后的信息给出综合判断。实测下来1.4版本在对话进入第60轮后开始出现明显的上下文遗忘模型对前提条件的还原准确率从92%一路下滑到71%到第120轮以后准确率跌破60%基本靠猜。token消耗方面也很有意思1.4采用全量拼接策略第200轮时单次请求的上下文token已经接近30K响应延迟平均拉到4.5秒这个体验完全不合格。2.2 单轮复杂任务的瓶颈单独测了多步推理任务指令类似“从本季度销售数据中找出增长率最高的三个区域并按增长率排序输出表格附上简要原因分析”。1.4版本把中间步骤全部塞给一次模型调用结果经常出现幻觉、遗漏条件、格式混乱。统计下来这类任务的一次完成率只有64%也就是说将近四成请求需要用户反复纠正。2.3 知识库RAG的问题复现知识库部分1.4的切片策略是固定窗口长度512字符。问题出在语义完整性上经常把一句话拦腰切断导致检索召回的片段语义残缺。我随机抽了100条FAQ类问题进行测试检索命中率88%看似还行但把问题换成需要归纳多段内容的深层问答命中率直接掉到63%。原因也清楚top-k召回只取3段碎片化内容根本拼不出完整答案。这三组数据成了1.5改造的基准线。目标分别是200轮对话的上下文准确率提升到88%以上多步推理一次完成率提升到85%以上深层问答的检索命中率提升到80%以上。后续所有优化都用这几把尺子来量。3. 核心改造上下文管理全面重构3.1 从“全文堆叠”转向“核心事件结构”这是1.5最有分量的一处改动直接动的是对话历史的管理逻辑。回看1.4的策略每轮请求把全部历史消息原样塞进Prompt。简单粗暴但两个致命伤——token成本线性增长、噪声信息稀释关键线索。我在压测日志里翻到过很典型的例子用户在第15轮提过一句“我预算5000以内”到第80轮模型推荐了一款8000的设备就是被大量无关闲聊把关键约束挤出了注意力窗口。1.5的做法是引入“核心事件结构”。每次对话进行中系统实时从消息流里抽取四类信息约束条件、用户偏好、已确认结论、待办事项。抽取动作由一个小参数量模型完成目标是压缩而非理解所以准确率要求压在95%以上宁可漏抽也不可错抽。抽出来的信息存入结构化槽位替代原始文本参与后续构造Prompt。举个例子一段真实对话里的表达“我就想要白色的预算不能再加了”会被拆成“颜色偏好白色”、“预算约束不增加”。后续生成回复时这些结构化约束按优先级排列插入系统提示词既保证模型能看到完整信息又避免原始语句中的语气噪声干扰语义。这套思路的灵感来自记忆网络和摘要式记忆的混合方案。业界有不少开源方案直接做整段记忆摘要但我试下来有个问题摘要会丢细节尤其是数字和否定表达。结构化槽位是折中保留关键信息同时让模型更容易“读取”。有一点要提醒的是抽取模型本身需要小型化我用的是7B级别的量化版本单轮抽取延迟控制在200ms以内不能拖慢主线请求。3.2 动态压缩的触发策略结构化槽位是常驻上限但对话历史不可能无限压成槽位超出一定规模后还是要处理原始文本。1.5设计了一套分级压缩策略触发条件不是按轮数而是按上下文窗口占用率。系统实时监控当前上下文的token占用比例。低于60%时不做任何操作让模型读原始历史信息无损。超过60%但低于80%时启动“轻量压缩”对早于最近20轮的历史消息做摘要只保留摘要文本和关键实体列表。超过80%时触发“深度压缩”把早期消息替换为“结论约束待办”三元组结构化摘要。这里有一个细节值得展开。触发阈值为什么定60%因为要给系统输出、工具调用结果、知识库检索片段预留空间。如果上下文窗口已经用了60%再塞入一段1500 token的知识库内容加上模型输出限额很容易挤爆窗口。留足冗余比等到极限再压缩更明智。深度压缩阶段的实现我写成了一段pipeline。压缩动作本身采用异步执行不阻塞当前请求。如果请求到来时压缩尚未完成则临时降级为“截断轻量摘要”方案保证延迟稳定在一个可控范围。这算是对极端情况的兜底实测下深度压缩触发率不到3%所以这个复杂度是值得的。3.3 压缩质量评估压缩会丢信息丢多少需要量化。我建立了一套名为“三问评估”的验证方法压缩后的摘要是否保留了所有显式约束是否保留了用户的情感倾向是否保留了尚未完成的行动项每轮压缩结果抽5%做人工抽检其余用GPT-4o-mini做自动对比打分。两周的压测数据显示深度压缩后的信息保留率稳定在92%左右比设计目标的90%略高一点。代价是摘要中的具体数字偶尔会丢这一点无法完全避免但目前先接受后续考虑用规则校验兜底。4. 初步多智能体架构落地4.1 三个专职Agent的划分逻辑1.5版本尝试引入了多智能体架构但保持克制只拆了三个专职角色执行者Executor、评审者Critic、检索者Retriever。执行者负责响应调度和工具调用是用户可直接与之对话的唯一Agent也是Prompt模板里的主角色。评审者的职责是站在用户角度审执行者的输出每轮任务完成后检查是否满足全部约束条件必要时请求重新生成。检索者专职处理知识库向量检索不直接对用户说话只向执行者返回结构化检索结论。为什么只拆三个而不是更多因为经验告诉我Agent拆得太细会带来两个问题一是角色间的消息往返延迟成倍叠加二是指令遵循的出错点增加。三个角色能覆盖“执行-校验-查询”这个基本闭环同时把延迟控制在可接受范围。在多步推理场景原来的单次模型调用变成了一个多轮循环。每一步工具调用后评审者都会给出一个简短反馈反馈包括通过/不通过两个结果以及不通过时的问题点。执行者根据反馈修正再执行循环上限设为3次超限则放弃本次操作并如实告知用户“当前条件下未能完成”。初始设定时我犹豫过要不要做三个Agent之间的完整对话流后来想通了用户不会关心你内部聊了多少轮他只在意结果准不准、快不快。所以三个Agent的消息流不对用户开放只有最终结论展示一个简短的处理过程摘要。这也避免了一个常见误区“开放式多Agent聊得越热闹用户等待越久反而体验越差”。4.2 多轮调用链的协调策略这里直接放一段简化版的核心调度代码说明三个Agent是怎么串起来的。实际生产环境用的是异步消息队列这里为了好读我改成同步伪代码。def run_agentic_task(user_request, context_manager, retriever_pool): # 1. 执行者拆解任务并制定初步计划 plan executor.plan(user_request, context_manager.get_constraints()) for step in plan.steps: # 2. 检索者介入判断当前步骤是否需要知识检索 if step.need_knowledge: evidence retriever_pool.search(step.query, top_k5) step.attach_evidence(evidence) # 3. 执行者推进步骤 step_result executor.execute(step, context_manager) # 4. 评审者检查结果约束 feedback critic.review(step_result, user_request) if not feedback.passed: # 5. 修正循环最多3次 for attempt in range(3): step_result executor.revise(step, feedback.issues) feedback critic.review(step_result, user_request) if feedback.passed: break return executor.compose_final_answer(plan)这套流程跑通后多步推理的一次完成率显著提升但有一个代价平均响应延迟从原来的2.1秒增加到3.4秒。延迟增加的原因主要是评审环节多了一次模型调用。我权衡了一下先用速度换准确率等后续用蒸馏小模型替换评审者模型再把延迟压回来。4.3 延迟与并发优化评审者带来的额外调用直接提高了单请求的算力消耗。我把原来贪心的“每个步骤都过评审”改为“关键步骤才过”步骤涉及数值计算、约束条件比对、多条件筛选时强制评审纯事实性输出或简单问答步骤跳过评审直接放行。实测下来评审环节的调用量减少了约45%平均延迟降回2.7秒一次完成率仅下降1.1个百分点。这个交换非常划算。并发方面龙呤AI的推理节点用的是自建的vLLM服务压测时发现问题出在评审者模型和主线模型抢显存。后来把评审者模型单独部署到一个低优先级实例高峰期可接受其吞吐下降不影响主线对话。这是架构层面一个不大不小的坑提前踩掉总比上线后炸要好。5. 知识库RAG管线重建5.1 切片策略的重新设计原来的固定512字符切片确实太粗暴了。我翻过实际切片结果最常见的问题是一段话讲到一半被切断后半个句子单独成段检索时命中的片段永远只有半截上下文模型只能靠猜补全。这直接导致深层问答的召回效果差。1.5改成了“语义边界优先”的分层切片策略。核心逻辑分两步先用规则切分按段落、标题、列表结构划出候选边界再用一个小模型对候选边界做语义完整性打分分数低于阈值的位置不切开继续向下一个候选边界找。这样切出来的块长度会不固定短的三四百字长的可能到一千字但胜在语义完整。这一点非常关键因为向量化的目标是语义检索语义完整性比固定长度重要得多。处理长文档时还有一个补充策略叫“分层摘要索引”文档先按一级结构切出大纲片段每个大纲片段生成一段摘要摘要作为一级检索目标命中摘要后再定位到对应的完整原文块返回给模型。好处是检索深度更高尤其适合结构性强的报告、操作手册这类文档。5.2 混合检索与重排向量检索固然擅长语义匹配但精确关键词往往比语义更可靠尤其是型号、编号、专有名词。1.5的检索管线改为混合检索向量召回和BM25关键词召回并行执行分别取top30候选送入重排模型统一打分最终取前5段送进Prompt。BM25环节我用的是开源库Rank-BM25参数上做了一点调优对于中文文本分词采用bigram实验对比postag分词后命中率提升了8%代价是索引体积略微增大可以接受。向量召回使用的embedding模型也换了从原来的通用中文向量模型换成了一套针对“指令-文档”双塔结构的专用模型能更好地匹配查询与文档的表达差异。重排模型升级为cross-encoder结构跟双塔召回模型不同它能把查询和文档拼在一起做深度交互精度更高但算力消耗也更大。这里用它是划算的因为重排只处理候选集语句不超过30条负载可控。实测重排后的MRR10平均倒数排名从原来的0.42提升到0.61提升幅度非常明显。5.3 检索结果的引用溯源知识问答类产品最怕的就是模型一本正经地胡说八道。1.5在答案生成阶段强制加入引用溯源机制检索出来的每个片段都带来源文档ID和原文章节号模型生成时被要求在每个关键结论后标注对应的引用片段编号。这个要求通过系统提示词实现同时也对输出格式做了约束防止模型把编号编得很随意。实现上我在检索结果里为每条片段生成一行元数据格式为[citation:doc_id:chunk_id]然后要求在Prompt末尾附加一段“引用来源”部分模型在生成正文时如果引用了某个片段就在对应位置插入此标记。规则约束有两个关键点未引用任何片段的断言不得添加引用标记引用标记必须与实际使用的片段严格对应。上线后我用50条FAQ做了抽检引用准确率94%基本没有出现张冠李戴的情况。唯一要注意的是如果检索结果本身不包含正确答案模型会硬凑一段引用过去这种情况通过单独的质量评估通道拦截凡是引用标记数少于3或来源ID重复率过高的回复自动降级为“根据已知信息回答”并附谨慎说明。6. 全面回归测试与问题修复6.1 端到端回归清单1.5的核心模块改完之后回归测试是绕不开的大头。我做了一张覆盖核心链路的回归清单重点不是功能的有无而是各模块在改动后是否互相干扰。回归测试清单的核心项包括长对话200轮场景重点验证结构化槽位与动态压缩是否引入新的信息丢失风险多步推理场景5个预设任务验证Agent协作是否引入新的死循环或超时风险知识库问答场景100条FAQ加30条深层问答重点验证混合检索和重排后的准确率是否达到80%目标线工具调用场景计算器、天气查询、日期换算确认检索器的拦截不会影响工具参数提取极端输入包括空输入、超长输入、仅图片输入等边界情况。清单跑下来大部分指标达标。比如动态压缩的触发率和深度压缩时的信息保留率都符合预期。但小组件还是露了不少马脚比如评审者模型与检索者模型并发访问时偶尔会相互等待导致响应延迟从2.7秒飙到6秒以上执行者在带工具调用的多步流程里经常把“评审者建议”当成参数传给了工具造成工具报错。6.2 修复速记与排查思路第一个问题是死锁式的延迟尖峰。排查逻辑是先看日志里是否出现调用阻塞发现评审者和检索者都在等待对方的锁释放。原因很笨——两个模型服务注册到了同一个连接池连接被占满后互相等。解决办法是把两个服务拆成独立连接池并且给检索者设置独立的超时阈值超过800ms直接降级走缓存结果。第二个是参数污染问题。在Review结果反馈给Executor时我把结构化数据转成了自然语言再传给下一轮导致模型把建议内容当成可执行参数。修复方式是调整消息格式Review结果保持JSON结构直接传递不再经过自然语言化。这一处改动看起来简单但实测修复率非常显著工具调用报错率从原来的12%降到3%以下。第三个比较隐性的问题出现在知识库上下文重叠上。当多个文档片段内容高度相似时重排模型给出的top5常常是同一文档的多个近邻块内容冗余浪费了Prompt空间。我在重排之后加了一层“冗余去除”对候选列表按embedding余弦相似度做去重相似度超过0.86的片段只保留一条。这样最终送入Prompt的5个片段来源覆盖度显著提升答案的综合性也变好了。6.3 与1.4版本的指标对比所有问题修复后用与基线完全相同的评测集做了最终对比。指标1.4版本1.5版本变化200轮上下文准确率71%后期89%18%多步推理一次完成率64%86%22%深层问答检索命中率63%83%20%平均响应延迟简单问答1.2s1.1s持平平均响应延迟多步任务2.1s2.7s0.6stoken消耗200轮会话均值29.8K18.2K-39%工具调用报错率15%4%-11%三项目标全部达标性能代价集中在多步任务的延迟上。不过综合准确率带来的用户满意度提升这笔交易是值的。7. 当前构建状态与已知限制代码已经冻结当前构建编号是 build-20260830-1.5.0-rc2。按发布计划今天会出一版候选版本给内部体验用户稳定三天后推全量。哪些是已知限制需要公开讲清楚评审者模型目前用的是在线API高峰期偶尔会有300ms到500ms的不稳定影响评审环节延迟计划下一步蒸馏一个本地小模型。上下文压缩的信息保留率虽然达到92%但丢掉的8%大多是数字细节比如“上周四的17:30”可能压成“上周四傍晚”对时间线敏感的任务会有影响。混合检索对扫描版PDF文档依然无能为力这些场景的检索命中率比普通文本低25%左右后续计划接入OCR前处理。另外多说一句混合检索中的参数细节。BM25的k1和b参数在中文场景里建议保持默认值k11.5b0.75不要盲目照英文场景调。我做过一组试验把k1调到2.0后长文档的排名反而下降因为词频权重过高放大了重复术语的影响。8. 下一步规划与个人体会1.5还没有完全收敛有两个方向会在1.6版本优先推进。第一个方向是本地化部署的轻量化。目前系统跑在自建推理节点上资源占用相对宽裕。但不少用户希望龙呤AI能部署到自己的家庭服务器甚至NAS上模型参数量、上下文窗口、并发能力都需要根据设备档位适配。1.6版本会把构建系统改成支持多配置档位针对不同硬件生成对应的运行时配置。第二个方向是长期记忆的用户画像沉淀。结构化槽位目前聚焦在单次会话级别如果能把跨会话的“稳定偏好”抽取出来沉淀为用户级记忆后续新会话开局就能直接带入约束条件体验会再上一个台阶。技术上不复杂难点在隐私边界和用户主动管理机制的设计这个要谨慎推进。另外在过程管理上这次1.5的迭代周期是三周比计划的四周少了一周原因是前期基线验证做得比较扎实后期没有出现推倒重来的情况。这部分节省下来的时间我用在了回归测试上换来了对版本质量的信心。按我个人的经验版本开发日志最容易写偏的地方是罗列功能清单而忽略决策过程。真正后来有价值的部分恰恰是当时为什么选这条路而不选那条路以及踩坑之后的教训。这篇日志里写下来的都是我回看时会觉得有用的内容。也希望正在做相似方向的同行能从这里找到一些可以参考的思路。