新闻动态

行业新闻企业新闻安博电竞

手把手教会你如何通过ChatGPT API实现上下文对话

安博电竞

前言

ChatGPT最近热度持续高涨,已经成为互联网和金融投资领域最热门的手把手教实现上下话题。

有的何话小伙伴可能需要在公司搭建一套ChatGPT系统,那使用ChatGPT的API显然是最好的选择 。

不过ChatGPT的通过API都是无状态的,没有对话管理的功能 。

你调用API发送一个问题(prompt)给ChatGPT,它就根据你发送的文对问题返回一个结果(completion)。

那如何通过ChatGPT的手把手教实现上下API实现带上下文功能的对话呢 。

ChatGPT API

ChatGPT的何话API实际上是对标准的HTTP接口做了一层封装,HTTP请求的url地址如下:

https://api.openai.com/v1/chat/completions

官方封装了Python和Node.js库,可以直接使用。

我们来看一段Python代码示例:

import osimport openai# 设置API keyopenai.api_key = os.getenv("OPENAI_API_KEY")# 给ChatGPT发送请求completion = openai.ChatCompletion.create(model="gpt-3.5-turbo",通过messages=[{"role": "user", "content": "Hello!"}])# 打印请求结果print(completion.choices[0].message)

这段代码很简单,发送一条消息"Hello!"给ChatGPT,然后打印结果。

这里有3个注意事项:

​ 其中,openai.ChatCompletion用于对话  。

Role角色

细心的手把手教实现上下同学可能已经发现,给ChatGPT发送消息的时候,参数message是个数组,数组里每个dict有role这个字段  。

role目前有3个取值:

gpt-3.5-turbo-0301 does not always pay strong attention to system messages. Future models will be trained to pay stronger attention to system messages.

# Note: you need to be using OpenAI Python v0.27.0 for the code below to workimport openaiopenai.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?"}])

上面这段代码里,使用了3种角色的role,这个messages发送给ChatGPT后,ChatGPT就有了上下文,知道作为user的我们说了什么,也知道作为assistant的自己回答了什么 。

想通过API实现包含上下文信息的多轮对话的关键就是用好role字段 。

不含上下文的对话

import osimport openaiopenai.api_key = os.getenv("OPENAI_API_KEY")while True:content = input("User: ")messages = [{"role": "user", "content": content}]completion = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=messages)chat_response = completionanswer = chat_response.choices[0].message.contentprint(f'ChatGPT: {answer}')

上面这个实现里,每次只发送了当前输入的信息,并没有发送对话的历史记录,所以ChatGPT无法知道上下文 。

我们来看对话效果如下:

$ python3 chatgpt1.py User: 你好ChatGPT: 你好!我是AI助手,有什么可以帮到您的吗?User: 我刚才说了什么ChatGPT: 很抱歉,由于我是AI语音助手,无法得知您刚才说了什么,请您再次告知  。

包含上下文的对话

import osimport openaiopenai.api_key = os.getenv("OPENAI_API_KEY")messages = []while True:content = input("User: ")messages.append({"role": "user", "content": content})completion = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=messages)chat_response = completionanswer = chat_response.choices[0].message.contentprint(f'ChatGPT: {answer}')messages.append({"role": "assistant", "content": answer})

上面这个实现里,每次发送请求给ChatGPT时,把历史对话记录也一起发送,所以ChatGPT知道对话的上下文 。

我们来看对话效果如下:

$ python3 chatgpt2.py User: 你好ChatGPT: 你好!我是AI助手,有什么需要帮忙的吗?User: 我刚才说了什么ChatGPT: 你刚才说了 "你好"。

潜在的坑

目前通过API实现上下文对话有2个潜在的坑:

那如何解决这个问题呢?

总结

在官网和ChatGPT对话的同学可能会发现,API返回的completion结果其实没有官网的好,

chatgpt,AI,人工智能,聊天机器人,女友聊天机器人,在线ai对话,二次元聊天

通过查看官网对话的请求信息,发现普通用户(非ChatGPT Plus会员)用的模型是text-davinci-002-render-sha,而这个模型在API里无法使用 。

开源地址

想知道如何注册ChatGPT账号以及API使用教程的可以参考我的开源教程: ChatGPT模型教程 。包含ChatGPT和百度文心一言的入门和实战教程。

公众号:coding进阶。

个人网站:Jincheng’s Blog。

知乎:无忌。

福利

我为大家整理了一份后端开发学习资料礼包,包含编程语言入门到进阶知识(Go 、C++ 、Python)、后端开发技术栈 、面试题等 。

关注公众号「coding进阶」,发送消息 backend 领取资料礼包,这份资料会不定期更新,加入我觉得有价值的资料 。还可以发送消息「进群」,和同行一起交流学习,答疑解惑 。

References