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

Document Transformers: TextSplitters

17/37
Recursos

Aportes 2

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

鈿狅笍 Una advertencia para que s铆 usen la data del PDF de crypto.

Antes de cargar documents con el text_splitter recuerden correr nuevamente el c贸digo que carga el archivo public_key_cryptography.pdf que se aprende en la Clase 14 Document Loaders: PDF, de lo contrario van cargar la data del JSON o del CSV y no resolver谩n las queries que indica el profe. 馃

from langchain.document_loaders import PyPDFLoader

loader = PyPDFLoader("./public_key_cryptography.pdf")
data = loader.load()

馃敥 Divisores de Texto (Text Splitters)

.

鈩癸笍 Summary

Esta gu铆a proporciona un caso de uso sobre 鈥淭ext Splitters鈥, cuando se desea dividir un documento largo en trozos que puedan ajustarse a la ventaja contextual de un modelo.
.

馃梻锔 Background

Una vez cargados los documentos, a menudo querr谩 transformarlos para adaptarlos mejor a su aplicaci贸n. El ejemplo m谩s sencillo es que quieras dividir un documento largo en trozos m谩s peque帽os que quepan en la ventana contextual de tu modelo. LangChain tiene una serie de transformadores de documentos incorporados que facilitan la divisi贸n, combinaci贸n, filtrado y manipulaci贸n de documentos.
.
En alto nivel, los divisores de texto funcionan de la siguiente manera:
.

  1. Divida el texto en peque帽os fragmentos sem谩nticamente significativos (a menudo frases).
  2. Se empieza a combinar estos trozos peque帽os en un trozo m谩s grande hasta que alcances un cierto tama帽o (medido por alguna funci贸n).
  3. Una vez alcanzado ese tama帽o, haga de ese trozo su propio fragmento de texto y empiece a crear un nuevo trozo de texto con cierto solapamiento (para mantener el contexto entre los trozos).

.
Enalces auxiliares:

.

馃幆 Problem

Implementar un 鈥淭ext Splitter鈥 utilizando TypeScript para dividir un repositorio de informaci贸n manejable por el model GPT-4 de OpenAI.
.

馃毀 Solution

LongChain recomienda la funcionalidad RecursiveCharacterTextSplitter, ya que posee la versatilidad de dividir, recursivamente, mediante caracteres distintivos en una oraci贸n y p谩rrafos en un documento de texto.

import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'

const splitter = new RecursiveCharacterTextSplitter({
	chunkSize: 1000,
	chunkOverlap: 200,
})

const docsOutput = await splitter.splitDocuments(docs)

Podemos destacar los par谩metros chunkSize y chunkOverlap, los cuales definen la divisi贸n sem谩ntica del contenido en funci贸n del tama帽o y la ampliaci贸n del mismo, respectivamente.
.

馃嵒 Discussion

En la definici贸n del TextSplitter definimos un chunk de 1000 caracteres y un overlap de 200 caracteres, pero, 驴C贸mo se cu谩l es valor correcto para estos par谩metros?
.
Sobre el chunk, la cantidad de tokens o caracteres debe ser la misma que la que se definir谩 en el embedding, por lo que si se entregan m谩s tokens que el modelo de embedding puede soportar, el modelo colapsar谩 o procesar谩 informaci贸n incompleta. Los diferentes modelos aceptan diferentes l铆mites, donde ada de OpenAI acepta hasta 8k de caracteres, mientras otros m谩s modestos aceptan 500 (que es el valor est谩ndar por ahora).
.
Con respecto al overlap es importante mantener un porcentaje de 10 a 20% para que pueda comprender contexto anterior sin que se repitan conceptos exageradamente, si bien este es un valor de prueba y error, se ha demostrado que estos valores son funcionales.

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

const API_TOKEN = // 馃憟 Enter the API Token from OpenAI

const textLoader = new TextLoader('tmp/meeting.txt')
const docs = await textLoader.load()

const splitter = new RecursiveCharacterTextSplitter({
	chunkSize: 1000,
	chunkOverlap: 200,
})
const docsOutput = await splitter.splitDocuments(docs)

const embeddings = new OpenAIEmbeddings({
	openAIApiKey: API_TOKEN,
})

const vectorStore = await HNSWLib.fromDocuments(docsOutput, embeddings)
console.log(vectorStore)