利用 OpenAI 接口,一个人就能完成聊天机器人

简介: 利用 OpenAI 接口,一个人就能完成聊天机器人


嗨,你好哈,今天分享一个如何利用 OpenAI 提供的接口,快速搭建出一个聊天机器人。说实话,要在 ChatGPT 之前,一个人完成聊天机器人真的太难了。

接下来,我们对比一下看看哈。

ChatGPT 之前的架构



图片互联网收集整理

每个模块都是一个工程,如:分词、词性标注、命名实体识别、信息抽取、句法分析、词向量、命名实体消歧、特征提取、问题分类、情感分析、指代消解、意图识别、语义理解、构建知识库、对话管理等等。


如果想了解更多详细内容,可以参考以下资料:


用户意图复杂多变,如何构造小爱智能问答的关键技术?

OPPO唐黎:OPPO小布助手在对话系统技能平台建设中的落地实践

OPPO 对话式 AI 助手小布演进之路

NLP在携程机票人工客服会话分类中的应用

美团智能客服技术实践

上百个业务场景,语义匹配技术在携程智能客服中的应用

ChatCompletion 简介


因为 ChatGPT 的火热,OpenAI 发布了一个直接可以进行对话聊天的接口 ChatCompletion,对应的模型叫为 gpt-3.5-turbo,用起来更容易了,速度还快,而且价格也是 text-davinci-003 的十分之一。

官网地址:https://platform.openai.com/docs/guides/chat

以下代码获取自官网,先直观感受下:

# Note: you need to be using OpenAI Python v0.27.0 for the code below to work
import openai
openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Who won the world series in 2020?"},
        {"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
        {"role": "user", "content": "Where was it played?"}
    ]
)

主要输入是 message 参数。消息必须是一个消息对象数组,其中每个对象都有一个角色(“系统”、“用户”或“助手”)和内容(消息的内容)。

当 role 是 system 的时候,content 里面的内容代表给 AI 的一个指令,也就是告诉 AI 应该怎么回答用户的问题。比如我们希望 AI 都通过中文回答,我们就可以在 content 里面写“你是一个只会用中文回答问题的助理,回答的内容在100字以内。”。

当 role 是 user 或者 assistant 的时候,content 里面的内容就代表用户和 AI 对话的内容。

上面接口返回内容大概格式为:

{
 'id': 'chatcmpl-6p9XYPYSTTRi0xEviKjjilqrWU2Ve',
 'object': 'chat.completion',
 'created': 1677649420,
 'model': 'gpt-3.5-turbo',
 'usage': {'prompt_tokens': 56, 'completion_tokens': 31, 'total_tokens': 87},
 'choices': [
   {
    'message': {
      'role': 'assistant',
      'content': 'The 2020 World Series was played in Arlington, Texas at the Globe Life Field, which was the new home stadium for the Texas Rangers.'},
    'finish_reason': 'stop',
    'index': 0
   }
  ]
}

在 Python 中,可以使用 response['choices'][0]['message']['content'] 提取 AI 的回复。

每个响应都包含一个 finish_reason。finish_reason 的可能值是:

  • stop: API 返回的完整模型输出
  • length: 由于 max _ tokens 参数或令牌限制,模型输出不完整
  • content_filter: 由于内容过滤器的标志而被省略的内容
  • null: API 响应仍在进行中或不完整

封装自己的聊天机器人


按照上面的例子,就可以照猫画虎,很容易去封装一个聊天机器人了,具体步骤如下:

封装了一个 Conversation 类,它的构造函数 init 会接受两个参数,prompt 作为 system 的 content,代表对这个聊天机器人的指令,round 代表每次向 ChatGPT 发起请求的时候,保留过去几轮会话。

Conversation 类本身只有一个 ask 函数,输入是一个 string 类型的 question,返回结果也是 string 类型的一条 message。每次调用 ask 函数,都会向 ChatGPT 发起一个请求。

支持多轮对话,把最新的问题拼接到整个对话数组的最后,而在得到 ChatGPT 的回答之后也会把回答拼接上去。如果回答完之后,发现会话的轮数超过我们设置的 round,可以对历史问答的数据利用文本摘要的方式支持无限轮数的聊天。

import openai
import os
openai.api_key = os.environ.get("OPENAI_API_KEY")
class Conversation:
    def __init__(self, prompt, round):
        self.prompt = prompt
        self.round = round
        self.messages = []
        self.messages.append({"role": "system", "content": self.prompt})
    def ask(self, question):
        try:
            self.messages.append({"role": "user", "content": question})
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo",
                messages=self.messages,
                temperature=0.5,
                max_tokens=2048,
                top_p=1,
            )
        except Exception as e:
            print(e)
            return e
        message = response["choices"][0]["message"]["content"]
        self.messages.append({"role": "assistant", "content": message})
        if len(self.messages) > self.round * 2 + 1:
            text = self._build_message(self.messages)
            #print (text)
            #print ("=====summarize=====")
            summarize = self.summarize(text)
            #print (summarize)
            #print ("=====summarize=====")
            self.messages = []
            self.messages.append({"role": "system", "content": summarize})
        return message
    def summarize(self, text, max_tokens=200):
        response = openai.Completion.create(
            model = "text-davinci-003",
            prompt = text + "\n\n请总结一下上面User和Assistant聊了些什么:\n",
            max_tokens = max_tokens,
        )
        return response["choices"][0]["text"]
    def _build_message(self, messages):
        text = ""
        for message in messages:
            if message["role"] == "user":
                text += "User : " + message["content"] + "\n\n"
            if message["role"] == "assistant":
                text += "Assistant : " + message["content"] + "\n\n" 
        return text

验证


我们知道 ChatGPT 的数据是2021年9月份之前的,目前对话没有接入实时的数据,另一个问题是事实性错误。所以,查看了 GitHub 上 ChatGPT 的调教指南,选择了厨师这样一个角色,不会受到数据和事实性错误的影响。

接下来,学习做几道菜。

prompt = """你是一个中餐厨师,用中文回答做菜的问题。你的回答需要满足以下要求:
1. 你的回答必须是中文
2. 回答限制在100个字以内"""
conv = Conversation(prompt, 3)

小结


使用 OpenAI 的接口来实现一个聊天机器人了,实现了轮数的对话,并且体验了它的效果。

相关文章
|
6月前
|
运维 监控 安全
调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
191 0
|
6月前
|
JSON 机器人 数据安全/隐私保护
钉钉中,如何获取机器人发送群聊消息接口返回的加密消息id(processQueryKey)?
钉钉中,如何获取机器人发送群聊消息接口返回的加密消息id(processQueryKey)?【1月更文挑战第5天】【1月更文挑战第24篇】
172 5
|
Web App开发 人工智能 Linux
宝塔快速反代openai官方的API接口,实现国内调用open ai
宝塔快速反代openai官方的API接口,实现国内调用open ai
918 0
|
人工智能 缓存 安全
LangChain开发环境准备-实现私有大模型OpenAI标准接口封装
今天这节课我就将带领小伙伴们将这未完成的一步补全,实现私有大模型OpenAI标准接口封装,并完成LangChain对大模型的调用与测试
1985 0
|
3月前
|
机器人 API Python
智能对话机器人(通义版)会话接口API使用Quick Start
本文主要演示了如何使用python脚本快速调用智能对话机器人API接口,在参数获取的部分给出了具体的获取位置截图,这部分容易出错,第一次使用务必仔细参考接入参数获取的位置。
215 1
|
1月前
|
人工智能 JSON 数据可视化
OpenAI调用接口多轮对话Multi Turn Multi Agent 多轮多角色对话调试和可视化工具Dialogue Visualization
伴随着生成式人工智能技术发展,进2年涌现出大语言模型LLM/Agent系统/AI推理等众多方向的技术项目和论文。其中对话系统,智能体交互是用户通过UX界面和AI系统进行交互,这种交互有时候也是多模态(用户输入文字/语音/图像)等等。在调用OpenAI 的对话接口时候,有时候需要把对话结果打印出来检查是否有bug,JSON数据格式就比较难看出来了,尤其是有多角色的多轮对话。这个时候可以借助一些在线的"对话"可视化的工具 (Online Dialogue Visualization Tool) DeepNLP Dialogue Visualization Tool,方便产品经理,算法研发,学术研究
OpenAI调用接口多轮对话Multi Turn Multi Agent 多轮多角色对话调试和可视化工具Dialogue Visualization
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
Midjourney是一个基于GPT-3.5系列接口开发的免费AI机器人
Midjourney是一个基于GPT-3.5系列接口开发的免费AI机器人
83 0
|
6月前
|
人工智能 安全 搜索推荐
【战略前沿】OpenAI 为每个人提供自定义聊天机器人的计划将于下周发布
【战略前沿】OpenAI 为每个人提供自定义聊天机器人的计划将于下周发布
【战略前沿】OpenAI 为每个人提供自定义聊天机器人的计划将于下周发布
|
6月前
|
运维 监控 安全
【优化篇】调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
【优化篇】调用钉钉机器人API接口将堡垒机安全运维告警单发给运维人员
131 0
|
6月前
|
存储 人工智能 机器人
通过 OpenAI 和 Langchain 构建 Arxiv 论文摘要 Twitter 机器人
通过 OpenAI 和 Langchain 构建 Arxiv 论文摘要 Twitter 机器人
152 0