使用 Chainlit 和 LangChain 构建聊天机器人应用程序

在上一篇文章中,我们使用 LangChain 和 OpenAI 构建了自己的聊天机器人,如果您还没有阅读第一篇文章,我建议您先阅读《使用 LangChain 和 OpenAI 构建自己的聊天机器人》

在本文中,我们将使用 Chainlit 为我们的聊天机器人开发一个应用程序界面,Chainlit是一个框架,它可以简化创建具有类似 ChatGPT 界面的聊天机器人应用程序。

通过本教程,您将学习如何为聊天机器人构建应用程序界面,如下所示:

上一篇文章中,我们为机器人程序奠定了基础,Scoopsie 是一个冰淇淋助手聊天机器人,使用 LangChain 和 OpenAI 回答与冰淇淋相关的查询。下面是上一教程中的例子:chatbot.py

python 复制代码
from langchain_openai import OpenAI  
from langchain.chains import LLMChain  
from prompts import ice_cream_assistant_prompt_template  
  
from dotenv import load_dotenv  
  
load_dotenv()  
  
llm = OpenAI(model='gpt-3.5-turbo-instruct', temperature=0)  
llm_chain = LLMChain(llm=llm, prompt=ice_cream_assistant_prompt_template)  
  
def query_llm(question):  
	print(llm_chain.invoke({'question': question})['text'])  
  
if __name__ == '__main__':  
	query_llm("Who are you?")

目前,Scoopsie 缺乏记录历史的功能,也没有用户界面。在本文中,我们将重点介绍如何为我们的聊天机器人配备内存,以便进行更多上下文对话,并使用 Chainlit 创建 Web 应用程序界面。

了解 Chainlit

Chainlit 是一个开源 Python 库,旨在简化创建可用于生产的聊天机器人应用程序。它侧重于管理用户会话和每个会话中的事件,例如消息交换和用户查询。在 Chainlit 中,每次用户连接到应用程序时,都会启动一个新会话。该会话包括一系列事件,这些活动通过事件驱动装饰器进行管理。这些修饰器充当触发器,以根据用户交互执行特定操作。

Chainlit 应用程序具有多个事件(聊天开始、用户消息、会话恢复、会话停止等)的装饰器。对于我们的聊天机器人,我们将专注于为两个关键事件编写代码:启动聊天会话和接收用户消息。

初始化聊天

当创建新的聊天会话时,将触发装饰器。它调用一个设置聊天环境的函数,包括初始化我们的模型、创建 LLMChain 对象以及设置任何必要的操作变量,包括聊天记录初始化(稍后会详细介绍)。

处理消息

装饰器用于处理来自用户的传入消息。它触发一个异步函数 --- 适用于可能需要等待外部进程的操作,例如模型查询。此方法利用会话的存储对象,使用检索到的链处理传入消息,并将响应发送回应用程序。

分步实施

步骤1:

以前,我们的聊天机器人缺乏任何先前交互的上下文。虽然此限制可以在独立的问答应用程序中起作用,但对话应用程序通常要求聊天机器人对之前的对话有一定的了解。为了克服这个限制,我们可以从LangChain的一个内存模块创建一个内存对象,并将其添加到我们的聊天机器人代码中。LangChain提供了多种内存模块。最简单的是,我们在用户和模型之间以原始形式将以前的消息与当前查询一起传递。ConversationBufferMemory

让我们在文件中导入内存模块:chatbot.py

python 复制代码
from langchain.memory.buffer import ConversationBufferMemory

接下来,定义要添加到该对象的内存对象:llm_chain

python 复制代码
conversation_memory = ConversationBufferMemory(memory_key="chat_history", max_len=50, return_messages=True)

在上面的代码中,定义了链将用于存储对话历史记录的变量。我们可以通过为参数传入不同的值来控制这个变量。

我们还需要将变量添加到我们的提示模板中:chat_history

python 复制代码
from langchain.prompts import PromptTemplate  
  
ice_cream_assistant_template = """  
You are an ice cream assistant chatbot named "Scoopsie". Your expertise is  
exclusively in providing information and advice about anything related to  
ice creams. This includes flavor combinations, ice cream recipes, and general  
ice cream-related queries. You do not provide information outside of this  
scope. If a question is not about ice cream, respond with, "I specialize  
only in ice cream related queries."  
Chat History: {chat_history}  
Question: {question}  
Answer:"""  
  
ice_cream_assistant_prompt_template = PromptTemplate(input_variables=["chat_history", "question"], template=ice_cream_assistant_template)

步骤 2

现在,让我们编写一些代码来创建我们的 Chainlit 应用程序。正如我们在文章开头所讨论的,我们需要为两个 Chainlit 装饰器编写包装函数。让我们首先将库导入到我们的文件中:chatbot.py

python 复制代码
import chainlit as cl

第一个函数将围绕聊天启动装饰器:此函数是准备我们的模型、内存对象和用户交互。链对象将传递给用户会话,并为会话指定名称。稍后可以使用此名称在用户发送查询时检索特定的链对象。@cl.on_chat_start

python 复制代码
@cl.on_chat_start  
def quey_llm():  
	llm = OpenAI(model='gpt-3.5-turbo-instruct', temperature=0)  
  
conversation_memory = ConversationBufferMemory(memory_key="chat_history", max_len=50, return_messages=True)  
llm_chain = LLMChain(llm=llm, prompt=ice_cream_assistant_prompt_template, memory=conversation_memory) 
  
cl.user_session.set("llm_chain", llm_chain)

接下来,我们将使用装饰器定义消息处理函数。此函数负责处理用户消息并生成响应:@cl.on_message

python 复制代码
@cl.on_message  
async def query_llm(message: cl.Message):  
	llm_chain = cl.user_session.get("llm_chain")  
	response = await llm_chain.acall(message.content, callbacks=[cl.AsyncLangchainCallbackHandler()])  
	await cl.Message(response["text"]).send()

在上面的代码中,我们从用户会话中检索以前存储的对象。此对象包含与语言模型交互所需的状态和配置。然后,使用传入消息的内容调用该方法。此方法将消息发送到 LLM,其中包含对话历史记录中的任何必要上下文,并等待响应。收到来自 LLM 的响应后,将其格式化为对象并发送回用户。llm_chain llm_chain.acall cl.Message

步骤 3

准备好应用程序代码后,是时候启动我们的聊天机器人了。在项目目录中打开终端并运行以下命令:

python 复制代码
chainlit run chatbot.py -w --port 8000

-w 该参数告诉应用程序在我们对应用程序代码进行一些更改时自动重新加载。您可以通过在 Web 浏览器中导航到 http://localhost:8000 来访问聊天机器人。

启动后,您将看到:

步骤 4

我们可以通过修改项目根目录中的文件来更改欢迎界面。如果您不想要欢迎界面,可以将此文件留空。让我们继续添加与我们的聊天机器人相关的描述。chainlit.md

python 复制代码
# 🍨 Welcome to Scoopsie! 🍦  
  
Hi there! 👋 I am Scoopsie and I am built to assist you with all  
your ice-cream related queries. You can begin by asking me anything  
related to ice-creams in the chatbox below.

我们还可以更改应用程序的外观,例如通过更改文件来更改主题颜色。您可以在项目内的文件夹中找到此文件。现在,我将只使用默认值。该应用程序还支持直接从前端在浅色和深色模式之间切换:config.toml .chainlit

演示

Scoopsie 应用程序界面现已准备就绪!以下是展示聊天机器人运行情况的演示:

后续步骤

我们的自定义聊天机器人的应用程序界面已全部设置完毕。在下一个教程中,我们将重点介绍如何将外部 API 与我们的聊天机器人集成,因为这在很多企业级应用程序中可能是一个有用的功能。

相关推荐
奈斯。zs7 分钟前
yjs08——矩阵、数组的运算
人工智能·python·线性代数·矩阵·numpy
Melody20508 分钟前
tensorflow-dataset 内网下载 指定目录
人工智能·python·tensorflow
DisonTangor40 分钟前
阿里通义千问开源Qwen2.5系列模型:Qwen2-VL-72B媲美GPT-4
人工智能·计算机视觉
豆浩宇40 分钟前
Halcon OCR检测 免训练版
c++·人工智能·opencv·算法·计算机视觉·ocr
LLSU131 小时前
聚星文社AI软件小说推文软件
人工智能
JackieZhengChina1 小时前
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
人工智能·智能手机
ShuQiHere1 小时前
【ShuQiHere】 探索数据挖掘的世界:从概念到应用
人工智能·数据挖掘
嵌入式杂谈1 小时前
OpenCV计算机视觉:探索图片处理的多种操作
人工智能·opencv·计算机视觉
时光追逐者1 小时前
分享6个.NET开源的AI和LLM相关项目框架
人工智能·microsoft·ai·c#·.net·.netcore
东隆科技1 小时前
PicoQuant公司:探索铜铟镓硒(CIGS)太阳能电池技术,引领绿色能源革新
人工智能·能源