Langchain es una iniciativa de código abierto que aborda uno de los problemas más acuciantes de los grandes modelos lingüísticos (LLM): la gestión de una conversación.
De forma nativa, las APIs LLM funcionan bien para escenarios de un solo turno de diálogo, tipo comando-y-respuesta.
¿Pero qué pasa si quieres usar un LLM para un diálogo multi-turn entre el usuario y el LLM? Por lo tanto, ¿la misma funcionalidad que esperas encontrar en un chatbot o agente digital?
Tienes dos opciones…
1️⃣ La primera vía es hacer uso de un marco de desarrollo de IA conversacional como Cognigy, OneReach AI y algunos otros para integrar a los LLM.
Sin embargo, la premisa de hacer uso de él, será únicamente tener acceso a un entorno de gestión de diálogos. Y con esto viene una sobrecarga adicional en forma de coste, funcionalidad no deseada y complejidad.
2️⃣ La segunda opción es escribir tu propio software de gestión de diálogos.
💡 De ahí que LangChain tenga mucho sentido para habilitar LLMs para la gestión de diálogos.
LangChain es una fina capa de pro-código que convierte interacciones LLM sucesivas (secuenciales) en una experiencia conversacional natural.
Ya sea gestionando el proceso de creación de prompts, recopilando datos del usuario de forma conversacional, integración API, desarrollo de diálogos, contexto y memoria de conversación, y mucho más…
En palabras de LangChain:
Los LLM están emergiendo como una tecnología transformadora, que permite a los desarrolladores crear aplicaciones que antes no podían. Pero utilizar estos LLM de forma aislada no suele ser suficiente para crear una aplicación realmente potente: la verdadera potencia llega cuando eres capaz de combinarlos con otras fuentes de computación o conocimiento.
Tabla de contenidos
Pero primero, ¿cuáles son los elementos de la gestión de diálogos?
⚙️ Gestión del estado/flujo del diálogo
Es el proceso de gestionar cada conversación dentro de un árbol de decisiones predefinido. Para cada conversación, el chatbot debe saber, en función de los criterios disponibles, cuál es el siguiente diálogo al que debe dirigirse.
El estado del diálogo se define normalmente a través de un editor de flujo de diálogo. Los editores de flujo de diálogo pueden ser pro-code, low-code o no-code.
⚙️ Contexto conversacional y memoria
El contexto conversacional hace que la experiencia de conversación del usuario sea más natural e intuitiva. El conocimiento del contexto permite al robot hacer suposiciones basándose en expresiones anteriores del usuario. También ayuda a que el bot no tenga que volver a preguntar a los usuarios por datos ya introducidos.
⚙️ Memoria conversacional a largo plazo
A la gente le gusta hablar con el mismo representante de atención al cliente, porque existe una memoria a largo plazo. Y esta memoria optimiza la llamada y hace que la experiencia sea más eficaz.
Lo mismo puede hacerse a través de un chatbot.
⚙️ Integración con API externas
Dialog Management incluye funciones para realizar llamadas a una API externa, procesar los datos e incluirlos como parte de la narración. Piensa en un bot meteorológico, que necesitaría acceder a una API meteorológica para recuperar y presentar para una ciudad solicitada.
⚙️ Integración de la base de conocimientos y QnA
La funcionalidad QnA y de base de conocimientos es cada vez más importante y la mayoría de los diseñadores de flujos de conversación tienen o prevén algún tipo de acceso a la base de conocimientos.
⚙️ Interfaz de desarrollo
En general, existen cuatro enfoques para las interfaces de desarrollo de flujos de diálogo. De ellos, los editores visuales de flujos de diálogo son los más populares debido a su naturaleza visual y sin código. Como se puede apreciar en la siguiente imagen:
Consideraciones a tener en cuenta a la hora de utilizar LangChain
⏺ La aplicación LangChain tendrá que estar alojada en algún lugar. Por lo tanto, con LangChain vienen los gastos generales de alojamiento, procesamiento, mantenimiento de código, planificación de la continuidad del negocio, redundancia, disponibilidad regional y latencia.
⏺ LangChain es perfecto para aplicaciones de demostración y prototipos de alta fidelidad. Sin embargo, para una implementación de producción la arquitectura del sistema será importante.
⏺ LangChain es pro-código, por lo que habrá una división entre diseño y desarrollo. Los desarrolladores tendrán que interpretar el diseño. En los últimos años hemos visto cómo se ha aprovechado el proceso de diseño. Por lo tanto, el proceso de diseño a través de una interfaz gráfica de usuario sin código se exporta a una versión lista para la producción del flujo.
⏺ A medida que una aplicación crezca, la complejidad también aumentará, los despliegues serán más arriesgados y las pruebas de regresión de la interfaz conversacional serán importantes.
⏺ La esperanza es que gran parte de la gestión de errores (fall-back para fuera de dominio, etc.) se puede derivar al LLM para la gestión.
⏺ Una gran parte del desarrollo de LangChain serán los aspectos de gestión de la conversación.
Ejemplos de código
La mejor manera de hacerse una idea de LangChain es considerar algunos prototipos… El ejemplo más básico del uso de LangChain para consultar OpenAI:
pip install langchain
pip install langchain[all]
pip install openai
import os
os.environ["OPENAI_API_KEY"] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
from langchain.llms import OpenAI
llm = OpenAI(temperature=0.9)
text = "What day of the week was it on 15 April 1973?"
print(llm(text))
Añadir una variable:
from langchain.prompts import PromptTemplate prompt = PromptTemplate( input_variables=["product"], template="What is a good name for a company that makes {product}?", print(prompt.format(product="typing machines")) llm = OpenAI(temperature=0.9) text = (prompt.format(product="typing machines")) print(llm(text))
⬇️ Vista de cuaderno:
El siguiente prototipo es un buen ejemplo de cómo se puede utilizar LangChain para automatizar la ingeniería de avisos y aprovechar los LLM para el contexto conversacional:
from langchain.llms import OpenAI
from langchain.chains import ConversationChain
from langchain.chains.conversation.memory import ConversationBufferMemory
llm = OpenAI(temperature=0)
conversation = ConversationChain(
llm=llm,
verbose=True,
memory=ConversationBufferMemory()
)
conversation.predict(input="Hi there!")
Respuesta:
> Entering new ConversationChain chain...
Prompt after formatting:
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.
Current conversation:
Human: Hi there!
AI:
> Finished chain.
Hi there! It's nice to meet you. My name is AI. What's your name?
Input:
conversation.predict(input="My name is Cobus")
Respuesta:
> Entering new ConversationChain chain... Prompt after formatting: The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. Current conversation: Human: Hi there! AI: Hi there! It's nice to meet you. My name is AI. What's your name? Human: My name is Cobus AI: > Finished chain. Nice to meet you, Cobus! What can I do for you today?
Este enfoque no es óptimo para conversaciones largas, ya que el tamaño del prompt enviado al LLM crecerá demasiado.
En este último ejemplo, se pide al usuario que introduzca información y ésta se utiliza para generar la respuesta, y también ilustra cómo se combinan dos cadenas.
title = input('What is your title? ')
print ('I have your title as ' + title)
era = input('Lasty, from what era should the text be? ')
print ('I have your era as ' + era)
# This is an LLMChain to write a synopsis given a title of a play and the era it is set in.
llm = OpenAI(temperature=.7)
template = """You are a playwright. Given the title of play and the era it is set in, it is your job to write a synopsis for that title.
Title: {title}
Era: {era}
Playwright: This is a synopsis for the above play:"""
prompt_template = PromptTemplate(input_variables=["title", 'era'], template=template)
synopsis_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="synopsis")
# This is an LLMChain to write a review of a play given a synopsis.
llm = OpenAI(temperature=.7)
template = """You are a play critic from the New York Times. Given the synopsis of play, it is your job to write a review for that play.
Play Synopsis:
{synopsis}
Review from a New York Times play critic of the above play:"""
prompt_template = PromptTemplate(input_variables=["synopsis"], template=template)
review_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="review")
# This is the overall chain where we run these two chains in sequence.
from langchain.chains import SequentialChain
overall_chain = SequentialChain(
chains=[synopsis_chain, review_chain],
input_variables=["era", "title"],
# Here we return multiple variables
output_variables=["synopsis", "review"],
verbose=True)
review = overall_chain({"title":title, "era": era})
print (review)
Y la salida:
> Entering new SequentialChain chain...
> Finished chain.
{'title': 'Tragedy at sunset on the beach', 'era': 'Victorian ', 'synopsis': "\n\nTragedy at Sunset on the Beach is set in the Victorian era and tells the story of a young girl, Amelia, whose search for love and happiness leads her to a fateful encounter with a mysterious stranger on the beach at sunset. While walking along the shore, Amelia meets a man named William, who presents her with a rose as a symbol of his affection. Though she initially resists his advances, Amelia eventually finds herself drawn to William and the two quickly grow close. \n\nHowever, as the sun sets, a secret from William's past is revealed that changes everything. It turns out that William is a wanted criminal and is being pursued by the police. After a tense confrontation, William is arrested and taken away, leaving Amelia heartbroken and alone.\n\nIn the aftermath of their chance encounter, Amelia is forced to grapple with the tragedy of her unrequited love, and the harsh realities of life. Her journey serves as a reminder that love isn't always as simple and straightforward as it may seem.", 'review': '\n\nTragedy at Sunset on the Beach is a captivating tale of love, loss, and the power of the human spirit. The set in the Victorian era allows for a unique perspective on the themes of the story, and the performance by the cast is truly remarkable.\n\nThe story follows Amelia, a young girl whose search for love and happiness leads her to a fateful encounter with a mysterious stranger on the beach at sunset. We watch as Amelia’s relationship with the stranger, William, develops and evolves, only to be cut short when a secret from his past is revealed. This revelation forces Amelia to confront the harsh realities of life and the tragedy of her unrequited love.\n\nThe play is a thought-provoking exploration of love, sacrifice, and the power of human connection. It’s a story that is sure to resonate with audiences who are looking for a story of love, loss, and hope. Highly recommended.'}
En conclusión
En otros artículos, he escrito varias veces sobre la fragmentación que se avecina y sobre el hecho de que un único marco de IA conversacional no será suficiente.
Ya estamos viendo que los LLM están obligando a los proveedores tradicionales de frameworks de chatbot a mirar hacia fuera en busca de tecnologías que deberían prever.
LangChain es un software que llena una voz crítica que existe actualmente para hacer que los LLM sean más conversacionales.
⭐️ Sígueme en LinkedIn para estar al día sobre la IA conversacional ⭐️