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