Herramientas de usuario

Herramientas del sitio


inteligencia_artificial:langchain:documentos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
inteligencia_artificial:langchain:documentos [2025/01/31 00:19] – [Base de datos de vectores] albertointeligencia_artificial:langchain:documentos [2025/01/31 00:44] (actual) – [Base de datos vectorial] alberto
Línea 193: Línea 193:
 ===== Base de datos vectorial ===== ===== Base de datos vectorial =====
 Los vectores generados a través de embeddings los guardamos en una base de datos vectorial, desde la que trabajaremos para hacer búsquedas semánticas y recuperar información. \\ Los vectores generados a través de embeddings los guardamos en una base de datos vectorial, desde la que trabajaremos para hacer búsquedas semánticas y recuperar información. \\
- 
-Si los documentos son muy grandes, hay que "trocearlos" en partes más pequeñas para ayudar al modelo a procesar la información (tienen una capacidad limitada de cantidad de //tokens// a procesar de una vez). Se pasarán al modelo los "trozos" de información más relevantes para la consulta realizada. Estos trozos de información, son habitualmente denominados "documentos". 
  
 {{ :ia:langchain_05_vector_database.png?500 |}} {{ :ia:langchain_05_vector_database.png?500 |}}
Línea 202: Línea 200:
 {{ :ia:langchain_06_vector_database_index.png?500 |}} {{ :ia:langchain_06_vector_database_index.png?500 |}}
  
-La consulta se pasa a un vector a través de un embedding, y se compara con los diferentes vectores de cada porción de información. Se devuelven al modelo los más parecidos para poder devolver la respuesta definitiva.+Para realizar una búsqueda semántica en la base de datos, se pasa la consulta a vector a través de embeddings, y se compara con los diferentes vectores de cada porción de información. Se devuelven al modelo los más parecidos para poder devolver la respuesta definitiva.
  
 {{ :ia:langchain_08_vector_database.png?400 |}} {{ :ia:langchain_08_vector_database.png?400 |}}
  
 +En langchain existen más de 30 tipos de base de datos vectoriales diferentes que pueden [[https://python.langchain.com/docs/integrations/vectorstores/|consultarse en su web]].
 +
 +En el siguiente ejemplo cargamos el texto de varios PDFs, dividimos la información en partes, usando los embeddings de Llama 3.1 pasamos las partes a vectores, y finalmente los guardamos en una base de datos vectorial de tipo Chroma por su simplicidad:
 +<code python>
 +from langchain_community.document_loaders import PyPDFLoader
 +
 +# Cargamos los documentos
 +loaders = [
 +    PyPDFLoader("seres_01_Hada.pdf"),
 +    PyPDFLoader("seres_01_Hada.pdf"),   # Repetimos el mismo documento para ver como se comporta el sistema
 +    PyPDFLoader("seres_02_Gnomo.pdf"),
 +    PyPDFLoader("seres_03_Trasgo.pdf"),
 +    PyPDFLoader("seres_04_Mago.pdf"),
 +]
 +
 +docs = []
 +for loader in loaders:
 +    docs.extend(loader.load())
 +
 +# Troceamos los documentos
 +from langchain.text_splitter import RecursiveCharacterTextSplitter
 +text_splitter = RecursiveCharacterTextSplitter(
 +    chunk_size = 500,
 +    chunk_overlap = 50
 +)
 +
 +splits = text_splitter.split_documents(docs)
 +
 +# Definimos el modelo de embeddings
 +from langchain_ollama import OllamaEmbeddings
 +
 +embedding = OllamaEmbeddings(model="llama3.1")
 +
 +# Guardamos los datos en una base de datos vectorial
 +from langchain_community.vectorstores import Chroma
 +
 +# Definimos el directorio donde se guardará la base de datos vectorial
 +persist_directory = 'docs/chroma'
 +
 +# Eliminamos el directorio si ya existe, es decir, borramos la base de datos anterior antes de volver a lanzar el sript
 +import shutil
 +
 +path = "docs/chroma"
 +
 +try:
 +    shutil.rmtree(path)
 +    print(f"Directorio {path} eliminado")
 +
 +except FileNotFoundError:
 +    print(f"Directorio {path} no encontrado")
 +
 +except Exception as e:
 +    print(f"Error al eliminar el directorio: {e}")
 +
 +# Creamos la base de datos vectorial
 +vectordb = Chroma.from_documents(
 +    documents = splits,
 +    embedding = embedding,
 +    persist_directory = persist_directory
 +)
 +
 +# Vamos a realizar una consulta
 +question = "¿En qué parte de la península hay seres fantásticos como hadas y gnomos?"
 +docus = vectordb.similarity_search(question, k=3) # En langchain el texto devuelto de una base de datos vectorial al realizar una búsqueda semántica es de tipo "document", por eso se le suele llamar "docs" o documentos.
 +print(f"Número de documentos encontrados: {len(docus)}")
 +
 +print(f"\nPrimer resultado: {docus[0].page_content}")
 +print(f"\nSegundo resultado: {docus[1].page_content}")
 +print(f"\nTercer resultado: {docus[2].page_content}")
 +</code>
 +
 +Al final del ejemplo anterior realizamos una búsqueda en la base de datos.
 +Al haber documentos duplicados, podemos obtener diferentes respuestas prácticamente iguales.
 +También puede ocurrir que se obtenga la información de algunos documentos (vectores), cuando hay otros más idóneos para la consulta realizada. 
 +Veremos en el siguiente apartado //retrieval// como obtener información de la base de datos vectorial adecuadamente.
 ===== Métodos de extracción de información ===== ===== Métodos de extracción de información =====
 Hay varios métodos a partir de los cuales se puede extraer la información más importante (la más similar vectorialmente) de las diferentes partes en que se dividió la información. Hay varios métodos a partir de los cuales se puede extraer la información más importante (la más similar vectorialmente) de las diferentes partes en que se dividió la información.
inteligencia_artificial/langchain/documentos.1738279188.txt.gz · Última modificación: por alberto

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki