Creación de un chatbot de pregunta médica y respuesta utilizando Biomistral LLM, Langchain, almacenamiento de vectores de Chroma y trapo: una guía paso a paso

En este tutorial, construiremos un poderoso chatbot de preguntas sobre PDF basado en PDF adaptado para contenido médico o relacionado con la salud. LevemosTRAPOE Las capacidades de orquestación de datos flexibles de Biomistral LLM y Langchain de Langchain para procesar documentos PDF en fragmentos de texto manejables. Luego codificaremos estos fragmentos utilizando embedidas faciales para abrazos, capturar relaciones semánticas profundas y almacenarlas en una base de datos de vectores de croma para la recuperación de alta eficiencia. Finalmente, al emplear un sistema de generación (RAG) de recuperación (RAG), integraremos el contexto recuperado directamente en las respuestas de nuestro chatbot, asegurando respuestas claras y autorizadas para los usuarios. Este enfoque nos permite examinar rápidamente grandes volúmenes de PDF médicos, proporcionando ideas ricas en contexto, precisas y fáciles de entender.

Configuración de herramientas

!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


def to_markdown(text):
    text = text.replace('•', '  *')
    return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))
from google.colab import drive
drive.mount('/content/drive')

Primero, instalamos y configuramos los paquetes de Python para el procesamiento de documentos, la generación de incrustaciones, los LLM locales y los flujos de trabajo de recuperación avanzados con Llamacpp. Aprovechamos langchain_community para la carga de PDF y la división de texto, la configuración de recuperación y llmchain para responder preguntas e incluye una utilidad To_Markdown Plus Google Drive.

Configuración de acceso a la tecla API

from google.colab import userdata
# Or use `os.getenv('HUGGINGFACEHUB_API_TOKEN')` to fetch an environment variable.
import os
from getpass import getpass


HF_API_KEY = userdata.get("HF_API_KEY")
os.environ["HF_API_KEY"] = "HF_API_KEY"

Aquí, buscamos y establecemos la tecla API de la cara abrazada como una variable de entorno en Google Colab. También puede aprovechar el entorno HuggingfaceHub_API_Token para evitar exponer directamente las credenciales confidenciales en su código.

Cargando y extrayendo PDF de un directorio

loader = PyPDFDirectoryLoader('/content/drive/My Drive/Data')
docs = loader.load()

Utilizamos pypdfdirectoryloader para escanear la carpeta especificada para PDFS, extraer su texto en una lista de documentos y establecer las bases para tareas como respuesta de preguntas, resumen o extracción de palabras clave.

Dividir los documentos de texto cargados en trozos manejables

text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50)
chunks = text_splitter.split_documents(docs)

En este fragmento de código, RecursIvecharacterTextSplitter se aplica para desglosar cada documento en documentos en segmentos más pequeños y más manejables.

Inicializando las embedidas de la cara abrazada

embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-base-en-v1.5")

Usando HuggingFaceEmbeddings, creamos un objeto usando el modelo Baai/BGE-Base-en-V1.5. Convierte texto en vectores numéricos.

Construir una tienda vectorial y ejecutar una búsqueda de similitud

vectorstore = Chroma.from_documents(chunks, embeddings)
query = "who is at risk of heart disease"
search = vectorstore.similarity_search(query)
to_markdown(search[0].page_content)

Primero construimos una tienda de vectores de Chroma (Chroma.From_Documents) a partir de los fragmentos de texto y el modelo de incrustación especificado. A continuación, usted crea una consulta preguntando, “quién está en riesgo de enfermedad cardíaca” y realiza una búsqueda de similitud contra los incrustaciones almacenadas. El resultado superior (búsqueda[0].page_content) luego se convierte en Markdown para una pantalla más clara.

Crear un retriever y obtener documentos relevantes

retriever = vectorstore.as_retriever(
    search_kwargs={'k': 5}
)
retriever.get_relevant_documents(query)

Convertimos el almacén de vectores de Chroma en un retriever (vectorstore.as_retriever) que obtiene de manera eficiente los documentos más relevantes para una consulta dada.

Inicialización del modelo Biomistral-7B con Llamacpp

llm = LlamaCpp(
    model_path= "/content/drive/MyDrive/Model/BioMistral-7B.Q4_K_M.gguf",
    temperature=0.3,
    max_tokens=2048,
    top_p=1)

Configuramos un LLM local de código abierto que usa Llamacpp, apuntando a un archivo de modelo pre-descargado. También configuramos parámetros de generación como la temperatura, Max_Tokens y TOP_P, que controlan la aleatoriedad, los tokens máximos generados y la estrategia de muestreo del núcleo.

Configuración de una cadena de generación (trapo) de recuperación con un mensaje personalizado

from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser
from langchain.prompts import ChatPromptTemplate
template = """
<|context|>
You are an AI assistant that follows instruction extremely well.
Please be truthful and give direct answers
</s>
<|user|>
{query}
</s>
 <|assistant|>
"""
prompt = ChatPromptTemplate.from_template(template)
rag_chain = (
    {'context': retriever, 'query': RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

Usando lo anterior, configuramos una tubería RAG usando el marco Langchain. Crea un aviso personalizado con instrucciones y marcadores de posición, incorpora un retriever para el contexto y aprovecha un modelo de lenguaje para generar respuestas. El flujo se define como una serie de operaciones (RunnablePassthrough para el manejo directo de consultas, el chatPromptTemplate para la construcción rápida, el LLM para la generación de respuesta y, finalmente, el stroutputparser para producir una cadena de texto limpia).

Invocar la cadena de trapos para responder una consulta relacionada con la salud

response = rag_chain.invoke("Why should I care about my heart health?")
to_markdown(response)

Ahora, llamamos a la cadena de trapo previamente construida con la consulta de un usuario. Pasa la consulta al Retriever, recupera el contexto relevante de la recopilación de documentos y alimenta ese contexto en el LLM para generar una respuesta concisa y precisa.

En conclusión, al integrar Biomistral a través de Llamacpp y aprovechar la flexibilidad de Langchain, podemos construir un chatbot de Rag Medical con conciencia del contexto. Desde la indexación basada en el fragmento hasta las tuberías de RAG sin costuras, agiliza el proceso de extraer grandes volúmenes de datos PDF para ideas relevantes. Los usuarios reciben respuestas claras y fácilmente legibles mediante el formateo de respuestas finales en Markdown. Este diseño se puede extender o adaptar para varios dominios, asegurando la escalabilidad y la precisión en la recuperación del conocimiento en diversos documentos.


Usar el Cuaderno de colab aquí. Además, no olvides seguirnos Gorjeo y únete a nuestro Canal de telegrama y LinkedIn GRsalpicar. No olvides unirte a nuestro 75k+ ml de subreddit.

🚨 Conocer Intellagent: Un marco de múltiples agentes de código abierto para evaluar un sistema de IA conversacional complejo (Promocionado)


Asif Razzaq es el CEO de MarktechPost Media Inc .. Como empresario e ingeniero visionario, ASIF se compromete a aprovechar el potencial de la inteligencia artificial para el bien social. Su esfuerzo más reciente es el lanzamiento de una plataforma de medios de inteligencia artificial, MarktechPost, que se destaca por su cobertura profunda de noticias de aprendizaje automático y de aprendizaje profundo que es técnicamente sólido y fácilmente comprensible por una audiencia amplia. La plataforma cuenta con más de 2 millones de vistas mensuales, ilustrando su popularidad entre el público.