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

相关推荐
张较瘦_几秒前
[论文阅读] AI + 软件工程(Debug)| 告别 “猜 bug”:TreeMind 用 LLM+MCTS 破解 Android 不完整报告复现难题
论文阅读·人工智能·bug
深栈7 分钟前
机器学习:线性回归
人工智能·pytorch·python·机器学习·线性回归·sklearn
AI视觉网奇26 分钟前
虚拟机安装 网络问题
人工智能·虚拟机
云澈ovo36 分钟前
FP16混合精度训练:Stable Diffusion生成速度提升300%的硬件配置方案
人工智能·机器学习·stable diffusion
zzywxc78741 分钟前
AI行业应用:金融、医疗、教育、制造业的落地实践与技术创新
人工智能·机器学习·金融·自动化·prompt·ai编程·xcode
简简单单做算法44 分钟前
基于遗传优化的LSTM-Attention一维时间序列预测算法matlab仿真
人工智能·lstm·时间序列预测·lstm-attention·遗传优化
C++chaofan1 小时前
项目中为AI添加对话记忆
java·数据结构·人工智能·redis·缓存·个人开发·caffeine
Elastic 中国社区官方博客1 小时前
CI/CD 流水线与 agentic AI:如何创建自我纠正的 monorepos
大数据·运维·数据库·人工智能·搜索引擎·ci/cd·全文检索
I'm a winner2 小时前
护理+人工智能研究热点数据分析项目实战(五)
人工智能·数据挖掘·数据分析
蒋星熠2 小时前
TensorFlow与PyTorch深度对比分析:从基础原理到实战选择的完整指南
人工智能·pytorch·python·深度学习·ai·tensorflow·neo4j