使用 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 与我们的聊天机器人集成,因为这在很多企业级应用程序中可能是一个有用的功能。

相关推荐
chxin140162 分钟前
循环神经网络——动手学深度学习7
人工智能·pytorch·rnn·深度学习
摘星编程6 分钟前
MCP提示词工程:上下文注入的艺术与科学
人工智能·提示词工程·a/b测试·mcp·上下文注入
W.KN1 小时前
PyTorch 数据类型和使用
人工智能·pytorch·python
虾饺爱下棋1 小时前
FCN语义分割算法原理与实战
人工智能·python·神经网络·算法
点云SLAM5 小时前
Eigen 中矩阵的拼接(Concatenation)与 分块(Block Access)操作使用详解和示例演示
人工智能·线性代数·算法·矩阵·eigen数学工具库·矩阵分块操作·矩阵拼接操作
木枷6 小时前
NAS-Bench-101: Towards Reproducible Neural Architecture Search
人工智能·物联网
BAOYUCompany6 小时前
暴雨服务器更懂人工智能+
运维·服务器·人工智能
飞哥数智坊6 小时前
Coze实战第17讲:工资条自动拆分+一对一邮件发送
人工智能·coze
cwn_6 小时前
自然语言处理NLP (1)
人工智能·深度学习·机器学习·自然语言处理
点云SLAM6 小时前
PyTorch中flatten()函数详解以及与view()和 reshape()的对比和实战代码示例
人工智能·pytorch·python·计算机视觉·3d深度学习·张量flatten操作·张量数据结构