• 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的一个特点。

  • 相关阅读:
    如何使用自定义Promptbooks优化您的安全工作流程
    泡泡玛特,难成“迪士尼”
    208.实现Trie(前缀树)
    2023大数据挑战赛全国六强团队获奖经验+ppt分享(四)
    数据分析—将txt文件转为csv文件;将csv文件转为xls文件
    java8 Stream应用合集
    window安装ffmpeg播放本地摄像头视频
    Python编程实例-地图数据实时可视化
    【SpringBoot】SpringBoot整合MyBatis-Plus
    谈谈IC、ASIC、SoC、MPU、MCU、CPU、GPU、DSP、FPGA、CPLD的简介
  • 原文地址:https://blog.csdn.net/shanchuan2012/article/details/132818573