代码分享|如何构建一个对话机器人

23

2023-06

代码分享|如何构建一个对话机器人

以下代码适用于jupyter notebook~由于我自己也是边学边做的,有可能有一些地方的代码是错误或者有问题的~

LEARN MORE

图片由Stable Diffusion绘制

首先是导入所需要的包,因为我没做复杂的前端可视化界面,所以用到了open ai、os和panel三个包。

代码语言:javascript
复制
import openai
import os
import panel as pn

os和panel这两个包是anaconda默认就有的,但是openai这个包不是,需要装一下,两种方法,第一种是打开anaconda powershell进行安装,第二种是直接在jupyter中进行安装。

代码语言:javascript
复制
#写法1,在powershell中进行安装
conda install openai
pip install openai
#写法2:在jupyter中直接进行安装
! pip install openai

顺便说一句,下载并安装包不需要访问国外网站,直接安装就可以。

装好包之后就可以录入自己的api key了,不知道怎么获取api key的同学可以加入唠嗑群细聊~

方法也是非常的简单,这样写就可以了

代码语言:javascript
复制
openai.api_key = ("你的api key")

然后是构造两个function用于调取API并实现对话的功能:

代码语言:javascript
复制
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记住之前的对话是什么。

代码语言:javascript
复制
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"]

再构造一个函数让它有一个对话的感觉

代码语言:javascript
复制
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)

最后就是调用这些函数,让它运转

代码语言:javascript
复制
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