Introducción a LangChain

1

Desarrollo de aplicaciones con LLM utilizando LangChain

2

Estructura y módulos de LangChain

3

Uso de modelos Open Source de Hugging Face

4

Uso de modelos de OpenAI API

5

Prompt templates de LangChain

6

Cadenas en LangChain

7

Utility chains

8

RetrievalQA chain

9

Foundational chains

Quiz: Introducción a LangChain

Casos de uso de LangChain

10

Casos de uso de LangChain

11

¿Cómo utilizar LangChain en mi equipo?

Quiz: Casos de uso de LangChain

Manejo de documentos con índices

12

¿Cómo manejar documentos con índices en LangChain?

13

La clase Document

14

Document Loaders: PDF

15

Document Loaders: CSV con Pandas DataFrames

16

Document Loaders: JSONL

17

Document Transformers: TextSplitters

18

Proyecto de Chatbot: configuración de entorno para LangChain y obtención de datos

19

Proyecto de Chatbot: creación de documents de Hugging Face

Quiz: Manejo de documentos con índices

Embeddings y bases de datos vectoriales

20

Uso de embeddings y bases de datos vectoriales con LangChain

21

¿Cómo usar embeddings de OpenAI en LangChain?

22

¿Cómo usar embeddings de Hugging Face en LangChaing?

23

Chroma vector store en LangChain

24

Proyecto de Chatbot: ingesta de documents en Chroma

25

RetrievalQA: cadena para preguntar

26

Proyecto de Chatbot: cadena de conversación

27

Proyecto de Chatbot: RetrievalQA chain

Quiz: Embeddings y bases de datos vectoriales

Chats y memoria con LangChain

28

¿Para qué sirve la memoria en cadenas y chats?

29

Uso de modelos de chat con LangChain

30

Chat prompt templates

31

ConversationBufferMemory

32

ConversationBufferWindowMemory

33

ConversationSummaryMemory

34

ConversationSummaryBufferMemory

35

Entity memory

36

Proyecto de Chatbot: chat history con ConversationalRetrievalChain

Quiz: Chats y memoria con LangChain

Evolución del uso de LLM

37

LangChain y LLM en evolución constante

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de LangChain

Curso de LangChain

Omar Espejel

Omar Espejel

La clase Document

13/37
Recursos

Aportes 4

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

- Índices:

- Son la forma de estructurar documentos para que los LLM puedan interactuar con ellos de la mejor forma
- Con lo cual permite optimizar eficiencia y velocidad de las operaciones búsqueda y recuperación de información
- Son un análogo a los índices de libros que permiten localizar rápidamente un contenido específico. De manera similar los indices en langchain permiten a los LLM encontrar rápidamente información relevante sin tener que procesar todos los documentos disponibles.
  • Recuperación de información y los índices:
    • El uso más común de índices es la recuperación de información en el procesamiento de datos
    • Toma la consulta del usuario y devuelve los documentos más relevantes, considerando la siguiente distinción:
      • Un índice puede utilizarse para aplicaciones diferentes a la recuperación
      • La recuperación puede utilizar otras lógicas además de un índice para encontrar los documentos más relevantes
    • La indexación y recuperación de datos no estructurados es la referencia común cuanto se habla de índices y recuperación de información.

Retriver en LangChain

- Es un componente fundamental, su responsabilidad es localizar y devolver documentos relevantes según una consulta específica (como un bibliotecario que sabe exactamente la ubicación de los libros necesario)
- Retriver implementa el método `get_relevant_documents`, la estrategia más eficiente planteado por LangChain se basa en el concepto de Vectorstore, centrándonos en Retriver tipo vectorstore

Vectorstore y los Vectorestore Retriver

- Un vectorstore :

    - Es un tipo de base de datos especialmente diseñada para gestionar y manipular vectores de alta dimensionalidad
    - Comúnmente utilizado para presentar datos en apredizaje automático y otras aplicaciones de IA
- Si el retriver es el bibliotecario, el vectorstore sería el sistema de clasificación y organización de la biblioteca
- LangChain utiliza como sistema Vectorstore predeterminada a Chroma, el cual es utilizado para indexar y buscar embeddings (vectores que representan documentos en el espacio multidimencional)
- Los embedding son una forma de condensar y representar la información de un documento para que pueda ser fácilmente comparada con otros
- El Retriver tipo Vectorstore primero transforma la consulta en un vector (por medio del embedding), luego busca en la base de datos Vectorstore los documentos cuyos vectores son más cercanos (en términos de distancia coseno u otras métricas) a la consulta vectorizada
  • Un LLM puede recordar información de 2 maneras:
    • Los datos con los que se entrenó, lo cual es limitado
    • Podemos hacer que un LLM recuerde información a partir del contenido que le ingresemos al prompt.
  • Para ingresar información al LLM por medio del prompt:
    • La clave está en cómo ingresarle al información al modelo para que este genere la mejor respuesta a las preguntas del usuario o de la usuaria

    • Los índices permiten abordar este tema:

      • Permitirán encontrar la información clave que necesitamos.
      • Permite cargar la información al LLM desde cualquier tipo de fuente
    • Luego de la carga debemos pasar por todo un proceso:

      • Document loaders → cargar información
      • Text splitters → embedding que conviertan de texto a número
      • Vectorstore → permite crear el índice

      Los queries también ingresan a la vectorstore para buscar el fragmento de texto que tiene la mayor probabilidad de responder adecuadamente dicha query. Dichos fragmentos son pasados al modelo como insumo para que de la respuesta la usuario

📝 Creando Documentos

.

ℹ️ Summary

Esta guía proporciona un caso de uso sobre “Document Loaders”, cuando es necesario crear documentos para un repositorio de información.
.

🗂️ Background

Un Documento es un fragmento de texto y metadatos asociados. El fragmento de texto es con el que interactuamos con el modelo lingüístico, mientras que los metadatos opcionales son útiles para realizar un seguimiento de los metadatos sobre el documento (como la fuente).
.
Enlaces auxiliares:

.

🎯 Problem

Implementar un “Document Loader” utilizando TypeScript para generar un repositorio de información, vinculando los documentos mediante los metadatos de category y owner.
.

🚧 Solution

LangChain provee de una abstracción, para cargar documentos según sea el formato del mismo mediante Document.

import { Document } from "langchain/document"

Posteriormente, según sea la definición del documento (texto, PDF, etc.), tendríamos que variar su implementación. Por ejemplo, para cargar documentos en “Plain Text”:

import { TextLoader } from 'langchain/document_loaders/fs/text'

const loader = new TextLoader('tmp/meeting.txt')
const docsLoaded = await loader.load()

Para proveer de una información adicional como metadatos, modificamos la solución de nuestros loaders:

const docs = docsLoaded.map(({ pageContent, metadata }) => 
	({pageContent,
	  metadata: {
		...metadata,
		integration: 'meeting',
		owner: 'team 1',
	},
}))

Para final mente, ingresar y crear nuestro vector store.

const embeddings = new OpenAIEmbeddings({
	openAIApiKey: API_TOKEN,
})
const vectorStore = await HNSWLib.fromDocuments(docs, embeddings)

🍻 Discussion

Según sea la propuesta de desarrollo, como lo son los vector stores, podemos implementar una abstracción más completa para poder embeber más documentos.
.
Cabe mencionar, es posible anexar diferentes tipos de documentos entre sí para generar una basta colección de información a procesar.

import { HNSWLib } from 'langchain/vectorstores/hnswlib'
import { OpenAIEmbeddings } from 'langchain/embeddings/openai'
import { TextLoader } from 'langchain/document_loaders/fs/text'

const loader = new TextLoader('tmp/meeting.txt')
const docsLoaded = await loader.load()

const docs = docsLoaded.map(({ pageContent, metadata }) => 
	({pageContent,
	  metadata: {
		...metadata,
		integration: 'meeting',
		owner: 'team 1',
	},
}))

const embeddings = new OpenAIEmbeddings({
	openAIApiKey: API_TOKEN,
})
const vectorStore = await HNSWLib.fromDocuments(docs, embeddings)
console.log(vectorStore)
Para fragmentar un texto usando `page_content` en LangChain, debes dividir el texto en partes más pequeñas antes de crear instancias de la clase `Document`. Generalmente, esto se realiza utilizando `TextSplitter` que permite fragmentar el contenido en trozos manejables. Por ejemplo, puedes tomar un texto largo y dividirlo en párrafos o frases, asignando cada fragmento a su propio `Document` con su `page_content` correspondiente. Este proceso facilita la búsqueda y recuperación de información relevante en tus índices.
en `langchain.schema`, están los atributos más relevantes de `langchain`, hay que entrar a revisar un poco de está parte,