如何构建自己的面板 AI 聊天机器人

Andrew Huang 和 Sophia Yang

开源项目 Panel 的最新版本 1.3 刚刚引入了激动人心的新功能,即聊天界面小部件。这项新功能开辟了无限可能,使创建 AI 聊天机器人比以往任何时候都更加容易和用户友好。 

在本文中,您将学习如何使用 ChatInterface 小部件来构建

  • 一个基本聊天机器人
  • 一个基于 OpenAI ChatGPT 的 AI 聊天机器人 
  • 一个基于 LangChain 的 AI 聊天机器人 

在开始之前,您需要安装 Panel(任何大于 1.3.0 的版本)以及您可能需要的其他软件包,例如 jupyterlab、openai 和 langchain。

现在您已准备好开始! 

使用 ChatInterface 小部件

全新的 ChatInterface 小部件是一个高级小部件,提供用户友好的聊天界面来发送消息,并具有四个内置操作

  • 发送:将消息发送到聊天日志
  • 重新运行:重新发送最近的用户消息 
  • 撤销:删除最近的消息
  • 清除:清除所有聊天消息

想知道 `ChatInterface` 在幕后是如何工作的吗?它是一个高级小部件,它围绕中间级小部件 `ChatFeed` 包装,`ChatFeed` 管理一个 `ChatMessage` 项目列表,用于显示聊天消息。请查看有关 ChatInterfaceChatFeedChatMessage 的文档,以了解更多信息。 

1. 构建一个基本聊天机器人

使用 `pn.chat.ChatInterface`,我们可以将消息发送到聊天界面,但系统应该如何回复呢?我们可以定义一个 `callback` 函数! 

在此示例中,我们的 `callback` 函数只是简单地回显用户消息。您是否已经看到它变得更加实用?

如何使用 ChatInterface 小部件来回显消息

import panel as pn

pn.extension()


def callback(contents: str, user: str, instance: pn.chat.ChatInterface):
    message = f"Echoing {user}: {contents}"
    return message


chat_interface = pn.chat.ChatInterface(callback=callback, callback_user="System")
chat_interface.send("Send a message to receive an echo!", user="System", respond=False)
chat_interface.servable()

要服务应用程序,请运行 `panel serve app.py` 或 `panel serve app.ipynb`。 

2. 构建一个基于 ChatGPT 的 AI 聊天机器人 

我们如何使用 OpenAI ChatGPT 来回复消息?我们只需在 `callback` 函数中调用 OpenAI API 即可。 

在您的环境中安装 `openai`,并将您的 OpenAI API 密钥添加到脚本中。请注意,在此示例中,我们在函数中添加了 `async` 以允许在单个线程内进行协作式多任务处理,并允许 IO 任务在后台进行。这确保了我们的应用程序在等待 OpenAI API 响应时能够平稳运行。Async 使并发执行成为可能,使我们能够在等待时执行其他任务,并确保应用程序响应迅速。

如何使用 ChatInterface 小部件来使用 OpenAI 的 GPT-3 API 创建聊天机器人

import openai
import panel as pn

pn.extension()

openai.api_key = "Add your key here"

async def callback(contents: str, user: str, instance: pn.chat.ChatInterface):
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": contents}],
        stream=True,
    )
    message = ""
    for chunk in response:
        message += chunk["choices"][0]["delta"].get("content", "")
        yield message


chat_interface = pn.chat.ChatInterface(callback=callback, callback_user="ChatGPT")
chat_interface.send(
    "Send a message to get a reply from ChatGPT!", user="System", respond=False
)
chat_interface.servable()

3. 构建一个基于 LangChain 的 AI 聊天机器人 

Panel ChatInterface 还与 LangChain 无缝集成,利用 LangChain 全方位的功能。 

以下是如何使用 LangChain 的 `ConversationChain` 和 `ConversationBufferMemory` 来存储消息并将以前的消息传递给 OpenAI API 的示例。 

同样,请记住确保在您的环境中安装 `langchain`,并在脚本中添加您的 OpenAI API 密钥。 
请注意,在我们深入研究 LangChain 代码之前,我们定义了一个 `callback_handler`,因为 LangChain 接口没有从生成器流式传输的方法,因此我们需要使用 `pn.chat.langchain.PanelCallbackHandler` 包装 LangChain 接口,该接口继承自 `langchain.callbacks.base.BaseCallbackHandler`。有关更多信息,请查看 文档

如何使用 ChatInterface 小部件来使用 OpenAI 的 GPT-3 API 和 LangChain 创建聊天机器人

import os

import panel as pn

from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory

pn.extension()

os.environ["OPENAI_API_KEY"] = "Type your API key here"

async def callback(contents: str, user: str, instance: pn.chat.ChatInterface):
    await chain.apredict(input=contents)

chat_interface = pn.chat.ChatInterface(callback=callback, callback_user="ChatGPT")
callback_handler = pn.chat.langchain.PanelCallbackHandler(chat_interface)
llm = ChatOpenAI(streaming=True, callbacks=[callback_handler])
memory = ConversationBufferMemory()
chain = ConversationChain(llm=llm, memory=memory)

chat_interface.send(
    "Send a message to get a reply from ChatGPT!", user="System", respond=False)
chat_interface.servable()

结论

在这篇博文中,我们深入研究了 Panel 中激动人心的新功能 ChatInterface 小部件。我们首先指导您使用 `pn.chat.ChatInterface` 构建一个基本聊天机器人。然后,我们通过无缝集成 OpenAI ChatGPT 来提升聊天机器人的功能。为了进一步加深您的理解,我们还探讨了 LangChain 与 Panel 的 ChatInterface 的集成。如果您渴望探索更多聊天机器人示例,请随时访问这个 GitHub 存储库,并考虑贡献您自己的示例。

有了这些见解和实践示例,您现在已做好准备,开始在 Panel 中构建 AI 聊天机器人的旅程。祝您编码愉快!

所有这些工具都是开源的,所有人都可以免费使用,但是如果您想在 Anaconda 的 AI 和 Python 应用程序专家帮助下开始使用,请与我们的销售团队代表联系,联系方式为 [email protected]

与专家交谈

与我们的专家交谈,为您的 AI 之旅找到解决方案。

与专家交谈