这道题问的是专业领域知识助手怎么落地,本质是在准确性和覆盖度之间找平衡,不能像通用聊天机器人那样瞎编。医疗、法律这种场景,错了就是人命关天或者法律纠纷,所以整个链路都得围绕「可信」来设计。
先说文档处理。专业文档不是排版漂亮的网页,很多是扫描件、表格、手写批注。我会先用 [[OCR]] 加 [[Multimodal]] 模型,比如 LayoutLM,把图文混排的内容抽成结构化文本,同时保留章节层级,比如病历里的主诉、检查、诊断这些段落。切分的时候不能按固定字数切,那样会把关键上下文切断。我会按语义边界来切,比如法律条文按条款切,医疗按一个完整病例段落切,保证每块信息自包含。另外,我会给每个块打上元数据,比如文档来源、发布时间、效力等级,因为临床指南和专家共识权重不一样。
索引这块,我倾向双轨策略。稠密向量用领域微调的 [[Embedding]],比如医疗用 PubMedBERT,法律用法律语料微调的模型,做语义匹配。同时保留稀疏关键词,用 [[BM25]] 配合专业词表,做精准匹配,比如药品名、法条编号这种不能靠语义。这俩互补,向量管模糊搜索,关键词管精确查找。真正落地时,我很少只用一种,都是[[混合检索]]。另外,如果领域知识结构性强,我会搭一个 [[Knowledge Graph]],抽取实体关系,比如疾病和症状、药品和禁忌,这样检索时能通过图谱邻居扩展,找到间接相关的片段。
检索策略,我走多路召回加精排再加[[重排]]。召回层同时跑向量、关键词和图谱邻居,各取 Top-K,合并去重。然后精排用 [[Cross-Encoder]] 打分,把低相关的过滤掉。重排时我会按时效性和权威性加权,比如医疗场景,临床指南排前面,个人经验帖排后面。这里有个坑:查询里经常有专业缩写,比如心梗、PCI,如果不扩展,向量可能匹配不上。所以我会做同义词扩展,把缩写还原成全称。
生成优化是最后防线。我会在 [[System Prompt]] 里强制要求引用来源,格式像「根据《XX指南》第X条」这样,不允许无来源输出。同时用约束解码,禁止生成索引里没有的信息,比如设一个医学安全词表,拦截不存在的药品名。另外,检索结果有时很长,我会用 LLM 自己做上下文压缩,去冗余,只保留关键证据链。
评估不能只看常规指标。检索质量我关注 Recall@K,生成质量我关注事实准确性,用 NLI 模型检测有没有 [[Hallucination]]。但更重要的业务指标是可追溯性,看生成内容是不是每句话都能追到源文档,还有专家满意度,请领域专家盲评。我的取舍是:宁可回答不了,也不瞎回答。 如果检索结果置信度不够,我会触发人工兜底,而不是硬生成。
说到人工兜底,其实这里有个延伸问题:如果用户问的是多跳问题,比如「这个症状应该用哪种药,但指南里没有直接说,需要从两个段落推理出来」,那简单的 [[Naive RAG]] 就不够用了。这时候我会考虑 [[Agentic RAG]] 或者 [[Self-RAG]],让模型自己决定要不要再搜、要不要推理。但这个对延迟和稳定性要求高,得根据业务场景权衡。