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:07] – [Embeddings] alberto | inteligencia_artificial:langchain:documentos [2025/01/31 00:44] (actual) – [Base de datos vectorial] alberto | ||
|---|---|---|---|
| Línea 183: | Línea 183: | ||
| Una vez " | Una vez " | ||
| - | Los embeddings | + | Los embeddings |
| {{ : | {{ : | ||
| Línea 190: | Línea 190: | ||
| En el ejemplo de la imagen, los dos primeros casos hablan de mascotas, mientras que el tercero habla de un coche, por lo que los vectores entre los dos primeros son similares (cerca espacialmente, | En el ejemplo de la imagen, los dos primeros casos hablan de mascotas, mientras que el tercero habla de un coche, por lo que los vectores entre los dos primeros son similares (cerca espacialmente, | ||
| - | + | Los embeddings dependen de un modelo de IA. OpenAI tiene sus embeddings, Llama los suyos, etc. De modo que podemos usar sus APIs para generar estos vectores, aunque no se usen sus LLM. \\ | |
| - | ===== Base de datos de vectores | + | ===== Base de datos vectorial |
| - | A la base de datos de vectores | + | Los vectores |
| - | + | ||
| - | 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.1738278445.txt.gz · Última modificación: por alberto
