• ChatGPT实践-构建简单的AI聊天机器人(python)


    本文指导如何通过调用OpenAI的API完成一个简单的聊天机器人。

    背景知识

    API介绍

    我们可以通过任何语言的 HTTP 请求、官方 Python 、 Node.js 库或社区维护的库与 ChatGPT的API 进行交互,官方API文档:

    API Reference - OpenAI API (可自行去查看)

    所以python是有现成包用的,会比调用原始的HTTP请求容易一些,python包:

    openai/openai-python: The official Python library for the OpenAI API

    本文使用Python编程语言完成一个简单的AI聊天机器人。

    一次简单的调用

    如果要调用ChatGPT的API其实非常简单,只需要几行代码,像下面这样:

    import openai
    
    openai.api_key = "替换为你的key"
    openai.api_base = "如果走绕路这里填写对应的服务商的网址"
    
    response = openai.ChatCompletion.create(
        model='gpt-3.5-turbo',
        messages=[
            {'role': 'user', 'content': 'hello.'},
        ],
        temperature=1,  # 控制模型输出的随机程度
    )
    # 打印ChatGPT的回复
    print(response.choices[0].message["content"])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行后可以看到如下打印:

    Hello! How can I assist you today?
    
    • 1

    一次调用就完成了。

    几种消息的介绍

    上面的messages参数中有一个role关键字,它有3中类型,对应3中消息,这里介绍一下:

    系统消息

    在ChatGPT的客户端聊天窗口是看不到系统消息的,这个是API中才有的,主要是给开发人员使用的。

    系统消息主要用来设置聊天机器人的角色和行为,相当于给它一些默认的指令。

    用户消息

    就是你在聊天窗口发的内容,称为「用户消息」,

    助手消息

    就是ChatGPT发给你的内容,称为「助手消息」。

    代码

    来看看一个简单的完成的AI聊天机器人的代码:

    import openai
    
    openai.api_key = "替换为你的"
    openai.api_base = "如果走绕路这里填写对应的服务的网址"
    
    def get_completion_from_messages(messages, model="gpt-3.5-turbo", temperature=0):
        response = openai.ChatCompletion.create(
            model=model,
            messages=messages,
            temperature=temperature,  # 控制模型输出的随机程度
        )
        return response.choices[0].message["content"]
    
    context = [
        # 上下文中定义一个系统角色,告诉ChatGPT他是一个友好的助手,后面的回复它都会是一个非常友好的态度
        {'role': 'system', 'content': 'You are a friendly assistant.'},
    ]
    
    def chat_to_bot(prompt):
        # 我们发送的信息角色是user
        context.append({'role': 'user', 'content': f"{prompt}"})
        response = get_completion_from_messages(context)
        # 注意这里,需要将先前的内容一并发给ChatGPT
        # ChatGPT返回回来得消息的角色是assistant
        context.append({'role': 'assistant', 'content': f"{response}"})
        return f'Bot: {response}'
    
    if __name__ == '__main__':
        while True:
            user_input = input("You: ")
            print(chat_to_bot(user_input))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    代码解释:

    • 定义了一个get_completion_from_messages函数,该函数向 OpenAI API 发送一系列消息并获取响应。 messages 参数是消息对象的列表,每个对象都有一个“角色”(可以是“系统”、“用户”或“助理”)和“内容”(消息的内容) 。 “温度”参数控制模型输出的随机性。

    • context 定义了对话的初始上下文,告诉模型它正在扮演友好助手的角色。

    • chat_to_bot此函数向聊天机器人发送消息并获取其响应。它将用户的消息和机器人的响应添加到对话上下文中,因此每次对话后都会更新上下文。

    • 主循环中,它反复要求用户输入,将该输入发送到聊天机器人,并打印聊天机器人的响应。对话无限期地继续,直到程序被手动停止。

    运行的结果是这样的:

    You: hi
    Bot: Hello! How can I assist you today?
    You: What did I say in the previous sentence?
    Bot: In the previous sentence, you said "hi".
    You:
    
    • 1
    • 2
    • 3
    • 4
    • 5

    可以看到它知道上下文,可以一直对话下去。

    注意:每一次API调用都是独立的,要让机器人理解上下文(context),那么每次API调用都需要将之前的聊天内容全部发过去。可以看到,当对话越来越长的时候,对token的消耗非常大,这是LLM的一个特点。

  • 相关阅读:
    Java实现拼图小游戏(1)—— JFrame的认识及界面搭建
    绝对保密的任务
    ISM330DHCXTR IMU-惯性测量单元 工业物联网 运动传感器
    基于虚拟机源码分析move合约(六):整数、布尔值的引用
    Effective C++改善程序与设计的55个具体做法 8. 定制new 和 delete
    数据结构与算法(C语言版)P6---队列
    Flink基础实操-计算单词出现次数
    第十九章Java绘图
    数据结构习题—链表
    Ubuntu20.04 开机卡在[OK] Started ****,无法正常开机
  • 原文地址:https://blog.csdn.net/shanchuan2012/article/details/132818573