Medical-RAG ist ein Q&A-Intelligence-Projekt, das für den chinesischen medizinischen Bereich entwickelt wurde. Es basiert auf der Retrieval Augmented Generation (RAG) Technologie, die die Genauigkeit und Sicherheit von Large Language Models (LLMs) für medizinische Ratschläge durch die Einbeziehung externer Wissensdatenbanken verbessert. Der Kern des Projekts ist die Verwendung von Milvus, einer hochleistungsfähigen Vektordatenbank, um medizinisches Wissen zu speichern und abzurufen, sowie die Integration des LangChain-Frameworks, um den gesamten Q&A-Prozess zu verwalten. Das Projekt implementiert eine vollständige automatisierte Datenverarbeitungspipeline, einschließlich der intelligenten Datenannotation mit LLM, der Erstellung medizinischer domänenspezifischer Wortlisten und der effizienten Datenhaltung. Es verwendet eine fortschrittliche hybride Retrieval-Architektur, die semantisches Retrieval mit dichten Vektoren und Keyword Retrieval mit spärlichen Vektoren (BM25) kombiniert und mehrere Ergebnisse mit einem konfigurierbaren Umordnungsalgorithmus verschmilzt, um die Genauigkeit der abgerufenen Inhalte zu verbessern. Der Entwickler kann das gesamte System über flexible YAML-Konfigurationsdateien bereitstellen und verwalten, so dass es sich an unterschiedliche Betriebsumgebungen und Anforderungen anpassen lässt.
Funktionsliste
- Automatisierte DatenverarbeitungDas Projekt bietet eine automatisierte Pipeline zur Datenannotation, die die Inferenz großer Modelle über HTTP oder lokale GPU-Aufrufe unterstützt, um den Annotationsprozess zu beschleunigen.
- Automatisierte Verwaltung von Wortlisten:: Eingebautes Multithreading- und medizinisches Domänenlexikon, das den Aufbau und die Verwaltung von Wortlisten für spärliche Suchen automatisiert, um die Abfragegenauigkeit zu verbessern.
- Hybride Sucharchitektur:: Unterstützt sowohl den Dense- als auch den Sparse-Vector-Retrieval. Die dichte Abfrage unterstützt verschiedene Einbettungsmodelle wie Ollama, OpenAI, HuggingFace usw., während die spärliche Abfrage den BM25-Algorithmus verwendet, der für den medizinischen Bereich optimiert wurde.
- Umstrukturierung und Integration der ErgebnisseRRF (Reciprocal Rank Fusion) oder gewichtete Fusion mehrerer Suchergebnisse, um die Relevanz der endgültigen Antwort zu verbessern.
- Tiefgreifende Optimierung im medizinischen BereichEin vordefiniertes berufliches Klassifizierungssystem mit 6 Hauptabteilungskategorien und 8 Hauptproblemkategorien sowie die Verwendung von
pkuseg
Modellierung der Segmentierung medizinischer Bereiche für die Textverarbeitung. - Hochleistungs-Vektor-DatenbankBasierend auf Milvus v2.6+, unterstützt effiziente Vektorsuche, Batch Embedding und gleichzeitige Abfragen.
- Flexibles KonfigurationssystemAlle Kernparameter, wie z.B. Datenbankverbindung, Modellauswahl, Abfragestrategie, etc., werden über YAML-Dateien konfiguriert, die sich leicht in verschiedenen Umgebungen einsetzen und anpassen lassen.
- Hocheffizientes SchnittstellenpaketKapselt die gemeinsamen Schnittstellen zu Milvus und stellt die
RAGSearchTool
Core-Tools, wie der Entwickler zur Erleichterung der sekundären Entwicklung und Aufruf.
Hilfe verwenden
Das Projekt bietet ein komplettes Umfeld von der Vorbereitung bis zur endgültigen Abfrage. Im Folgenden finden Sie eine detaillierte Schritt-für-Schritt-Anleitung, die den Benutzern einen schnellen Einstieg ermöglichen soll.
Schritt 1: Vorbereitung der Umwelt
Bevor Sie beginnen, müssen Sie die grundlegende Laufzeitumgebung vorbereiten, einschließlich des Klonens des Projekts, der Installation von Abhängigkeiten und des Starts der erforderlichen Dienste.
- Projektcode klonen
Zuerst klonen Sie es von GitHubmedical-rag
Quellcode auf Ihrem lokalen Rechner.git clone https://github.com/yolo-hyl/medical-rag cd medical-rag/src
- Projektabhängigkeiten installieren
Das Projekt wird in Python entwickelt und alle Abhängigkeiten sind in dersetup.py
ein. Verwenden Sie Pip für die Installation.pip install -e .
- Start der Milvus-Vektor-Datenbank
Das Projekt verwendet Milvus als Vektordatenbank und es wird empfohlen, es mit Docker zu starten. Ein praktisches Startscript ist bereits im Projektcode enthalten.cd Milvus bash standalone_embed.sh start ``` 此命令会启动一个单机版的Milvus实例。
- Ollama-Dienst starten (optional)
Wenn Sie vorhaben, ein lokal ausgeführtes großes Modell (wie Qwen) für die Datenannotation oder die Erstellung von Antworten zu verwenden, müssen Sie Ollama installieren und starten.# 启动Ollama服务 ollama serve # 拉取需要用到的模型 # bge-m3是一个常用的嵌入模型,用于生成向量 ollama pull bge-m3:latest # qwen2:7b是一个性能不错的标注和问答模型 ollama pull qwen2:7b
Schritt 2: Grundlegende Konfiguration
Bevor ein bestimmter Prozess ausgeführt werden kann, müssen die wichtigsten Parameter konfiguriert werden. Die Konfigurationsdatei befindet sich im Verzeichnissrc/MedicalRag/config/default.yaml
. Sie müssen die folgenden Schlüsselinformationen entsprechend Ihrer Umgebung ändern:
- Milvus-VerbindungsinformationenUm sicherzustellen, dass
uri
im Gesang antwortentoken
Passen Sie die Milvus-Instanz an, die Sie gestartet haben.milvus: client: uri: "http://localhost:19530" token: "root:Milvus" collection: name: "qa_knowledge"
- Konfiguration des eingebetteten ModellsModell: Gibt das Modell an, das für die Erzeugung dichter Vektoren verwendet werden soll. Die folgende Konfiguration verwendet den lokalen Ollama-Dienst im
bge-m3
Modelle.embedding: dense: provider: ollama model: "bge-m3:latest" base_url: "http://localhost:11434"
Schritt 3: Datenverarbeitung und Bestandsaufnahme
Die Datenverarbeitung ist der Kern des Aufbaus eines Q&A-Systems, den das Projekt in vier Teile unterteilt: Datenbeschriftung, Aufbau von Wortlisten, Erstellung von Sammlungen und Dateneingabe.
- Datenkommentar
In diesem Schritt wird ein umfangreiches Sprachmodell verwendet, um die Rohdaten der Fragen und Antworten automatisch zu klassifizieren (z. B. Zugehörigkeit zu einer Abteilung, Art der Frage).- Konfigurieren Sie zunächst die Beschriftungsparameterdatei:
src/MedicalRag/config/data/annotator.yaml
. - Führen Sie dann das Anmerkungsskript aus:
python scripts/annotation.py src/MedicalRag/config/data/annotator.yaml
- Konfigurieren Sie zunächst die Beschriftungsparameterdatei:
- eine Wortliste zusammenstellen
Um die spärliche BM25-Suche zu unterstützen, muss ein eigenes Vokabular auf der Grundlage des medizinischen Korpus erstellt werden.python scripts/build_vocab.py
Das Skript verarbeitet die Daten und erzeugt eine Datei namens
vocab.pkl.gz
der Wortlistendatei. - Erstellen einer Milvus-Sammlung (Sammlung)
In diesem Schritt wird in Milvus eine Sammlung zur Speicherung von Vektoren und zugehörigen Informationen angelegt. Die Struktur (Schema) der Sammlung wird durch dendefault.yaml
Profil-Definition.# 使用默认配置文件创建集合 python scripts/create_collection.py -c src/MedicalRag/config/default.yaml # 如果需要强制删除并重建集合,可以添加--force-recreate参数 python scripts/create_collection.py --force-recreate
- Dateneingabe
Die verarbeiteten und beschrifteten Daten werden vektorisiert und schließlich in der Milvus-Sammlung hinterlegt.python scripts/insert_data_to_collection.py
Dieses Skript verarbeitet automatisch die Vektorisierung der Daten (sowohl dichte als auch spärliche Vektoren) und fügt sie stapelweise in die Datenbank ein.
Schritt 4: Suche und Abruf
Sobald alle Daten eingegeben sind, kann die Suche nach Fragen und Antworten beginnen.
- Konfigurieren von Abfragerichtlinien
Sie können dies tun, indem Sie diesrc/MedicalRag/config/search/search_answer.yaml
Datei, um die Abrufstrategie festzulegen, z. B. die Anpassung der Gewichte der verschiedenen Abrufkanäle (dicht, spärlich). - Führen Sie das Abfrageskript aus
ausnutzensearch_pipline.py
Skript, um die Abfrage auszuführen.# 使用指定的搜索配置文件进行查询 python scripts/search_pipline.py --search-config src/MedicalRag/config/search/search_answer.yaml
Das Skript wechselt in einen interaktiven Modus, in dem Sie eine Frage eingeben können (z. B. "Was sind die Symptome der Syphilis?") um die Suche zu testen.
Einsatz der wichtigsten Instrumente
Das Projekt bietet auch eine Datei namensRAGSearchTool
Toolklasse, um direkte Aufrufe der Abruffunktion in anderem Code zu erleichtern.
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)
Anwendungsszenario
- Intelligenter Diagnose-Assistent
Das System kann als klinisches Hilfsmittel für Ärzte eingesetzt werden. Wenn ein Arzt mit einem komplexen oder seltenen Fall konfrontiert wird, kann er schnell nach relevanten Diagnose- und Behandlungsrichtlinien, Arzneimittelinformationen und den neuesten medizinischen Forschungsergebnissen suchen, um eine Entscheidungshilfe für Diagnose und Behandlung zu erhalten. - Ausbildung und Schulung von Medizinstudenten
Es kann zum Aufbau eines simulierten Konsultationssystems verwendet werden, mit dem Medizinstudenten in einer virtuellen Umgebung üben können, Fragen zu stellen, Diagnosen zu stellen und Behandlungspläne zu entwickeln. Das System kann den Lernprozess beschleunigen, indem es auf der Grundlage der Fragen der Studierenden Standardantworten und relevante Wissenspunkte liefert. - Gesundheitsberatung für Patienten
Das System kann als intelligenter Kundenservice oder Chatbot eingesetzt werden, um Patienten rund um die Uhr eine erste Gesundheitsberatung zu bieten. Die Nutzer können Fragen zu häufigen Krankheiten, Symptomen, Vorsichtsmaßnahmen bei der Einnahme von Medikamenten usw. stellen, und das System kann sichere und genaue Antworten aus einer zuverlässigen Wissensdatenbank geben, was die Krankenhausambulanzen entlastet. - Verwaltung und Abruf von medizinischen Wissensdatenbanken
Für Krankenhäuser und Forschungseinrichtungen kann das System umfangreiche interne medizinische Dokumente, Krankenakten und Forschungsunterlagen integrieren, um eine intelligente Wissensmanagement-Plattform aufzubauen. Forscher und medizinisches Fachpersonal können die benötigten Informationen schnell und präzise über natürliche Sprache finden.
QA
- Welches Problem wird mit diesem Projekt gelöst?
Sie befasst sich mit dem Problem, dass allgemeine große Sprachmodelle unzureichende Kenntnisse über spezialisierte Bereiche haben, insbesondere im medizinischen Bereich, und dazu neigen, zu "halluzinieren" oder ungenaue Informationen zu liefern. Durch die RAG-Technologie werden die Antworten des Modells auf eine verlässliche externe medizinische Wissensbasis beschränkt, was zu einer genaueren und sichereren medizinischen Beratung führt. - Welche Schlüsseltechnologien kommen bei dem Projekt zum Einsatz?
Das Projekt verwendet hauptsächlich Retrieval Augmented Generation (RAG), Vektordatenbanken (Milvus), Frameworks für die Verarbeitung natürlicher Sprache (LangChain), hybride Retrievaltechniken (Kombination von dichten und spärlichen Vektoren BM25) und eine Reihe optionaler Backends für die Modellierung großer Sprachen (z. B. Ollama, OpenAI usw.). - Wie kann ich das in meinem Projekt verwendete Einbettungsmodell oder Sprachmodell ersetzen?
Das Ändern von Modellen ist so einfach wie das Ändern der entsprechenden YAML-Konfigurationsdatei. Um z.B. das Modell der dichten Einbettung zu ändern, können Sie das Modell in der Dateidefault.yaml
Änderungembedding.dense
Anteil anprovider
im Gesang antwortenmodel
Felder. In ähnlicher Weise kann das für die Datenkommentierung verwendete LLM in derannotator.yaml
Konfigurieren Sie es in. - Wie sollte ich optimieren, wenn der Abruf nicht zufriedenstellend ist?
Es gibt mehrere Möglichkeiten der Optimierung. Erstens können Sie versuchen, diesearch_answer.yaml
Konfigurationsdatei für verschiedene Abrufkanäle in derweight
(Gewichte), um das Verhältnis zwischen dichten und spärlichen Abfrageergebnissen zu ändern. Zweitens können die zur Erstellung der Wortliste verwendeten Daten untersucht und erweitert werden, um eine qualitativ hochwertigerevocab.pkl.gz
Dokumente, um die Genauigkeit von Sparse Retrieval zu verbessern. Schließlich ist es für die Verbesserung der Ergebnisse von grundlegender Bedeutung, dass die Daten in der Wissensdatenbank von hoher Qualität sind und eine breite Abdeckung aufweisen.