inteligencia_artificial:langchain:documentos
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| inteligencia_artificial:langchain:documentos [2025/01/31 00:19] – [Base de datos de vectores] alberto | inteligencia_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 " | ||
| {{ : | {{ : | ||
| Línea 202: | Línea 200: | ||
| {{ : | {{ : | ||
| - | La consulta | + | Para realizar una búsqueda semántica en la base de datos, |
| {{ : | {{ : | ||
| + | En langchain existen más de 30 tipos de base de datos vectoriales diferentes que pueden [[https:// | ||
| + | |||
| + | 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(" | ||
| + | PyPDFLoader(" | ||
| + | PyPDFLoader(" | ||
| + | PyPDFLoader(" | ||
| + | PyPDFLoader(" | ||
| + | ] | ||
| + | |||
| + | 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=" | ||
| + | |||
| + | # 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 = ' | ||
| + | |||
| + | # Eliminamos el directorio si ya existe, es decir, borramos la base de datos anterior antes de volver a lanzar el sript | ||
| + | import shutil | ||
| + | |||
| + | path = " | ||
| + | |||
| + | try: | ||
| + | shutil.rmtree(path) | ||
| + | print(f" | ||
| + | |||
| + | except FileNotFoundError: | ||
| + | print(f" | ||
| + | |||
| + | except Exception as e: | ||
| + | print(f" | ||
| + | |||
| + | # 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, | ||
| + | print(f" | ||
| + | |||
| + | print(f" | ||
| + | print(f" | ||
| + | print(f" | ||
| + | </ | ||
| + | |||
| + | 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 // | ||
| ===== 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
