Open ai 开发指南:gpt接口的第一个问答机器人demo

news2025/1/2 2:48:45

目录

内容

Python代码

C++ 代码

workspace 文件

BUILD文件

Java 代码

maven文件

执行效果


内容

基于openai接口实现循环gpt问答,并使用一个文件将问答内容进行记录。

Python代码

# -*- coding: utf-8 -*-
import openai
import time
from pathlib import Path

# Set the OpenAI API key
openai.api_key = ""

class ChatBot:
    def __init__(self, model):
        self.user = "\nYou: "
        self.bot = "GPT-3.5-turbo: "
        self.model = model
        self.question_list = []
        self.answer_list = []
        self.text = ''
        self.turns = []
        self.last_result = ''

    def save_dialogue(self):
        # Generate a timestamp and create a filename for saving the dialogue
        timestamp = time.strftime("%Y%m%d-%H%M-%S", time.localtime())  # Timestamp
        file_name = 'output/Chat_' + timestamp + '.md'  # Filename
        f = Path(file_name)
        f.parent.mkdir(parents=True, exist_ok=True)
        
        # Save the dialogue to the file
        with open(file_name, "w", encoding="utf-8") as f:
            for q, a in zip(self.question_list, self.answer_list):
                f.write(f"You: {q}\nGPT-3.5-turbo: {a}\n\n")
        print("Dialogue content saved to file: " + file_name)

    def generate(self):
        print('\nStart your conversation, type "exit" to end.')
        while True:
            question = input(self.user)
            self.question_list.append(question)
            prompt = self.bot + self.text + self.user + question
            
            if question == 'exit':
                break
            else:
                try:
                    response = openai.ChatCompletion.create(
                        model=self.model,
                        messages=[
                            {"role": "user", "content": prompt},
                        ],
                    )

                    result = response["choices"][0]["message"]["content"].strip()
                    print(result)
                    self.answer_list.append(result)

                    self.last_result = result
                    self.turns += [question] + [result]
                    
                    if len(self.turns) <= 10:
                        self.text = " ".join(self.turns)
                    else:
                        self.text = " ".join(self.turns[-10:])
                except Exception as exc:
                    print(exc)
        self.save_dialogue()

if __name__ == '__main__':
    bot = ChatBot('gpt-3.5-turbo')
    bot.generate()

在这个代码中,我们实现了一个与 GPT-3.5-turbo 模型进行对话的聊天机器人。以下是代码的执行流程:

  1. 首先,我们导入需要用到的库,包括 openai、time 和 pathlib。
  2. 我们设置 OpenAI API 密钥,以便能够调用 GPT-3.5-turbo 模型。
  3. 定义一个名为 ChatBot 的类,该类用于与 GPT-3.5-turbo 模型进行交互。
  4. 类的 __init__ 方法初始化聊天机器人,包括设定用户和机器人的提示符(self.user 和 self.bot),以及其他一些变量,如问题列表、回答列表等。
  5. save_dialogue 方法用于将聊天记录保存到文件中。这个方法首先创建一个带有时间戳的文件名,然后将问题和回答列表中的内容写入该文件。
  6. generate 方法用于与 GPT-3.5-turbo 模型进行交互。在这个方法中,我们使用一个循环来获取用户输入的问题,并将其添加到问题列表中。然后,我们构建提示并使用 OpenAI API 调用 GPT-3.5-turbo 模型。我们获取模型的回答,并将其添加到回答列表中。循环会一直进行,直到用户输入 "exit",此时循环结束,调用 save_dialogue 方法将对话内容保存到文件中。
  7. 在主函数(if __name__ == '__main__')中,我们创建一个 ChatBot 类的实例,并调用 generate 方法开始与 GPT-3.5-turbo 模型的交互。

C++ 代码

// main.cpp
#include <cpprest/http_client.h>
#include <cpprest/filestream.h>
#include <cpprest/json.h>
#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <iomanip>

using namespace utility;
using namespace web;
using namespace web::http;
using namespace web::http::client;
using namespace concurrency::streams;
namespace {
	const std::string api_key = "";
}
class ChatBot {
public:
/**
* @brief Construct a new ChatBot object
*
* @param model The OpenAI GPT model to use (e.g., "gpt-3.5-turbo")
*/
explicit ChatBot(std::string model) : model_(model) {}

/**
* @brief Save the dialogue content to a Markdown file
*
* @note This function saves the generated dialogue to a Markdown file named
* "Chat_timestamp.md" in the "output" directory.
*/
void SaveDialogue() {
    auto timestamp = std::time(nullptr);
    std::stringstream ss;
    ss << "output/Chat_" << std::put_time(std::localtime(&timestamp), "%Y%m%d-%H%M-%S") << ".md";
    std::string file_name = ss.str();

    std::ofstream out(file_name);
    if (!out) {
        std::cerr << "Could not create the output file.\n";
        return;
    }

    for (size_t i = 0; i < question_list_.size(); ++i) {
        out << "You: " << question_list_[i] << "\nGPT-3.5-turbo: " << answer_list_[i] << "\n\n";
    }
    out.close();

    std::cout << "Dialogue content saved to file: " << file_name << std::endl;
}

/**
* @brief Generate answers to the user's questions using the GPT model
*
* @note This function prompts the user for their questions, generates answers
* using the GPT model, and saves the dialogue to a file when the user exits.
*/
void Generate() {
    std::string question;
    std::cout << "\nStart your conversation, type \"exit\" to end." << std::endl;

    while (true) {
        std::cout << "\nYou: ";
        std::getline(std::cin, question);

        if (question == "exit") {
            break;
        }

        question_list_.push_back(question);

        auto answer = GetAnswer(question);
        if (!answer.empty()) {
            std::cout << "GPT-3.5-turbo: " << answer << std::endl;
            answer_list_.push_back(answer);
        }
    }

    SaveDialogue();
}

private:
/**
* @brief Get the GPT model's answer to the given question
*
* @param question The user's question
* @return The GPT model's answer as a string
*
* @note This function sends the user's question to the GPT model and
* retrieves the model's answer as a string. If an error occurs, it
* returns an empty string.
*/
std::string GetAnswer(const std::string& question) {
http_client client(U("https://api.openai.com/v1/engines/gpt-3.5-turbo/completions"));
http_request request(methods::POST);
request.headers().add("Authorization", "Bearer "+api_key);
request.headers().add("Content-Type", "application/json");

json::value body;
body[U("prompt")] = json::value::string(U("GPT-3.5-turbo: " + question));
body[U("max_tokens")] = 50;
body[U("n")] = 1;
body[U("stop")] = json::value::array({json::value::string(U("\n"))});
request.set_body(body);

try {
auto response = client.request(request).get();
auto response_body = response.extract_json().get();
auto result = response_body.at(U("choices")).as_array()[0].at(U("text")).as_string();
return utility::conversions::to_utf8string(result);
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
return "";
}
}

std::string model_;
std::vector<std::string> question_list_;
std::vector<std::string> answer_list_;
};

int main(){
ChatBot bot("gpt-3.5-turbo");
bot.Generate();
return 0;
}

因为我的最近经常在使用bazel,所以给出一个基于bazel 的C++编译方法

workspace 文件

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

# Add cpprestsdk as a dependency
http_archive(
    name = "cpprestsdk",
    build_file = "@//:cpprestsdk.BUILD",
    sha256 = "106e8a5a4f9667f329b8f277f8f25e1f2d31f1a7c7f9e1f366c5b1e3af2f8c4c",
    strip_prefix = "cpprestsdk-2.10.18",
    urls = ["https://github.com/microsoft/cpprestsdk/archive/v2.10.18.zip"],
)

BUILD文件

cc_binary(
    name = "chatbot",
    srcs = ["main.cpp"],
    deps = [
        "@cpprestsdk//:cpprest",
    ],
    linkopts = [
        # Required for cpprestsdk
        "-lboost_system",
        "-lssl",
        "-lcrypto",
    ],
)

# cpprestsdk.BUILD file content (create this file in the same directory as WORKSPACE)
'''
load("@rules_cc//cc:defs.bzl", "cc_library")

cc_library(
    name = "cpprest",
    hdrs = glob(["cpprestsdk/cpprestsdk/Release/include/**/*.h"]),
    srcs = glob([
        "cpprestsdk/cpprestsdk/Release/src/http/client/*.cpp",
        "cpprestsdk/cpprestsdk/Release/src/http/common/*.cpp",
        "cpprestsdk/cpprestsdk/Release/src/http/listener/*.cpp",
        "cpprestsdk/cpprestsdk/Release/src/json/*.cpp",
        "cpprestsdk/cpprestsdk/Release/src/pplx/*.cpp",
        "cpprestsdk/cpprestsdk/Release/src/uri/*.cpp",
        "cpprestsdk/cpprestsdk/Release/src/utilities/*.cpp",
        "cpprestsdk/cpprestsdk/Release/src/websockets/client/*.cpp",
    ]),
    includes = ["cpprestsdk/cpprestsdk/Release/include"],
    copts = ["-std=c++11"],
    linkopts = [
        "-lboost_system",
        "-lssl",
        "-lcrypto",
    ],
    visibility = ["//visibility:public"],
)
'''

Java 代码

// ChatBot.java
import okhttp3.*;
import com.google.gson.*;
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;

public class ChatBot {
    private static final String API_KEY = "your_openai_api_key_here";

    private String model;
    private ArrayList<String> questionList;
    private ArrayList<String> answerList;

    public ChatBot(String model) {
        this.model = model;
        this.questionList = new ArrayList<>();
        this.answerList = new ArrayList<>();
    }

    public void saveDialogue() {
        LocalDateTime timestamp = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd-HHmm-ss");
        String fileName = "output/Chat_" + timestamp.format(formatter) + ".md";

        try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {
            for (int i = 0; i < questionList.size(); ++i) {
                writer.write("You: " + questionList.get(i) + "\nGPT-3.5-turbo: " + answerList.get(i) + "\n\n");
            }
            System.out.println("Dialogue content saved to file: " + fileName);
        } catch (IOException e) {
            System.err.println("Could not create the output file.");
            e.printStackTrace();
        }
    }

    public void generate() {
        System.out.println("\nStart your conversation, type \"exit\" to end.");

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String question;

        while (true) {
            System.out.print("\nYou: ");
            try {
                question = reader.readLine();
            } catch (IOException e) {
                System.err.println("Error reading input.");
                e.printStackTrace();
                break;
            }

            if ("exit".equalsIgnoreCase(question)) {
                break;
            }

            questionList.add(question);
            String answer = getAnswer(question);
            if (!answer.isEmpty()) {
                System.out.println("GPT-3.5-turbo: " + answer);
                answerList.add(answer);
            }
        }

        saveDialogue();
    }

    private String getAnswer(String question) {
        OkHttpClient client = new OkHttpClient();
        Gson gson = new Gson();

        String requestBodyJson = gson.toJson(new RequestBody("GPT-3.5-turbo: " + question, 50, 1, "\n"));
        RequestBody requestBody = RequestBody.create(requestBodyJson, MediaType.parse("application/json"));

        Request request = new Request.Builder()
                .url("https://api.openai.com/v1/engines/gpt-3.5-turbo/completions")
                .addHeader("Authorization", "Bearer " + API_KEY)
                .addHeader("Content-Type", "application/json")
                .post(requestBody)
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }

            String responseBodyJson = response.body().string();
            ResponseBody responseBody = gson.fromJson(responseBodyJson, ResponseBody.class);
            return responseBody.choices.get(0).text.trim();
        } catch (IOException e) {
            System.err.println("Error: " + e.getMessage());
            e.printStackTrace();
            return "";
        }
    }

    public static void main(String[] args) {
        ChatBot bot = new ChatBot("gpt-3.5-turbo");
        bot.generate();
    }

    private static class RequestBody {
        String prompt;
        int max_tokens;
        int n;
        String stop;

        RequestBody(String prompt, int max_tokens, int n, String stop) {
            this.prompt = prompt;
            this.max_tokens = max_tokens;
            this.n = n;
            this.stop = stop;
        }
    }

    private static class ResponseBody {
        ArrayList<Choice> choices;

        private static class Choice {
            String text;
        }
    }
}

maven文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>gpt-chatbot</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.3</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.9</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>com.example.ChatBot</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

执行效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/686069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

100天精通Python(可视化篇)——第93天:Pyecharts绘制多种炫酷饼图参数说明+代码实战(百分比、环形、玫瑰、内嵌、多个子图饼图)

文章目录 专栏导读1. 基础饼图add函数简单案例改变颜色 2. 百分比饼图3. 环形饼图4. 玫瑰饼图5. 内嵌环图6. 多个饼图 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通Python从入门到就业》&#xff1a;本专栏专门针对零基础和需要进阶提升的同学所准备的一套完整…

学习前端开发,能抛弃HTML和CSS吗?

前言 前端开发里面HTML和CSS是两个非常重要的核心技术&#xff0c;它们是构建网页和应用程序界面的基础。 HTML&#xff08;超文本标记语言&#xff09;是用于描述网页结构的标记语言&#xff0c;它定义了网页的内容、布局和元素。几乎所有的网页都使用HTML来组织和呈现内容&…

5.6.3 套接字

5.6.3 套接字 我们先以示例引入套接字的基本内容&#xff0c;我们知道在邮政通信的时候我们需要在信封上写明我们的收件地址&#xff0c;比如北京市海淀区双清路30号清华大学8444号某某某收&#xff0c;这其中我们需要一个物理地址“北京市海淀区双清路30号”&#xff0c;一个…

SpringBoot 如何使用 Ehcache 作为缓存?

SpringBoot 如何使用 Ehcache 作为缓存&#xff1f; 在现代的应用程序中&#xff0c;缓存是一个非常重要的概念。缓存可以帮助我们加速应用程序的响应时间&#xff0c;减少数据库或其他服务的负载&#xff0c;并提高系统的可扩展性和容错性。Spring Framework 提供了强大的缓存…

Linux下的su指令和last指令

文章目录 1 切换用户命令&#xff08;su&#xff09;2 查看本机的所有登录记录&#xff08;last&#xff09;3 退出当前登录账户&#xff08;exit&#xff09; 1 切换用户命令&#xff08;su&#xff09; su 命令可以切换成不同的用户身份&#xff0c;命令格式如下&#xff1a…

【文本SR:轻量级:残差注意力】

A Lightweight Deep Residual Attention Network for Single Image Super Resolution &#xff08;一种用于单幅图像超分辨率的轻量级深度残差注意力网络&#xff09; 本文将稀疏编码技术应用于基于学习的文本图像超分辨率&#xff08;SR&#xff09;中&#xff0c;以提高光学…

浅析做好数据安全风险评估的重要性

一、被忽略的数据安全风险 快速问答 你知道公司内有多少数据资产吗&#xff1f; 这些数据资产中哪些数据更为重要&#xff1f; 如何保护公司数据资产&#xff0c;防止数据泄露&劫持等事件发生&#xff1f; 如果你一问三不知的话&#xff0c;也许你该好好思考数据安全这项…

数据库系统概论(三)数据库设计、数据库恢复技术、并发控制

作者的话 前言&#xff1a;总结下知识点&#xff0c;自己偶尔看一看。 一、数据库设计 数据库设计是指对于一个给定的应用环境&#xff0c;构造&#xff08;设计&#xff09;优化的数据库逻辑模式和物理结构&#xff0c;并据此建立数据库及其应用系统 1.1概述 1.1.1数据库设计…

mysql 简单定位慢查询并分析SQL执行效率

实际的日常开发工作中可能会遇到某个新功能在测试时需要很久才返回结果&#xff0c;这时就应该分析是不是慢查询导致的&#xff0c;如果确实有慢查询&#xff0c;就需要来学习怎么找到慢查询和怎么分析 SQL 执行效率&#xff1f; 定位慢 SQL 有如下两种解决方案&#xff1a; …

ClickHouse-简单了解

文章目录 前言数据库引擎数据表引擎Log 系列Integration 系列Special 系列MergeTree 系列 ClickHouse 数据类型ClickHouse 常用的函数 前言 什么是 ClickHouse&#xff1f;简单来说它是一个高性能&#xff0c;面向列的SQL数据库管理系统&#xff08;DBMS&#xff09;&#xff…

嵌入式知识分享——GDB程序调试方法说明

前 言 本指导文档适用开发环境&#xff1a; Windows开发环境&#xff1a;Windows 7 64bit、Windows 10 64bit Linux开发环境&#xff1a;Ubuntu 18.04.4 64bit 虚拟机&#xff1a;VMware15.1.0 U-Boot&#xff1a;U-Boot-2020.04 Kernel&#xff1a;Linux-5.4.70 Linux…

接口调用重放测试-业务安全测试实操(21)

接口调用重放测试。 接口调用遍历测试 接口调用重放测试 测试原理和方法 在短信、邮件调用业务或生成业务数据环节中,如短信验证码、邮件验证码、订单生成、评论提交等,对业务环节进行调用(重放) 测试。如果业务经过调用(重放) 后多次生成有效的业务或数据结果,可判断为存在…

PMP®证书增持 CSPM-2证书,哪里办理?

2023年6月起&#xff0c;持有PMP证书的朋友可以直接增持一个同等级证书CSPM-2&#xff0c;不用重新考试&#xff0c;不用重新学习&#xff0c;原PMP证书不影响正常使用&#xff0c;相当于多了一个国标项目管理领域的证书。 第一步准备资料 1、填写能力评价表 2、提供2张2寸蓝底…

在 Jetson Nano 上安装 ncnn 深度学习框架。

Install ncnn deep learning framework on a Jetson Nano. Introduction.RTTI.CMake 3.18.4.Dependencies.Benchmark.Introduction. 本页面将指导您在 Jetson Nano 上安装腾讯的 ncnn 框架。由于 ncnn 框架面向移动设备(例如 Android 手机),因此它不支持 CUDA。然而,大多数…

考虑储能的电价套利收益模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C语言笔记-1 编译过程字节数

文章目录 C 基础语法注意 C 其他知识点编译过程编译器数据模型区别32/64位机器中&#xff0c;各数据类型所占位数assert() 断言&#xff08;宏&#xff09;用法总结与注意事项 C 基础语法 注意 if(a表达式) 判断的就是a的值&#xff0c;而不是判断这个赋值操作的成功与否。 查…

项目经理告诉你,项目管理的基本原则

张伟初升为项目经理&#xff0c;正面临着职业生涯中的挑战。他意识到项目经理的责任是复杂而艰巨的&#xff0c;因此在工作中经常犯错。他发现自己的表达不够清晰&#xff0c;思维混乱&#xff1b;花费大量时间制作的文字记录重点不突出&#xff0c;缺乏逻辑。这些问题破坏了他…

韶音open fit开放式耳机怎么样?和南卡OE Pro相比哪个值得入手的呢?

最近南卡新上线了一款南卡OE Pro&#xff0c;官方宣称佩戴上0压无感&#xff0c;是音质体验最好的耳机&#xff0c;究竟有没有这么好用呢&#xff1f;正好我手头上也有了南卡OE Pro&#xff0c;试用了几天&#xff0c;那么下面我就来给大家对比一下耳机圈内这两款热门的开放式耳…

AI智能服务未来可能的场景

一、产业结构 ChatGPT大模型技术变革加速人工智能产业的变迁 1.投资热 2.产业结构&#xff1a;硬件-云平台-智能应用-应用提供 智能服务产业未来会是一个从算力到服务分发全流程的结构 二、Al智能无处不在的未来&#xff0c;产业将如何演变&#xff1f; 1.技术&#xff1a;…

【正点原子STM32连载】 第四十二章 DS18B20数字温度传感器实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第四…