O Medical-RAG é um projeto de inteligência de perguntas e respostas desenvolvido para o domínio médico chinês. Ele se baseia na tecnologia RAG (Retrieval Augmented Generation), que aprimora a precisão e a segurança dos LLMs (Large Language Models) para aconselhamento médico por meio da incorporação de bases de conhecimento externas. O núcleo do projeto é o uso do Milvus, um banco de dados vetorial de alto desempenho, para armazenar e recuperar conhecimento médico, e a integração da estrutura LangChain para gerenciar todo o processo de perguntas e respostas. O projeto implementa um pipeline completo de processamento automatizado de dados, incluindo anotação inteligente de dados usando LLM, construção de listas de palavras específicas do domínio médico e armazenamento eficiente de dados. Ele adota uma arquitetura avançada de recuperação híbrida que combina a recuperação semântica com vetores densos e a recuperação de palavras-chave com vetores esparsos (BM25) e funde vários resultados com um algoritmo de rearranjo configurável para melhorar a precisão do conteúdo recuperado. O desenvolvedor pode implantar e gerenciar todo o sistema por meio de arquivos de configuração YAML flexíveis, permitindo que ele se adapte a diferentes ambientes operacionais e requisitos.
Lista de funções
- Processamento automatizado de dadosDescrição: o projeto fornece um pipeline de anotação de dados automatizado que suporta inferência de modelos grandes via HTTP ou chamadas locais de GPU para acelerar o processo de anotação.
- Gerenciamento automatizado de listas de palavrasLéxico de domínio médico e multi-threaded integrado que automatiza a construção e o gerenciamento de listas de palavras para pesquisas esparsas a fim de aumentar a precisão da consulta.
- Arquitetura de pesquisa híbridaRecuperação de vetores: suporta a recuperação de vetores densos e esparsos. A recuperação densa oferece suporte a vários modelos de incorporação, como Ollama, OpenAI, HuggingFace etc., enquanto a recuperação esparsa usa o algoritmo BM25, que foi otimizado para a área médica.
- Rearranjo e integração de resultadosSuporte ao uso de RRF (Reciprocal Rank Fusion) ou fusão ponderada de vários resultados de pesquisa para melhorar a relevância da resposta final.
- Otimização profunda na área médicaUm sistema de classificação profissional predefinido, contendo 6 classificações departamentais principais e 8 categorias de problemas principais, e o uso de
pkuseg
Modelagem de segmentação de domínio médico para processamento de texto. - Banco de dados vetorial de alto desempenho: baseado no Milvus v2.6+, suporta pesquisa vetorial eficiente, incorporação em lote e consultas simultâneas.
- Sistema de configuração flexívelArquivos YAML: todos os parâmetros principais, como conexão de banco de dados, seleção de modelos, estratégia de recuperação etc., são configurados por meio de arquivos YAML, que são fáceis de implantar e ajustar em diferentes ambientes.
- Pacote de interface de alta eficiênciaEncapsula as interfaces usuais do Milvus e fornece a função
RAGSearchTool
Ferramentas essenciais, como o desenvolvedor, para facilitar o desenvolvimento secundário e a chamada.
Usando a Ajuda
O projeto oferece um conjunto completo de ambiente, desde a preparação até o processo de consulta final. A seguir, um procedimento detalhado passo a passo, desenvolvido para ajudar os usuários a começar rapidamente.
Etapa 1: Preparação ambiental
Antes de começar, você precisa preparar o ambiente básico de tempo de execução, incluindo a clonagem do projeto, a instalação de dependências e a inicialização dos serviços necessários.
- Clonagem do código do projeto
Primeiro, clone-o do GitHubmedical-rag
em seu computador local.git clone https://github.com/yolo-hyl/medical-rag cd medical-rag/src
- Instalar as dependências do projeto
O projeto é desenvolvido em Python e todas as dependências estão documentadas no arquivosetup.py
em. Use tubulação para a instalação.pip install -e .
- Iniciar o banco de dados do Milvus Vector
O projeto usa o Milvus como um banco de dados vetorial e o Docker é recomendado para iniciá-lo. Um prático script de inicialização já está incluído no código do projeto.cd Milvus bash standalone_embed.sh start ``` 此命令会启动一个单机版的Milvus实例。
- Iniciar o serviço Ollama (opcional)
Se você planeja usar um modelo grande executado localmente (como o Qwen) para anotação de dados ou geração de respostas, é necessário instalar e iniciar o Ollama.# 启动Ollama服务 ollama serve # 拉取需要用到的模型 # bge-m3是一个常用的嵌入模型,用于生成向量 ollama pull bge-m3:latest # qwen2:7b是一个性能不错的标注和问答模型 ollama pull qwen2:7b
Etapa 2: Configuração básica
Antes de executar um processo específico, os parâmetros principais precisam ser configurados. O arquivo de configuração está localizado no diretóriosrc/MedicalRag/config/default.yaml
. Você precisará modificar as seguintes informações-chave de acordo com seu ambiente:
- Informações sobre a conexão MilvusPara garantir que
uri
responder cantandotoken
Combine a instância do Milvus que você iniciou.milvus: client: uri: "http://localhost:19530" token: "root:Milvus" collection: name: "qa_knowledge"
- Configuração do modelo incorporadoModelo: Especifica o modelo a ser usado para gerar vetores densos. A configuração a seguir usa o serviço Ollama local no diretório
bge-m3
Modelos.embedding: dense: provider: ollama model: "bge-m3:latest" base_url: "http://localhost:11434"
Etapa 3: Processamento de dados e inventário
O processamento de dados é o núcleo da criação de um sistema de Q&A, que o projeto divide em quatro partes: rotulagem de dados, construção de listas de palavras, criação de coleções e entrada de dados.
- anotação de dados
Essa etapa usa um modelo de linguagem grande para classificar automaticamente os dados brutos de Q&A (por exemplo, afiliação ao departamento, tipo de pergunta).- Primeiro, configure o arquivo de parâmetros de rotulagem:
src/MedicalRag/config/data/annotator.yaml
. - Em seguida, execute o script de anotação:
python scripts/annotation.py src/MedicalRag/config/data/annotator.yaml
- Primeiro, configure o arquivo de parâmetros de rotulagem:
- construir uma lista de palavras
Para dar suporte à recuperação esparsa do BM25, um vocabulário proprietário precisa ser construído com base no corpus do domínio médico.python scripts/build_vocab.py
O script processa os dados e gera um arquivo chamado
vocab.pkl.gz
do arquivo de lista de palavras. - Criação de uma coleção Milvus (Coleção)
Essa etapa cria uma coleção no Milvus para armazenar vetores e informações relacionadas. A estrutura (Schema) da coleção é dada pelodefault.yaml
Definição de perfil.# 使用默认配置文件创建集合 python scripts/create_collection.py -c src/MedicalRag/config/default.yaml # 如果需要强制删除并重建集合,可以添加--force-recreate参数 python scripts/create_collection.py --force-recreate
- Entrada de dados
Os dados processados e rotulados são vetorizados e finalmente depositados na coleção Milvus.python scripts/insert_data_to_collection.py
Esse script processa automaticamente a vetorização dos dados (vetores densos e esparsos) e os insere em lote no banco de dados.
Etapa 4: Pesquisa e recuperação
Depois que os dados forem inseridos, a pesquisa de perguntas e respostas pode começar.
- Configuração de políticas de consulta
Você pode fazer isso modificando osrc/MedicalRag/config/search/search_answer.yaml
para definir a estratégia de recuperação, por exemplo, ajustando os pesos de diferentes canais de recuperação (denso, esparso). - Executar o script de consulta
fazer uso desearch_pipline.py
para executar a consulta.# 使用指定的搜索配置文件进行查询 python scripts/search_pipline.py --search-config src/MedicalRag/config/search/search_answer.yaml
O script entra em um modo interativo em que você pode inserir uma pergunta (por exemplo, "Quais são os sintomas da sífilis?") para testar a pesquisa.
Uso de ferramentas essenciais
O projeto também fornece um arquivo chamadoRAGSearchTool
para facilitar chamadas diretas para a função de recuperação em outro código.
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)
cenário do aplicativo
- Assistente de diagnóstico inteligente
O sistema pode ser usado como um auxílio clínico para médicos. Quando um médico se depara com um caso complexo ou raro, ele pode pesquisar rapidamente as diretrizes relevantes de diagnóstico e tratamento, informações sobre medicamentos e as pesquisas médicas mais recentes para fornecer suporte à decisão de diagnóstico e tratamento. - Educação e treinamento de estudantes de medicina
Ele pode ser usado para criar um sistema de consulta simulada para ajudar os estudantes de medicina a praticar a formulação de perguntas, o diagnóstico e o desenvolvimento de planos de tratamento em um ambiente virtual. O sistema pode acelerar o processo de aprendizado fornecendo respostas padrão e pontos de conhecimento relevantes com base nas perguntas dos alunos. - Aconselhamento sobre a saúde do paciente
Ele pode ser implantado como um serviço de atendimento ao cliente inteligente voltado para o público ou um chatbot para fornecer aos pacientes serviços iniciais de aconselhamento de saúde 24 horas por dia, 7 dias por semana. Os usuários podem fazer perguntas sobre doenças comuns, sintomas, precauções com medicamentos, etc., e o sistema pode fornecer respostas seguras e precisas a partir de uma base de conhecimento autorizada, aliviando a pressão sobre os ambulatórios dos hospitais. - Gerenciamento e recuperação de bases de dados de conhecimento médico
Para hospitais e organizações de pesquisa, o sistema pode integrar documentos médicos internos em massa, registros médicos e artigos de pesquisa para criar uma plataforma inteligente de gerenciamento de conhecimento. Pesquisadores e profissionais de saúde podem encontrar as informações de que precisam com rapidez e precisão por meio de linguagem natural.
QA
- Qual é o problema que esse projeto resolve?
Ele aborda o problema de que os modelos de linguagem grandes para fins gerais não têm conhecimento suficiente de domínios especializados, especialmente na área médica, e são propensos a "alucinar" ou fornecer informações imprecisas. Por meio da tecnologia RAG, as respostas do modelo são restritas a uma base de conhecimento médico externo confiável, fornecendo, assim, orientações médicas mais precisas e seguras. - Quais são as principais tecnologias usadas no projeto?
O projeto usa principalmente o Retrieval Augmented Generation (RAG), bancos de dados vetoriais (Milvus), estruturas de processamento de linguagem natural (LangChain), técnicas de recuperação híbrida (combinação de vetores densos e esparsos BM25) e uma variedade de back-ends opcionais para modelagem de linguagem ampla (por exemplo, Ollama, OpenAI etc.). - Como faço para substituir o modelo de incorporação ou o modelo de idioma usado em meu projeto?
Alterar os modelos é tão simples quanto modificar o arquivo de configuração YAML correspondente. Por exemplo, para alterar o modelo de incorporação densa, você pode alterar o modelo no arquivodefault.yaml
modificaçãoembedding.dense
participação deprovider
responder cantandomodel
campos. Da mesma forma, o LLM usado para anotação de dados pode ser encontrado na seçãoannotator.yaml
Configure-o em. - Como devo otimizar se a recuperação não for satisfatória?
Há várias maneiras de otimizar. Em primeiro lugar, tente ajustar osearch_answer.yaml
arquivo de configuração para diferentes canais de recuperação noweight
(pesos) para alterar a taxa de fusão dos resultados de recuperação densos e esparsos. Em segundo lugar, os dados usados para construir a lista de palavras podem ser examinados e expandidos para gerar uma lista de palavras de maior qualidade.vocab.pkl.gz
documentos para melhorar a precisão da recuperação esparsa. Por fim, garantir que os dados de sua base de conhecimento sejam de alta qualidade e tenham ampla cobertura é fundamental para melhorar os resultados.