项目实训开发日志(十):BabyMind:基于多Agent和RAAG的科学育儿辅助平台

📅 2026/6/16 18:08:36
项目实训开发日志(十):BabyMind:基于多Agent和RAAG的科学育儿辅助平台
引言在第九周我们已经围绕问答会话操作栏、分享页、发布页和APK下载链路完成了用户侧交付能力的补齐。进入第十周也是整个项目的收尾阶段后我们的开发重点进一步从功能实现与否转向系统能否接住真实材料、能否被后台观测、能否经受验收测试。因此本周我们主要围绕以下几个方向展开1、完成材料问答闭环让系统能够围绕真实文档连续提问2、接入Vue3管理后台并将真实遥测指标写入数据库3、补充测试材料、评测脚本和验证流程为最终验收做准备4、对材料问答、流式推荐、后台管理和交付链路做最后一轮联调与收尾。一、本周整体完成内容1、完成材料问答闭环支持真实文档进入统一问答流程这一周最核心的工作是附件上传入口的材料问答功能的实现。前几周我们已经完成了统一问答入口、流式问答和会话链路但当用户面对的不是一句自然语言而是一份化验单、配料表、检查报告时原有问答模式就不够用了。因此本周后端新增并完善了文档解析链路。在backend/api/routers/qa.py中系统已经支持通过POST /api/v1/qa/attachments/parse先对上传材料进行解析再进入后续问答流程。当前支持的材料类型包括TXT文本文件、PDF文件、DOC文件、DOCX文件。为了保证解析过程稳定可控backend/services/document_parse_service.py中对上传文件大小和正文长度做了限制单文件最大10MB正文最多保留30000字符并额外生成一段预览摘要供后续检索和上下文拼接使用。这条解析链路不是只做普通文本读取而是做了本地解析 OCR/远程文档解析兜底的双层设计。对于普通TXT、可提取文本的PDF和DOCX系统优先本地解析如果本地解析拿不到有效文本例如扫描版PDF、图片型报告、传统DOC等情况就自动切换到SophNet文档解析能力兜底。在backend/services/document_parse_service.py中兜底逻辑如下normalized_text _normalize_text(local_text) remote_failure_reason: str | None None if not normalized_text and file_type in _REMOTE_PARSE_FILE_TYPES: remote_text, remote_failure_reason await _try_remote_document_parse( raw_bytesraw_bytes, filenamefilename, media_typeresponse_media_type, )这一实现解决了一个很现实的问题真实育儿场景里的材料往往不是标准电子文档而是手机拍下来的检查单、医院导出的扫描件或者不同编码格式的文本。只有把这些情况都考虑进去材料问答才不是一个演示功能而是真正可用的输入链路。2、材料不再是临时文本拼接而是正式问答字段如果只是把解析后的文档内容简单拼接到用户问题后面虽然短期也能工作但后续维护会非常混乱。因此本周我们进一步把材料上下文从临时附加文本升级成了正式请求字段。在backend/schemas/qa.py中当前问答请求已经新增了document字段在frontend/app/src/main/java/com/babymind/ui/viewmodel/QAViewModel.kt中前端也会将当前附件整理成QADocumentContext后再统一发送。这样一来材料不再属于某一条特殊分支里的临时逻辑而是成为统一问答协议的一部分。后端收到document后会通过backend/services/document_context_service.py构造材料提示块并在两个层面使用它第一在用户消息构造阶段通过build_document_augmented_user_message把材料和当前问题组织在同一条问答上下文里第二在检索阶段通过build_document_retrieval_query把材料摘要一起用于RAG查询。材料同时参与检索和生成两步而不只是单纯作为补充说明存在。对于健康、时间轴、营养这三类Agent来说让三条问答链路都能共享同一份材料上下文。3、前端补齐材料持续追问体验不输入问题也能直接分析材料问答除了后端能解析还必须在前端交互上成立。本周我们围绕问答页又继续补齐了一批体验细节让围绕同一份材料连续提问变得顺手。当前问答页已经支持从系统文件中选择图片、PDF、TXT、DOC和DOCX。用户上传完材料后如果暂时不想再输入额外问题也可以直接发送系统会自动补上一句默认提问“请帮我分析一下这份材料。”这一逻辑在frontend/app/src/main/java/com/babymind/ui/viewmodel/QAViewModel.kt中if (normalized.isBlank()) { val fallback attachment?.defaultQuestion ?: return null return PreparedQuestion( requestText fallback, displayText 请帮我分析这份材料, ) }除此之外本周前端还继续完善了材料状态保留逻辑。当前文档一旦解析成功材料不会在首轮提问后立刻消失而是继续作为当前材料存在后续追问默认继续围绕这份材料展开。这样用户可以先问“这张血常规怎么看”再继续追问“白细胞高代表什么”“这种情况要不要去医院”“还能不能打疫苗”形成连续会话而不是每问一句都重新上传。4、修复材料问答下的流式推荐问题并清理内部系统话术材料问答链路接通后我们在联调中还发现两个实际问题。第一个问题是流式回答在部分材料场景下会丢失“猜你想问”推荐。为了解决这个问题我们在SseClient和QAViewModel中统一调整了done事件处理逻辑优先读取后端显式返回的suggestions如果为空再从流式文本中兜底解析。这样材料问答下的追问建议不再丢失连续交互体验更稳定。第二个问题是模型在某些材料场景下会把内部路由、Agent调用或工具执行过程带进最终回答。对于开发调试来说这些内容有帮助但对于家长来说这类表述只会破坏产品体验。因此本周我们继续完善了backend/core/answer_cleanup.py中的用户可见答案清洗逻辑专门过滤“查询了什么”“调用了什么工具”“通知了哪个Agent”“数据库已更新”之类的内部语句并结合document_context_service中的提示词约束让模型更多输出结论、依据和建议而不是中间过程。5、新增Vue3管理后台补齐验收和维护视角除了面向家长的App端本周另一项关键工作是新增Vue3管理后台。前几周我们的重心主要放在移动端交互和后端智能问答能力上但到了项目验收阶段仅有用户侧页面还不够我们还需要一个能查看运行情况、审计用户数据、维护知识库和规则配置的后台控制台。当前管理后台位于admin-frontend目录下使用Vue3、TypeScript、Vite、Element Plus和ECharts构建。主要页面包括Dashboard.vue大盘监控与遥测图表DataAudit.vue用户、宝宝、健康记录、疫苗计划和会话轨迹审计RuleEngine.vueRAG知识文档管理和疫苗规则矩阵维护Login.vue与AdminLayout.vue后台登录与整体布局。与这套前端配套的后端接口已经在backend/api/routers/admin.py中接入而不是只有页面壳子。当前已经实现的核心能力包括POST /api/v1/admin/auth/login管理员登录GET /api/v1/admin/telemetry/metrics遥测指标总览GET /api/v1/admin/audit/users用户和宝宝审计GET /api/v1/admin/audit/users/{user_id}/chat-trail查看会话执行轨迹GET /api/v1/admin/knowledge/documents查看知识文档POST /api/v1/admin/knowledge/documents上传知识文档GET /api/v1/admin/rules/vaccine-schedule读取疫苗规则矩阵PUT /api/v1/admin/rules/vaccine-schedule保存疫苗规则矩阵。这样一来BabyMind不再只有面向用户的前台App也开始具备面向验收、观测和维护的后台能力。6、接入遥测埋点后台看到的不再是静态演示数据管理后台要有说服力关键不在于页面画了多少图而在于图里的数据是不是来自真实运行过程。为此本周我们进一步把问答运行过程中的关键指标落到了数据库里。在backend/models/qa_history.py中当前QAHistory模型已经补充了四个遥测字段prompt_tokens: Mapped[int | None] mapped_column(Integer, nullableTrue) completion_tokens: Mapped[int | None] mapped_column(Integer, nullableTrue) latency_ms: Mapped[int | None] mapped_column(Integer, nullableTrue) status_code: Mapped[str | None] mapped_column(String(20), nullableTrue)这四个字段并不是静态预留。本周在backend/services/rag_service.py中我们已经把它们真实写入问答落库流程系统会在回答成功后记录Token消耗、响应时延和状态码如果执行失败也会记录一条ERROR状态的问答历史供后台统计错误率。同时为了兼容已有数据表结构我们还补充了backend/migrate_telemetry.py脚本用于幂等地为qa_histories表增加这些字段。这样管理后台中展示的总Token消耗、平均延迟、活跃会话数、错误率以及按Agent维度的图表已经具备了真实数据来源而不只是演示页面。7、补充测试材料与评测流程为最终验收做准备本周除了补功能我们还继续整理了项目的测试材料和验证流程。因为到了最后阶段不能再只靠页面截图和口头描述证明系统能力而需要准备可复现、可解释、可演示的测试资产。在材料问答这条线上仓库中已经提交了发热血常规模拟材料及生成脚本主要包括test_materials/generate_fever_reports.pytest_materials/fever_cbc_report_test.pdftest_materials/fever_cbc_report_test.docxtest_materials/fever_cbc_report_test.txt其中generate_fever_reports.py会自动生成一组结构统一的儿童发热血常规测试材料用于验证PDF、DOCX、TXT等不同格式在解析、摘要、问答和持续追问场景下的表现。除此之外本地联调过程中我们还补充准备了配料表图片、证件类PDF以及探测样本用于检查扫描件、图片型材料和不同编码文本的兼容性。在评测流程上项目中的tests/eval目录已经形成了一整套验收脚本包括eval_rag.pyRAG检索准确率评测eval_extraction.py关键信息提取准确率评测eval_cross_agent_sync.py跨Agent同步正确性评测eval_latency.py多Agent响应时间评测eval_voice.py语音相关指标评测test_async_notify.py异步通知优化前后的延迟对比。与此同时docs/acceptance_metrics.md也已经整理了当前量化验收结果和未达标项说明。这样做的意义在于项目最后的展示不再只依赖“这一次演示恰好成功”而是有脚本、有材料、有结果文件支撑整个验收过程。二、本周核心代码与模块本周核心代码主要集中在以下几个方向1、材料问答与文档解析backend/api/routers/qa.pybackend/schemas/document.pybackend/schemas/qa.pybackend/services/document_parse_service.pybackend/services/document_context_service.pybackend/core/answer_cleanup.pybackend/services/rag_service.py主要负责材料上传解析、正式问答字段接入、OCR兜底、上下文构造和用户可见回答清洗。2、前端材料问答交互frontend/app/src/main/java/com/babymind/network/QAModels.ktfrontend/app/src/main/java/com/babymind/network/SseClient.ktfrontend/app/src/main/java/com/babymind/ui/viewmodel/QAViewModel.ktfrontend/app/src/main/java/com/babymind/ui/screens/QAScreen.ktfrontend/app/src/main/java/com/babymind/ui/components/ImageInputRow.ktfrontend/app/src/main/java/com/babymind/ui/components/AttachmentBadgeStyle.kt主要负责材料选择、解析结果展示、默认材料分析、持续追问和流式推荐修复。3、管理后台与真实遥测backend/api/routers/admin.pybackend/models/qa_history.pybackend/migrate_telemetry.pybackend/api/deps.pyadmin-frontend/src/views/Dashboard.vueadmin-frontend/src/views/DataAudit.vueadmin-frontend/src/views/RuleEngine.vueadmin-frontend/src/views/Login.vueadmin-frontend/src/layout/AdminLayout.vue主要负责后台登录、遥测指标、数据审计、知识库管理、疫苗规则维护和真实埋点落库。4、测试材料与评测流程test_materials/generate_fever_reports.pytests/eval/eval_rag.pytests/eval/eval_extraction.pytests/eval/eval_cross_agent_sync.pytests/eval/eval_latency.pytests/eval/eval_voice.pydocs/acceptance_metrics.md主要负责最终测试材料准备、自动评测脚本和验收指标整理。三、本周遇到的问题与解决思路1、真实材料格式远比普通问答复杂自然语言提问可以直接送进问答链路但真实材料会带来编码、格式、扫描件、空文本、结构化表格等复杂情况。如果后端只依赖一种解析方式材料问答很容易在真实场景下失效。因此本周我们采用了本地解析优先、OCR与远程文档解析兜底的策略把常规文档和扫描件统一纳入同一条链路中处理。2、材料问答中的回答容易暴露内部系统过程在多Agent、RAG和流式生成同时叠加后模型有时会把中间过程带到最终输出里例如“我先查询了”“通知了哪个Agent”“数据库已更新”等。这些内容对调试有帮助但对用户没有价值。因此本周我们同时从提示词和结果清洗两端入手一方面约束模型优先输出结论另一方面用answer_cleanup对内部话术做统一过滤。3、管理后台不能只停留在前端演示页面单独做一个后台页面并不难难的是让它展示真实数据。本周我们在QAHistory中补充遥测字段并在问答落库阶段真实记录Token、延迟和状态码再由/admin/telemetry/metrics进行聚合统计这样后台图表才有实际意义。4、验收过程不能只依赖临时演示到了最后阶段如果测试材料、评测脚本和结果说明都不完善那么系统再完整验收时也容易讲不清。因此本周我们一方面补充了发热血常规等标准化材料另一方面继续整理tests/eval下的自动评测流程并对已有结果进行文档化尽量让项目的最终展示更可复现。四、阶段性成果经过第十周开发BabyMind项目已经从第九周的“用户侧交付链路基本完整”进一步进入到“材料输入、后台观测和验收测试三条收尾链路基本完成”的阶段。当前系统已经具备围绕真实PDF、DOC、DOCX、TXT等材料进行问答和连续追问的能力扫描版文档和图片型报告的OCR/远程解析兜底面向管理和验收的Vue3后台控制台问答真实遥测指标采集、落库与后台展示能力成体系的测试材料、评测脚本和验收结果文档。五、项目收尾与答辩准备到这一篇为止BabyMind的开发已经基本完成。接下来的工作将不再以新增大功能为主而是围绕以下几个方向做最后收尾继续做一轮文本问答、语音问答、材料问答、分享页、后台管理的回归联调整理答辩时的演示路径保证健康问答、营养建议、时间轴联动、材料问答和后台监控都能稳定展示完成仓库文档终审保证部署、测试和运行流程清晰可复现收拢博客、文档和演示素材为最终验收做统一准备。总体来看第十周是BabyMind项目从“功能开发阶段”转入“最终收尾阶段”的关键一周。前台的交互、材料的理解、后台的观测和测试的验证四条线在这一阶段基本完成汇合也让整个项目具备了更完整的交付形态。欢迎各位老师、同学批评指正