如何构建您自己的 Panel AI 聊天机器人
Andrew Huang 和 Sophia Yang
Andrew Huang 和 Sophia Yang

开源项目 Panel 在最新的 1.3 版本中推出了一项令人兴奋且备受期待的新功能:Chat Interface widget(聊天界面组件)。这项新功能开启了无限可能,使 AI 聊天机器人的创建比以往任何时候都更易于访问和用户友好。
在这篇文章中,您将学习如何使用 ChatInterface widget,并构建:
- 一个基本的聊天机器人
- 一个由 OpenAI ChatGPT 驱动的 AI 聊天机器人
- 一个由 LangChain 驱动的 AI 聊天机器人
在开始之前,您需要安装 Panel(任何高于 1.3.0 的版本)以及您可能需要的其他软件包,例如 jupyterlab、openai 和 langchain。
现在您已准备就绪!
使用 ChatInterface widget
全新的 ChatInterface widget 是一种高级 widget,提供了一个用户友好的聊天界面,用于发送消息,并带有四个内置操作:
- 发送:发送消息到聊天记录
- 重新运行:重新发送最近的用户消息
- 撤销:删除最近的消息
- 清除:清除所有聊天消息

想了解更多关于 `ChatInterface` 底层工作原理的信息吗?它是一个高级 widget,封装了中级 widget `ChatFeed`,后者管理 `ChatMessage` 项目列表以显示聊天消息。请查看关于 ChatInterface、ChatFeed 和 ChatMessage 的文档以了解更多信息。
1. 构建一个基本的聊天机器人
通过 `pn.chat.ChatInterface`,我们可以向聊天界面发送消息,但系统应该如何回复呢?我们可以定义一个 `callback` 函数!
在这个例子中,我们的 `callback` 函数只是简单地回显用户消息。看看它已经变得更具功能性了吗?
如何使用 ChatInterface widget 回显消息
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 widget 创建一个使用 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 widget 创建一个结合 LangChain 使用 OpenAI GPT-3 API 的聊天机器人
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 widget。我们首先引导您使用 `pn.chat.ChatInterface` 构建一个基本的聊天机器人。然后,通过无缝集成 OpenAI ChatGPT,我们提升了聊天机器人的功能。为了进一步加深您的理解,我们还探讨了 LangChain 与 Panel ChatInterface 的集成。如果您渴望探索更多聊天机器人示例,请随时访问这个 GitHub 仓库,并考虑贡献您自己的示例。
掌握了这些见解和实践示例,您现在已经为开始在 Panel 中制作 AI 聊天机器人的旅程做好了充分准备。祝您编码愉快!
所有这些工具都是开源的,并且每个人都可以免费使用,但如果您想在 Anaconda 的 AI 和 Python 应用专家的帮助下开始使用,请联系我们销售团队的代表,邮箱:[email protected]。