这道题其实是在问:怎么让大模型在专业领域里真正落地,而不是只是背教材。核心就是怎么把领域知识组织好、检索准、生成稳。我按数据、检索、生成、评估这条线来说。
先说数据准备。专业领域的数据,比如医疗病历、法律合同、金融财报,通常是 PDF 或扫描件,得先解析成结构化文本。我一般用 Unstructured 或 MinerU,保留标题层级和表格结构,表格转成 Markdown。然后做领域术语标准化,比如医疗里把“心梗”和“心肌梗死”统一映射到 ICD-10 编码,不然检索时会漏。
[[分块]]策略上,我倾向于按语义边界切,比如按章节或段落,而不是固定长度。医疗场景也不能直接套固定数值;我会按资料结构提出多组 chunk size 与重叠候选,再用同一评测集比较证据完整率、召回和成本。关键是注入元数据,比如文档来源、发布时间、置信度,这样后续检索能按时间或权威度过滤。
检索模块。我很少只用向量检索,因为专业领域里关键词匹配往往更精准。所以我会用 [[混合检索]],把 [[Dense Retrieval]] 和 [[BM25]] 结合起来。比如金融场景,用户搜“第X条”,BM25 能直接命中,向量反而可能跑偏。查询改写也很重要,用户问“这个药能吃吗”,我会先用 HyDE 生成一个假设回答再检索,或者用 LLM 把问题扩展成更完整的表达。
召回结果用 [[Cross-Encoder]] [[重排序]],比如 bge-reranker,把相关性分数算一遍,取 Top-K。这里有个坑:如果领域数据少,重排序模型可能过拟合,所以我会用通用模型再加少量领域数据微调。
生成模块。Prompt 设计是基础,系统角色要固化,比如“你是资深法律顾问,基于以下参考资料回答,不确定就说不知道”。上下文按相关性排序,标注来源编号,强制要求引用,比如“依据[1]第X条”。这样能减少 [[Hallucination]]。
还有上下文压缩,比如用 LLMLingua 去掉冗余句子,只保留核心证据,因为专业文档往往很长,模型上下文窗口有限。输出格式我倾向用 JSON 结构化,比如诊断、依据、置信度,方便下游系统解析。
评估和迭代。自动化指标我用 [[RAGAS]] 测[[忠实度]]和答案相关性,检索侧看 Recall@K 和 MRR。但更关键的是领域专家抽审,比如医疗场景找执业医师打分,看答案有没有误导。
bad case 归因要区分是检索失败还是生成失败:如果召回没相关文档,那问题在检索;如果召回有但模型答错,那是生成问题。
最后,我会特别关注数据飞轮。用户反馈比如点赞点踩,收集起来做难例挖掘,然后微调 [[Embedding]] 或 Rerank 模型,再 A/B 验证。但这里有个前提:反馈量要足够大,小流量场景容易噪声淹没信号。
所以整体上,我更倾向把 [[RAG]] 系统看作一个持续优化的闭环,而不是一次性搭建。数据质量永远比模型重要,如果文档解析或者术语标准化没做好,后面检索和生成再努力也白搭。