23
2023-06
代码分享|如何构建一个对话机器人
以下代码适用于jupyter notebook~由于我自己也是边学边做的,有可能有一些地方的代码是错误或者有问题的~
LEARN MORE
图片由Stable Diffusion绘制
首先是导入所需要的包,因为我没做复杂的前端可视化界面,所以用到了open ai、os和panel三个包。
import openai
import os
import panel as pn
os和panel这两个包是anaconda默认就有的,但是openai这个包不是,需要装一下,两种方法,第一种是打开anaconda powershell进行安装,第二种是直接在jupyter中进行安装。
#写法1,在powershell中进行安装
conda install openai
pip install openai
#写法2:在jupyter中直接进行安装
! pip install openai
顺便说一句,下载并安装包不需要访问国外网站,直接安装就可以。
装好包之后就可以录入自己的api key了,不知道怎么获取api key的同学可以加入唠嗑群细聊~
方法也是非常的简单,这样写就可以了
openai.api_key = ("你的api key")
然后是构造两个function用于调取API并实现对话的功能:
def get_completion(prompt, model="gpt-3.5-turbo"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0, # this is the degree of randomness of the model's output
)
return response.choices[0].message["content"]
再定义一个function用于实现连续对话的功能,或者说让AI记住之前的对话是什么。
def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=temperature, # this is the degree of randomness of the model'
s output
)
# print(str(response.choices[0].message))
return response.choices[0].message["content"]
再构造一个函数让它有一个对话的感觉
import panel as pn def collect_messages(_):
prompt = inp.value_input
inp.value = ''
context.append({'role':'user', 'content':f"{prompt}"})
response = get_completion_from_messages(context)
context.append({'role':'assistant', 'content':f"{response}"})
panels.append(
pn.Row('User:', pn.pane.Markdown(prompt, width=600)))
panels.append(
pn.Row('Assistant:', pn.pane.Markdown(response, width=600, style={'background-color': '#F6F6F6'})))
return pn.Column(*panels)
最后就是调用这些函数,让它运转
pn.extension() panels = [] # collect display context = [ {'role':'system', 'content':""" 你是一个数据分析专家,现在想把自己的分析经验写成微信公众号文章进行推送
"""} ] # accumulate messages
inp = pn.widgets.TextInput(value="Hi", placeholder='在这里开始聊天')
button_conversation = pn.widgets.Button(name="发送")interactive_conversation = pn.bind(collect_messages, button_conversation)
dashboard = pn.Column(
inp,
pn.Row(button_conversation),
pn.panel(interactive_conversation, loading_indicator=True, height=300),
)
dashboard
这样一来,一个简易的对话机器人就完成啦~不过上面这个代码,如果没有访问国外网站话,会下面这个错:
不知道怎么访问国外网站的同学,或者就是单纯想白嫖的同学,可以去看我6月21日推送发布的文章,azure虚拟机踩坑指南。毕竟有些话不能说得太明白,至于是怎么实现合法访问国外网站且白嫖的,你细品就知道了。除了这种办法以外,6月19日的推文中还提到了一个浏览器插件神器,媲美调接口的体验且不需要访问国外网站,有兴趣的同学自己体会。
总之呢,运行出来的效果是这样的:
虽然UI寒碜了一点,但是它确实能用且好用,对我而言已经足够了。虽然把代码放出来了,但是访问国外网站这个事情确实有点麻烦,我还是推荐浏览器插件那个做法,好用很多。
THANKS