Medical-RAG 是一个专为中文医疗领域设计的问答智能体项目. 它基于检索增强生成(RAG)技术,通过结合外部知识库来提升大型语言模型(LLM)在医疗建议上的准确性和安全性. 该项目的核心是利用高性能向量数据库 Milvus 存储和检索医疗知识,并整合 LangChain 框架来管理整个问答流程. 项目实现了一套完整的自动化数据处理流水线,包括使用LLM进行智能数据标注、构建医疗领域专用词表以及将数据高效入库. 它采用先进的混合检索架构,结合了稠密向量的语义检索和稀疏向量的关键词检索(BM25),并通过可配置的重排算法融合多路结果,以提高检索内容的精准度. 开发者可以通过灵活的YAML配置文件来部署和管理整个系统,使其能够适应不同的运行环境和需求.
機能一覧
- 自动化数据处理: 项目提供自动化数据标注流水线,支持通过HTTP或本地GPU调用大模型进行推理,加速标注流程.
- 自动化词表管理: 内置多线程和医疗领域分词器,能够自动化构建和管理用于稀疏检索的词表,提升查询准确性.
- 混合检索架构: 同时支持稠密向量检索和稀疏向量检索。稠密检索支持Ollama、OpenAI、HuggingFace等多种嵌入模型;稀疏检索则使用经过医疗领域优化的BM25算法.
- 结果重排与融合: 支持使用RRF(Reciprocal Rank Fusion)或加权方式融合多路检索结果,提升最终答案的相关性.
- 医疗领域深度优化: 预设了包含6大科室分类和8大问题类别的专业分类体系,并使用
pkuseg
医疗领域分词模型进行文本处理. - 高性能向量数据库: 基于Milvus v2.6+版本,支持高效率的向量检索、批量嵌入和并发查询.
- 灵活的配置系统: 所有核心参数,如数据库连接、模型选择、检索策略等,均通过YAML文件进行配置,便于在不同环境中部署和调整.
- 高效率接口封装: 封装了Milvus的常用接口,并提供了
RAGSearchTool
等核心工具类,方便开发者进行二次开发和调用.
ヘルプの使用
该项目提供了一套完整的从环境准备到最终查询的流程,以下是详细的操作步骤,旨在帮助用户快速上手使用.
ステップ1:環境準備
在开始之前,你需要准备好基础的运行环境,包括克隆项目、安装依赖以及启动所需的服务。
- プロジェクトコードの複製
首先,从GitHub上克隆medical-rag
的源代码到你的本地机器。git clone https://github.com/yolo-hyl/medical-rag cd medical-rag/src
- プロジェクトの依存関係をインストールする
项目使用Python开发,所有依赖项都记录在setup.py
中。使用pip进行安装。pip install -e .
- 启动Milvus向量数据库
项目使用Milvus作为向量数据库,推荐使用Docker来启动。项目代码中已经包含了便捷的启动脚本。cd Milvus bash standalone_embed.sh start ``` 此命令会启动一个单机版的Milvus实例。
- 启动Ollama服务(可选)
如果你计划使用本地运行的大模型(如Qwen)进行数据标注或生成答案,你需要安装并启动Ollama。# 启动Ollama服务 ollama serve # 拉取需要用到的模型 # bge-m3是一个常用的嵌入模型,用于生成向量 ollama pull bge-m3:latest # qwen2:7b是一个性能不错的标注和问答模型 ollama pull qwen2:7b
第二步:基础配置
在运行具体流程之前,需要配置核心参数。配置文件位于src/MedicalRag/config/default.yaml
。你需要根据你的环境修改以下关键信息:
- Milvus连接信息を確保する。
uri
歌で応えるtoken
与你启动的Milvus实例匹配。milvus: client: uri: "http://localhost:19530" token: "root:Milvus" collection: name: "qa_knowledge"
- 嵌入模型配置:指定用于生成稠密向量的模型。以下配置使用本地Ollama服务中的
bge-m3
モデルembedding: dense: provider: ollama model: "bge-m3:latest" base_url: "http://localhost:11434"
第三步:数据处理与入库
数据处理是构建问答系统的核心,项目将其分为数据标注、构建词表、创建集合和数据入库四个环节。
- データ注釈
此步骤利用大语言模型自动为原始的问答数据进行分类(如所属科室、问题类型)。- 首先,配置标注参数文件:
src/MedicalRag/config/data/annotator.yaml
. - 然后,运行标注脚本:
python scripts/annotation.py src/MedicalRag/config/data/annotator.yaml
- 首先,配置标注参数文件:
- 构建词表
为了支持BM25稀疏检索,需要根据医疗领域的语料构建一个专有词汇表。python scripts/build_vocab.py
该脚本会处理数据并生成一个名为
vocab.pkl.gz
的词表文件。 - 创建Milvus集合(Collection)
此步骤会在Milvus中创建一个用于存储向量和相关信息的集合。集合的结构(Schema)由default.yaml
配置文件定义。# 使用默认配置文件创建集合 python scripts/create_collection.py -c src/MedicalRag/config/default.yaml # 如果需要强制删除并重建集合,可以添加--force-recreate参数 python scripts/create_collection.py --force-recreate
- 数据入库
将经过处理和标注的数据进行向量化,并最终存入Milvus集合中。python scripts/insert_data_to_collection.py
这个脚本会自动处理数据的向量化(包括稠密和稀疏向量)并批量插入数据库。
第四步:查询与检索
当数据全部入库后,就可以开始进行问答检索了。
- 配置查询策略
你可以通过修改src/MedicalRag/config/search/search_answer.yaml
文件来定义检索策略,例如调整不同检索通道(稠密、稀疏)的权重。 - 运行查询脚本
利用するsearch_pipline.py
脚本来执行查询。# 使用指定的搜索配置文件进行查询 python scripts/search_pipline.py --search-config src/MedicalRag/config/search/search_answer.yaml
脚本会进入一个交互模式,你可以输入问题(如“梅毒的症状有哪些?”)来测试检索效果。
核心工具使用
项目还提供了一个名为RAGSearchTool
的工具类,方便在其他代码中直接调用检索功能。
from MedicalRag.tools.rag_search_tool import RAGSearchTool
# 从配置文件初始化工具
tool = RAGSearchTool("config/search.yaml")
if tool.is_ready():
# 执行单个查询
results = tool.search("梅毒的症状有哪些?")
print(results)
# 执行批量查询
results_batch = tool.search(["梅毒的治疗方法", "高血压的预防措施"])
print(results_batch)
# 带过滤条件的查询(例如,只在“外科”相关的知识中检索)
results_filtered = tool.search("骨折怎么办", filters={"dept_pk": "3"}) # 假设3代表外科
print(results_filtered)
アプリケーションシナリオ
- 智能诊疗助手
该系统可以作为医生的临床辅助工具。当医生遇到复杂或罕见的病例时,可以快速查询相关的诊疗指南、药物信息和最新的医学研究,为诊断和治疗提供决策支持。 - 医学生教育与培训
可用于构建模拟问诊系统,帮助医学生在虚拟环境中练习提问、诊断和制定治疗方案。系统能够根据学生的提问提供标准答案和相关知识点,加快学习进程。 - 患者健康咨询
可以部署为面向公众的智能客服或聊天机器人,为患者提供7×24小时的初步健康咨询服务。用户可以询问关于常见疾病、症状、用药注意事项等问题,系统能提供来自权威知识库的安全、准确的回答,缓解医院门诊压力。 - 医疗知识库管理与检索
对于医院和研究机构,该系统可以整合内部的海量医疗文档、病历和研究论文,构建一个智能化的知识管理平台。研究人员和医护人员可以通过自然语言快速、精准地找到所需信息。
品質保証
- 这个项目解决了什么问题?
它主要解决了通用大语言模型在专业领域(尤其是医疗领域)知识不足、容易产生“幻觉”或提供不准确信息的问题。通过RAG技术,将模型回答限制在可靠的外部医疗知识库范围内,从而提供更准确、安全的医疗建议. - 项目中使用了哪些关键技术?
项目主要使用了检索增强生成(RAG)、向量数据库(Milvus)、自然语言处理框架(LangChain)、混合检索技术(稠密向量与稀疏向量BM25结合)以及多种可选的大语言模型后端(如Ollama, OpenAI等). - 如何更换项目中使用的嵌入模型或语言模型?
更换模型非常简单,只需要修改对应的YAML配置文件即可. 例如,要更换稠密嵌入模型,可以在default.yaml
修正embedding.dense
シェアprovider
歌で応えるmodel
字段。同样,数据标注使用的LLM可以在annotator.yaml
中进行配置. - 如果检索效果不理想,应该如何优化?
有多种优化方式. 首先,可以尝试调整search_answer.yaml
配置文件中不同检索通道的weight
(权重),以改变稠密和稀疏检索结果的融合比例. 其次,可以检查并扩充用于构建词表的数据,生成一个更高质量的vocab.pkl.gz
文件来提升稀疏检索的准确性. 最后,确保你的知识库数据质量高且覆盖面广是提升效果的根本.