„Jak Stworzyć Chatbota Medycznego: Przewodnik Krok po Kroku z Wykorzystaniem Open-Source BioMistral LLM, LangChain, Chroma i RAG”
Budowa zaawansowanego chatbota pytająco-odpowiadającego na bazie plików PDF dla treści medycznych
W dzisiejszych czasach technologie oparte na sztucznej inteligencji coraz częściej wspierają dziedziny takie jak medycyna i zdrowie publiczne. Jednym z obiecujących zastosowań jest tworzenie chatbotów, które potrafią udzielać precyzyjnych odpowiedzi na podstawie dużych zbiorów danych medycznych. W tym artykule przedstawiamy, jak krok po kroku zbudować takiego chatbota, korzystając z otwartoźródłowego modelu BioMistral LLM, narzędzi LangChain oraz technik Retrieval-Augmented Generation (RAG). Dzięki temu będziesz mógł zautomatyzować analizę dokumentów PDF i dostarczać użytkownikom wiarygodne odpowiedzi w sposób szybki i zrozumiały.
Przygotowanie narzędzi
Pierwszym krokiem w tworzeniu chatbota jest konfiguracja odpowiednich pakietów Python. W naszym projekcie użyjemy m.in. biblioteki LangChain do przetwarzania danych, Hugging Face do tworzenia osadzeń semantycznych oraz LlamaCpp do implementacji lokalnych modeli językowych. Instalacja wymaganych pakietów wygląda następująco:
python
!pip install langchain sentence-transformers chromadb llama-cpp-python langchain_community pypdf
from langchain_community.document_loaders import PyPDFDirectoryLoader
from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS, Chroma
from langchain_community.llms import LlamaCpp
from langchain.chains import RetrievalQA, LLMChain
import pathlib
import textwrap
from IPython.display import display
from IPython.display import Markdown
Po zainstalowaniu pakietów możemy przejść do ładowania danych, ich przetwarzania oraz konfiguracji narzędzi wspomagających.
—
Bezpieczne zarządzanie kluczami API
Dzięki integracji z platformą Hugging Face, możemy uzyskać dostęp do zaawansowanych modeli osadzeń semantycznych. Klucz API Hugging Face należy bezpiecznie przechowywać w zmiennej środowiskowej, co pozwoli uniknąć narażenia danych na nieautoryzowany dostęp:
python
from google.colab import userdata
import os
from getpass import getpass
HF_API_KEY = userdata.get("HF_API_KEY")
os.environ["HF_API_KEY"] = "HF_API_KEY"
—
Przetwarzanie dokumentów PDF
Aby chatbot był w stanie odpowiadać na pytania dotyczące dokumentów PDF, musimy najpierw załadować i przekształcić ich treść w strukturę tekstową. Używając PyPDFDirectoryLoader, możemy automatycznie zaimportować wszystkie pliki PDF z danego katalogu:
python
loader = PyPDFDirectoryLoader('/content/drive/My Drive/Data')
docs = loader.load()
Następnie dzielimy tekst na mniejsze fragmenty za pomocą narzędzia RecursiveCharacterTextSplitter, co ułatwia późniejsze przetwarzanie:
python
text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)
chunks = text_splitter.split_documents(docs)
—
Tworzenie osadzeń semantycznych
Osadzenia semantyczne pozwalają przekształcić tekst na reprezentację numeryczną, która ułatwia odnajdywanie podobnych treści. W naszym projekcie wykorzystamy model BAAI/bge-base-en-v1.5
z Hugging Face:
python
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-base-en-v1.5")
Dzięki temu uzyskamy wektory, które będą przechowywane w bazie danych wektorowej Chroma, co umożliwi szybkie wyszukiwanie informacji.
—
Budowa bazy wektorowej i wyszukiwanie podobieństw
Korzystając z utworzonych wcześniej osadzeń i fragmentów tekstu, budujemy bazę wektorową:
python
vectorstore = Chroma.from_documents(chunks, embeddings)
Następnie przeprowadzamy wyszukiwanie podobieństw na podstawie zapytania użytkownika, np. „Kto jest narażony na choroby serca?”:
python
query = "who is at risk of heart disease"
search = vectorstore.similarity_search(query)
—
Konwersja do systemu Retriever
Aby efektywnie wyszukiwać dokumenty, przekształcamy bazę wektorową w system Retriever, który będzie zwracał najistotniejsze fragmenty:
python
retriever = vectorstore.as_retriever(search_kwargs={'k': 5})
retriever.get_relevant_documents(query)
—
Konfiguracja modelu BioMistral LLM
Do generowania odpowiedzi na zapytania wykorzystamy model językowy BioMistral-7B, który uruchamiamy lokalnie za pomocą narzędzia LlamaCpp:
python
llm = LlamaCpp(
model_path= "/content/drive/MyDrive/Model/BioMistral-7B.Q4_K_M.gguf",
temperature=0.3,
max_tokens=2048,
top_p=1
)
Parametry takie jak PLACEHOLDERd57fe5458ce70ee4, PLACEHOLDERd30e4071886b40f6 i top_p
pozwalają dostosować generowanie odpowiedzi do specyficznych wymagań.
—
Budowa łańcucha Retrieval-Augmented Generation (RAG)
System RAG łączy funkcje wyszukiwania informacji z generowaniem odpowiedzi. Poniżej przedstawiamy konfigurację, która umożliwia włączenie kontekstu wyszukiwanego dokumentu do odpowiedzi:
python
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser
from langchain.prompts import ChatPromptTemplate
template = """
You are an AI assistant that follows instruction extremely well.
Please be truthful and give direct answers
{query}
"""
prompt = ChatPromptTemplate.from_template(template)
rag_chain = (
{'context': retriever, 'query': RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
—
Generowanie odpowiedzi na zapytania medyczne
Na koniec wywołujemy łańcuch RAG, aby uzyskać odpowiedź na pytanie użytkownika, np. „Dlaczego zdrowie serca jest ważne?”:
python
response = rag_chain.invoke("Why should I care about my heart health?")
Wynik jest formatowany w Markdown, co ułatwia jego czytelność.
—
Podsumowanie
Dzięki zastosowaniu modelu BioMistral oraz narzędzi LangChain możliwe jest stworzenie zaawansowanego chatbota, który dostarcza użytkownikom precyzyjne i kontekstowe odpowiedzi na pytania związane z medycyną. Proces obejmuje analizę dokumentów PDF, tworzenie osadzeń semantycznych, budowę bazy wektorowej oraz integrację systemu RAG. Tego typu rozwiązanie może znaleźć zastosowanie w różnych dziedzinach, od diagnostyki medycznej po edukację zdrowotną, oferując skalowalność i wysoką precyzję w przetwarzaniu danych.