首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >ChatGPT快速软件工程

ChatGPT快速软件工程

作者头像
yeedomliu
发布2023-09-03 13:20:45
发布2023-09-03 13:20:45
4800
举报
文章被收录于专栏:yeedomliuyeedomliu

思维导图

利用ChatGPT提升产值并升级价值链

  1. 在一分钟内编写一个正则表达式验证函数,而不是花费2个小时的时间。
  2. 真正的高层次价值在于系统的设计和架构。当前的ChatGPT在这方面并不擅长。
  3. 不会受限于任何平台或专有技术。
  4. ChatGPT本身非常擅长编写独立的或小规模的软件功能。您需要一个完整规模的软件应用、网站或服务。

设置环境

安装

代码语言:javascript
复制
$ pip install openai$ pip install python-dotenv$ pip install gradio

python-dotenv库将用于安全地存储OpenAI API密钥,而不需要直接将其插入到代码中。代码将从环境文件中读取API密钥。

gradio库是一个非常有用的库,可以基于Python函数快速创建Web界面。

创建OpenAI账户

代码语言:javascript
复制
import openaiimport osfrom dotenv import load_dotenvload_dotenv()openai.api_key = os.getenv("OPENAI_API_KEY")def generate_code(prompt, temperature=0.5, max_tokens=256):    response = openai.Completion.create(engine="text-davinci-003", prompt=prompt, max_tokens=max_tokens,                                        temperature=temperature)    return response.choices[0].text.strip()prompt = (    "编写一个python函数,该函数以字符串作为输入,并返回字符串中字母元音的计数")code = generate_code(prompt)print(code)

安装插件

现在你可以在编辑器中右键单击,然后选择CodeGPT | Ask ChatGPT选项。这允许你像在Web界面上一样向ChatGPT提出一般性的查询。然而,你还可以选择代码的部分,右键单击以进行上下文敏感的ChatGPT调用。

组件架构

在线测验应用程序

计算数字列表统计值

代码语言:javascript
复制
import statisticsdef calculate_stats(numbers):    """    计算数字列表的平均值、中位数和标准差。    参数: numbers(list):数字列表。    返回: tuple:包含平均值、中位数和标准差的元组。    """    # 计算平均值    avg = sum(numbers) / len(numbers)    # 计算中位数    median = statistics.median(numbers)    # 计算标准差    stdev = statistics.stdev(numbers)    return avg, median, stdevnumbers = [1, 2, 3, 4, 5]avg, median, stdev = calculate_stats(numbers)print(f"平均值: {avg}")print(f"中位数: {median}")print(f"标准差: {stdev}")

创建干净、复用的代码

生成了一个用于保存输出值的类SummaryStatistics.py

代码语言:javascript
复制
import statisticsclass SummaryStatistics:    def __init__(self, lst):        if len(lst) < 2:  # 只有一个元素的情况            self.average = None            self.median = lst[0] if lst else None            self.stdev = None        else:            self.average = sum(lst) / len(lst)            self.median = statistics.median(lst)            self.stdev = statistics.stdev(lst)

编写单元测试test_summary_statistics.py

代码语言:javascript
复制
import unittestimport statisticsfrom SummaryStatistics import SummaryStatisticsclass TestSummaryStatistics(unittest.TestCase):    def setUp(self):        self.data = [1, 2, 3, 4, 5]        self.stats = SummaryStatistics(self.data)    def test_average(self):        self.assertEqual(self.stats.average, statistics.mean(self.data))    def test_median(self):        self.assertEqual(self.stats.median, statistics.median(self.data))    def test_stdev(self):        self.assertAlmostEqual(self.stats.stdev, statistics.stdev(self.data), places=2)    def test_single_element(self):        single_data = [6]  # 创建只包含一个元素的列表        single_stats = SummaryStatistics(single_data)  # 使用单个元素数据创建SummaryStatistics实例        if len(single_data) < 2:            self.assertIsNone(single_stats.stdev)  # 断言当只有一个元素时,stdev为None        else:            self.assertEqual(single_stats.stdev, statistics.stdev(single_data))  # 断言多个元素的标准差    def test_empty_list(self):        empty_data = []  # 创建一个空列表        empty_stats = SummaryStatistics(empty_data)  # 使用空列表创建SummaryStatistics实例        if len(empty_data) == 0:            self.assertIsNone(empty_stats.average)  # 断言空列表的平均值为None            self.assertIsNone(empty_stats.median)  # 断言空列表的中位数为None            self.assertIsNone(empty_stats.stdev)  # 断言空列表的标准差为Noneif __name__ == '__main__':    unittest.main()

注重需求

标准差用于表示整个群体的偏离程度。小的标准差意味着数字围绕平均值密集地聚集在一起。大的标准差意味着数字与平均值更分散。

  1. 68% 的人口在 1 个标准差内
  2. 95% 的人口在 2 个标准差内
  3. 99.7% 的人口在 3 个标准差内

两种使用标准差的方法

  1. 当你拥有整个人口的数据时,可以使用总体标准差。总体标准差的公式是从平均值偏离的平方和的平方根,除以观测值的总数。
  2. 当你有一个样本数据来估计总体的标准差时,可以使用样本标准差。样本标准差的公式与总体标准差类似,只是分母是样本的大小减去一,而不是观测值的总数。

样本标准差往往略大于总体标准差,因为它考虑到我们在处理样本而不是整个人口时信息更少的事实。这两种方法在统计学中广泛使用,并可以为数据集的分散程度和变异性提供有益的见解。

创建更复杂函数

calculate_grade_curve.py

代码语言:javascript
复制
import statisticsdef calculate_grade_curve(scores):    # 计算平均分    avg_score = sum(scores) / len(scores)    # 为每个字母等级定义分数范围    a_range = (avg_score + 1.5 * statistics.stdev(scores), float('inf'))    b_range = (avg_score + 0.5 * statistics.stdev(scores), avg_score + 1.5 * statistics.stdev(scores))    c_range = (avg_score - 0.5 * statistics.stdev(scores), avg_score + 0.5 * statistics.stdev(scores))    d_range = (avg_score - 1.5 * statistics.stdev(scores), avg_score - 0.5 * statistics.stdev(scores))    f_range = (float('-inf'), avg_score - 1.5 * statistics.stdev(scores))    # 创建一个包含每个字母等级分数范围的字典    grade_ranges = {        "A": a_range,        "B": b_range,        "C": c_range,        "D": d_range,        "F": f_range    }    return grade_rangesscores = [70, 85, 90, 92, 95, 98, 100]grade_ranges = calculate_grade_curve(scores)print(grade_ranges)

输出结果

代码语言:javascript
复制
{'A': (105.22333734763833, inf), 'B': (95.0744457825461, 105.22333734763833), 'C': (84.9255542174539, 95.0744457825461), 'D': (74.77666265236167, 84.9255542174539), 'F': (-inf, 74.77666265236167)}

使用的算法是基于标准偏差离平均分的分数区间。然而,这个实现存在问题。首先要注意的是A等级的范围实际上从100以上开始和结束,而100是可能的最高分。在这个数据集中,样本分数都相当高,然而,对一个测验得到90分以上而没有得到A等级的学生来说,这似乎并不公平。

重新缩放或调整分数是一种将测试分数调整到100点制上反映整个班级表现的技术。基本上,这涉及将最高分数转换为100分,然后相应地调整所有其他分数。

因此,创建一个分级曲线的简单方法是将每个分数增加到将最高分数提升到100所需的量。

SG = OG * 100/MG

  1. SG = 缩放后的分级
  2. OG = 原始分数
  3. MG = 任何学生的最高分数。
代码语言:javascript
复制
import statisticsdef grading_curve(test_scores):    # 计算列表中的最高分    max_score = max(test_scores)    # 计算缩放后的成绩和字母等级    grades = []    for score in test_scores:        scaled_grade = score * 100 / max_score        if scaled_grade >= 90:            letter_grade = 'A'        elif scaled_grade >= 80:            letter_grade = 'B'        elif scaled_grade >= 70:            letter_grade = 'C'        elif scaled_grade >= 60:            letter_grade = 'D'        else:            letter_grade = 'F'        grades.append((scaled_grade, letter_grade))    # 定义每个字母等级的分数范围    grade_ranges = {'A': (90, 100),                    'B': (80, 89),                    'C': (70, 79),                    'D': (60, 69),                    'F': (0, 59)}    # 计算每个字母等级范围内的学生人数    grade_counts = {grade: len([sg for sg, lg in grades if rg[0] <= sg <= rg[1]]) for grade, rg in grade_ranges.items()}    # 计算每个字母等级范围内学生的百分比    total_students = len(grades)    grade_percentages = {grade: count * 100 / total_students for grade, count in grade_counts.items()}    # 将成绩、分数范围和百分比作为字典返回    return {'Grades': grades,            'Grade Percentages': grade_percentages}test_scores = [70, 81, 90, 72, 85, 92, 67]print(grading_curve(test_scores))print(grade_ranges)

输出

代码语言:javascript
复制
{	'Grades': [(76.08695652173913, 'C'), (88.04347826086956, 'B'), (97.82608695652173, 'A'), (78.26086956521739, 'C'), (92.3913043478261, 'A'), (100.0, 'A'), (72.82608695652173, 'C')],	'Grade Percentages': {		'A': 42.857142857142854,		'B': 14.285714285714286,		'C': 42.857142857142854,		'D': 0.0,		'F': 0.0	}}

可能这样看并不明显,编写分数对应曲线等级表

代码语言:javascript
复制
import statisticsdef calculate_grade_curve(scores):    # 计算平均分    avg_score = sum(scores) / len(scores)    # 为每个字母等级定义分数范围    a_range = (avg_score + 1.5 * statistics.stdev(scores), float('inf'))    b_range = (avg_score + 0.5 * statistics.stdev(scores), avg_score + 1.5 * statistics.stdev(scores))    c_range = (avg_score - 0.5 * statistics.stdev(scores), avg_score + 0.5 * statistics.stdev(scores))    d_range = (avg_score - 1.5 * statistics.stdev(scores), avg_score - 0.5 * statistics.stdev(scores))    f_range = (float('-inf'), avg_score - 1.5 * statistics.stdev(scores))    # 创建一个包含每个字母等级分数范围的字典    grade_ranges = {        "A": a_range,        "B": b_range,        "C": c_range,        "D": d_range,        "F": f_range    }    return grade_rangesdef grading_curve(test_scores):    # 计算列表中的最高分    max_score = max(test_scores)    # 计算缩放后的成绩和字母等级    grades = []    for score in test_scores:        scaled_grade = score * 100 / max_score        if scaled_grade >= 90:            letter_grade = 'A'        elif scaled_grade >= 80:            letter_grade = 'B'        elif scaled_grade >= 70:            letter_grade = 'C'        elif scaled_grade >= 60:            letter_grade = 'D'        else:            letter_grade = 'F'        grades.append((scaled_grade, letter_grade))    # 定义每个字母等级的分数范围    grade_ranges = {'A': (90, 100),                    'B': (80, 89),                    'C': (70, 79),                    'D': (60, 69),                    'F': (0, 59)}    # 计算每个字母等级范围内的学生人数    grade_counts = {grade: len([sg for sg, lg in grades if rg[0] <= sg <= rg[1]]) for grade, rg in grade_ranges.items()}    # 计算每个字母等级范围内学生的百分比    total_students = len(grades)    grade_percentages = {grade: count * 100 / total_students for grade, count in grade_counts.items()}    # 将成绩、分数范围和百分比作为字典返回    return {'Grades': grades,            'Grade Percentages': grade_percentages}def display_grades(test_scores, grades):    if not grades:        print("No grades available")        return    if len(grades["Grades"]) != len(test_scores):        print("Number of grades does not match number of test scores")        return    # Print the header row of the table    print(f"{'Test Score':<12} {'Curved Score':<15} {'Letter Grade':<12}")    # Print each row of the table    for i, score in enumerate(test_scores):        curved_score, letter_grade = grades["Grades"][i][0], grades["Grades"][i][1]        print(f"{score:<12} {curved_score:<15.2f} {letter_grade:<12}")test_scores = [75, 88, 92, 60, 81, 70, 85, 76, 90]grade_data = grading_curve(test_scores)display_grades(test_scores, grade_data)

输出

代码语言:javascript
复制
Test Score   Curved Score    Letter Grade75           81.52           B           88           95.65           A           92           100.00          A           60           65.22           D           81           88.04           B           70           76.09           C           85           92.39           A           76           82.61           B           90           97.83           A   

使用matplotlib、gradio库绘制图形

代码语言:javascript
复制
$ python calculate_grade_curve.py Running on local URL:  http://127.0.0.1:7860

使用ChatGPT 生成问答

我们希望数据以结构化格式进行创建。明确指定所需的输出格式。

将您的响应格式化为JSON列表。

JSON列表中的每个对象应采用以下格式: {"Question": ..., "A": ..., "B": ..., "C": ..., "D": ..., "Answer": ..., }

代码语言:javascript
复制
import openaiimport osfrom dotenv import load_dotenvload_dotenv()def generate_trivia_questions(topic):    # 设置 OpenAI API 密钥    openai.api_key = os.getenv("OPENAI_API_KEY")    # 定义提示生成旗题的问题    prompt = """Generate two trivia questions on the topic of U.S. Presidents.    For each question, provide four possible answers labeled A, B, C, and D, and indicate which is the correct answer.    Format your response as a JSON list.    Each object in the JSON list should have the format:    {"Question": ..., "A": ..., "B": ..., "C": ..., "D": ..., "Answer": ..., }"""    # 使用ChatGPT生成问题和答案    response = openai.Completion.create(        engine="text-davinci-003",        prompt=prompt,        max_tokens=1024,        temperature=0.7,    )    return response.choices[0].textquiz_topic = "U.S. Presidents"questions = generate_trivia_questions(quiz_topic)print(questions)

数据库开发

代码语言:javascript
复制
import sqlite3# 连接数据库conn = sqlite3.connect('db.sqlite3')# 创建一个游标对象来与数据库交互c = conn.cursor()# 创建一个表格c.execute('''CREATE TABLE quiz(id TEXT PRIMARY KEY,name TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')# 保存更改conn.commit()

创建 quiz 表并添加一条记录

代码语言:javascript
复制
$ sqlite3 db.sqlite3SQLite version 3.40.1 2022-12-28 14:03:47Enter ".help" for usage hints.sqlite> .tablesquizsqlite> .schemaCREATE TABLE quiz(id TEXT PRIMARY KEY,name TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);sqlite> insert into quiz values ('1', 'Test Quiz', time());
代码语言:javascript
复制
$ sqlite3 quizdb.sqliteSQLite version 3.40.1 2022-12-28 14:03:47Enter ".help" for usage hints.sqlite> CREATE TABLE questions (    question_id TEXT PRIMARY KEY,    question_text TEXT NOT NULL,    option_a TEXT NOT NULL,    option_b TEXT NOT NULL,    option_c TEXT NOT NULL,    option_d TEXT NOT NULL,    correct_answer TEXT NOT NULL,    quiz_id INTEGER NOT NULL,    FOREIGN KEY (quiz_id) REFERENCES quiz(id));sqlite> .tablesquestions

Python数据访问对象

get_quiz_list.py

代码语言:javascript
复制
import sqlite3class Quiz:    def __init__(self, id, name, created_at):        self.id = id        self.name = name        self.created_at = created_atdef get_quiz_list():    conn = sqlite3.connect('db.sqlite3')    c = conn.cursor()    c.execute("SELECT * FROM quiz")    rows = c.fetchall()    quiz_data = []    for row in rows:        quiz = Quiz(row[0], row[1], row[2])        quiz_data.append(quiz)    conn.close()    return quiz_data
代码语言:javascript
复制
from get_quiz_list import get_quiz_listquizzes = get_quiz_list()for quiz in quizzes:    print(vars(quiz))

输出结果

代码语言:javascript
复制
{'id': '1', 'name': 'Test Quiz', 'created_at': '12:09:03'}

使用Bottle Web 框架

代码语言:javascript
复制
$ pip install bottle

app.py

代码语言:javascript
复制
# app.pyfrom bottle import Bottle, run# Create a Bottle app instanceapp = Bottle()# Define a route handler for the root URL@app.route('/')def hello():    return "Hello, World!"# Run the Bottle appif __name__ == '__main__':    run(app, host='localhost', port=8080, debug=True)
代码语言:javascript
复制
$ python app.pyBottle v0.12.25 server starting up (using WSGIRefServer())...Listening on http://localhost:8080/Hit Ctrl-C to quit.127.0.0.1 - - [11/Jul/2023 08:02:37] "GET / HTTP/1.1" 200 13127.0.0.1 - - [11/Jul/2023 08:02:37] "GET /favicon.ico HTTP/1.1" 404 742

创建聊天机器人

  1. ChatGPT在这些应用中的上下文是消息的历史记录。它需要的不仅仅是用户输入的最后一条语句。
  2. 在编码任务中我们使用davinci OpenAI模型
  3. 在聊天应用中,角色的概念很重要。用户、助手和系统。(给助手提供的额外指示或指导)
代码语言:javascript
复制
import openaiimport osimport gradio as grfrom dotenv import load_dotenvload_dotenv()openai.api_key = os.getenv("OPENAI_API_KEY")messages = [    {"role": "system",     "content": "您是一位有帮助的AI助手,可以讨论日常话题。"},]def chatbot(input):    if input:        messages.append({"role": "user", "content": input})        chat = openai.ChatCompletion.create(            model="gpt-3.5-turbo",            message=messages        )        reply = chat.choices[0].message.content        messages.append({"role": "assistant", "content": reply})        return replyinputs = gr.inputs.Textbox(lines=7, label="Talk to me")outputs = gr.outputs.Textbox(label="Reply")gr.Interface(fn=chatbot,             inputs=inputs,             outputs=outputs,             title="Your friendly AI Chatbot",             description="We can talk about whatever you like",             theme="compact").launch(share=True)
代码语言:javascript
复制
$ python chatbot.pyRunning on local URL:  http://127.0.0.1:7861Running on public URL: https://91525be2a5899eb91c.gradio.live
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yeedomliu 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思维导图
  • 利用ChatGPT提升产值并升级价值链
  • 设置环境
    • 安装
    • 创建OpenAI账户
    • 安装插件
  • 组件架构
    • 在线测验应用程序
    • 计算数字列表统计值
    • 创建干净、复用的代码
    • 注重需求
    • 创建更复杂函数
  • 使用matplotlib、gradio库绘制图形
  • 使用ChatGPT 生成问答
  • 数据库开发
  • Python数据访问对象
  • 使用Bottle Web 框架
  • 创建聊天机器人
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档