自从 2023 年 3 月 1 日发布了“ChatGPT API”以来,已经有成千上万个基于该 API 的应用程序被创造出来,这为企业和个人带来了前所未有的机会。凭借 GPT-3.5 的自然语言处理功能,用户可以创建智能聊天机器人,与人类进行完美交互,并可应用于问答、翻译、写代码等用途。
本文将为你介绍用 ChatGPT API 和 Streamlit 构建一个小型的聊天机器人网站,详情见下文。
环境配置
1.Python 环境安装
构建的网站需要用 Python 来写,如果你还没有配置 Python 环境,你需要先进行配置,方可进行下一步,你可参考 Python 环境搭建 这篇文章。
2.安装 openai 库
网站需要用到 OpenAI 的 API,所以需要安装 openai 库。
pip install openai
3.OpenAI 的 API_KEY
除此之外,你还需要准备一个 OpenAI 提供的 API_KEY,否者无法使用 OpenAI API。
Streamlit 和 Streamlit_chat
Streamlit 是一个开源框架,使开发人员能够快速构建和共享用于机器学习和数据科学项目的交互式 Web 应用程序。它还提供了一系列小部件,只需要一行 Python 代码即可创建,例如st.table(…)
。对于我们创建一个简单的用于私人使用的聊天机器人网站来说,Streamlit 是一个非常合适的库,它还提供了第三方 Streamlit_chat 库,进一步方便我们生成“聊天式” Web 应用程序,因为我们不需要写大量的 HTML 元素和 CSS 内容。
要打造一个使用 Streamlit 构建的网站,并在网页上运行,只需要几个步骤:
1. 安装需要的包
pip install streamlit
pip install streamlit_chat
2.创建 python 文件
你可以在 IED 编辑器(比如:VScode) 中新建一个以 .py
为后缀命名的文件,例如创建一个demo.py
文件,其中包含以下代码:
import streamlit as st
st.write("""你好,世界!!""")
3.本地运行
在控制台输入以下命令运行:
python -m streamlit run demo.py
初次使用可能会让你填入邮箱,如图所示:
在打印出这个输出后,你可以通过列出的地址和端口访问您的网页:
构建 ChatGPT 网站
代码
以下是用 Python + gpt-3.5-turbo 模型构建的完整的 Python 代码,你可以直接复制:
import openai
import os
import streamlit as st
from streamlit_chat import message
# 读取环境变量中的api_key
openai.api_key = os.environ.get("OPENAI_API_KEY")
# 也可直接写api_key
#openai.api_key = 'API_KEY'
if 'prompts' not in st.session_state:
st.session_state['prompts'] = [{"role": "system", "content": "您是一个乐于助人的助手。尽量简洁明了地回答问题,并带有一点幽默表达。"}]
if 'generated' not in st.session_state:
st.session_state['generated'] = []
if 'past' not in st.session_state:
st.session_state['past'] = []
def generate_response(prompt):
st.session_state['prompts'].append({"role": "user", "content": prompt})
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=st.session_state['prompts']
)
message = completion.choices[0].message.content
return message
def end_click():
st.session_state['prompts'] = [{"role": "system", "content": "您是一个乐于助人的助手。尽量简洁明了地回答问题,并带有一点幽默表达。"}]
st.session_state['past'] = []
st.session_state['generated'] = []
st.session_state['user'] = ""
def chat_click():
if st.session_state['user'] != '':
chat_input = st.session_state['user']
output = generate_response(chat_input)
st.session_state['past'].append(chat_input)
st.session_state['generated'].append(output)
st.session_state['prompts'].append({"role": "assistant", "content": output})
st.session_state['user'] = ""
st.image("./logo.png", width=80)
st.title("我的聊天机器人")
user_input = st.text_input("输入:", key="user")
chat_button = st.button("发送", on_click=chat_click)
end_button = st.button("新聊天", on_click=end_click)
if st.session_state['generated']:
for i in range(0, len(st.session_state['generated']), 1):
message(st.session_state['past'][i], is_user=True)
message(st.session_state['generated'][i], key=str(i))
注:如果你没有将你的 api_key 存到环境变量,你需要手动赋予 openai.api_key
的值
代码解释
Web 操作的运行数据都由 Streamlit 的session_state
对象管理。我们定义了prompts
列表来存储从system
角色开始的提示消息,并在每次生成的聊天中由user
和assistant
追加。
对于system
角色消息,我在内容中加入了额外的指示“您是一个乐于助人的助手。尽量简洁明了地回答问题,并带有一点幽默表达。”
另外两个session_state
用于存储所有 API 响应(generated
)和所有用户提示(past
),以便使用 Streamlit_chat 函数message()
以聊天样式一对一显示。
Streamlit 小部件创建了两个按钮,发送
用于激活 ChatCompletion 请求,新聊天
用于清除prompts
对象和聊天显示中的聊天历史记录。这些行为在回调函数chat_click()
和end_click()
中定义。
为了完全复制 ChatGPT 的用户体验,我们还需要考虑来自 API 响应的完整 markdown 功能的显示,如代码片段、表格等。不幸的是,streamlit_chat 的聊天气泡无法很好地显示 markdown 内容,所以我使用了tabs
小部件,将气泡显示中的纯文本作为normal
,将结构化文本(如代码)作为rich
进行分离显示。
运行结果
上面代码的运行成功后,即可开展对话,例如:
OpenAI 在线调试工具
OpenAI API 的在线调试地址为:https://openai.apifox.cn/ ,点击即可访问。
项目中包含了 OpenAI 官方提供的所有 API,你可以根据需要进行操作,比如你可以通过 OpenAI 的接口来生成图像、上传音视频文件并转文本、翻译、创建聊天机器人、创建微调等。项目中有些目录下会有相关的 MarkDown 文件,里面会简要介绍某个功能模块怎么使用。
注:在使用该项目之前,请查看“项目说明”
其它扩展
如果你想要学习更多 AI 相关的知识,欢迎访问如下扩展:
OpenAI 中文学习文档:OpenAI 中文文档
ChatGPT 提示词指南:Prompt 学习指南
面向开发者的 Prompt 指南: Prompt 工程指南
阅读更多: