当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!

这篇具有很好参考价值的文章主要介绍了当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
  • 1. 当你要求 GPT-4 帮你写点代码时
  • 2. 你需要的背景知识都在这里
    • 2.1 关于 GoPool 和 DevChat
    • 2.2 关于 GoPool 的工作原理
    • 2.3 我想要让 taskQueue 的大小可配置
  • 3. 用 Diff 视图来看 GPT-4 写的新代码
  • 4. 通过 Diff 内容让 GPT-4 总结 Commit Message
  • 5. 总结

1. 当你要求 GPT-4 帮你写点代码时

如下图所示,我希望 GPT-4 给我的项目 GoPool 添加一个小功能:

当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!

这时候 GPT-4 给出的回答如下:

--- 从这里开始 ---


  • 用户希望将任务队列的大小从固定值改为可配置的。
  • 当前的任务队列大小在 NewGoPool 函数中被硬编码为 1e6

为了实现这个需求,我们可以在 goPool 结构体中添加一个新的字段 taskQueueSize,并在 NewGoPool 函数中使用这个字段来初始化 taskQueue。同时,我们需要添加一个新的选项函数 WithTaskQueueSize 来允许用户在创建 GoPool 时设置任务队列的大小。

以下是修改后的代码:

package gopool

import (
	"context"
	"sync"
	"time"
)

// GoPool represents a pool of workers.
type GoPool interface {
	// AddTask adds a task to the pool.
	AddTask(t task)
	// Wait waits for all tasks to be dispatched and completed.
	Wait()
	// Release releases the pool and all its workers.
	Release()
	// GetRunning returns the number of running workers.
	Running() int
	// GetWorkerCount returns the number of workers.
	GetWorkerCount() int
}

// task represents a function that will be executed by a worker.
// It returns a result and an error.
type task func() (interface{}, error)

// goPool represents a pool of workers.
type goPool struct {
	workers     []*worker
	workerStack []int
	maxWorkers  int
	// Set by WithMinWorkers(), used to adjust the number of workers. Default equals to maxWorkers.
	minWorkers int
	// tasks are added to this channel first, then dispatched to workers. Default buffer size is 1 million.
	taskQueue chan task
	// Set by WithTaskQueueSize(), used to set the size of the task queue. Default is 1e6.
	taskQueueSize int
	// Set by WithRetryCount(), used to retry a task when it fails. Default is 0.
	retryCount int
	lock       sync.Locker
	cond       *sync.Cond
	// Set by WithTimeout(), used to set a timeout for a task. Default is 0, which means no timeout.
	timeout time.Duration
	// Set by WithResultCallback(), used to handle the result of a task. Default is nil.
	resultCallback func(interface{})
	// Set by WithErrorCallback(), used to handle the error of a task. Default is nil.
	errorCallback func(error)
	// adjustInterval is the interval to adjust the number of workers. Default is 1 second.
	adjustInterval time.Duration
	ctx            context.Context
	// cancel is used to cancel the context. It is called when Release() is called.
	cancel context.CancelFunc
}

// NewGoPool creates a new pool of workers.
func NewGoPool(maxWorkers int, opts ...Option) GoPool {
	ctx, cancel := context.WithCancel(context.Background())
	pool := &goPool{
		maxWorkers: maxWorkers,
		// Set minWorkers to maxWorkers by default
		minWorkers: maxWorkers,
		// workers and workerStack should be initialized after WithMinWorkers() is called
		workers:        nil,
		workerStack:    nil,
		taskQueue:      nil,
		taskQueueSize:  1e6,
		retryCount:     0,
		lock:           new(sync.Mutex),
		timeout:        0,
		adjustInterval: 1 * time.Second,
		ctx:            ctx,
		cancel:         cancel,
	}
	// Apply options
	for _, opt := range opts {
		opt(pool)
	}

	pool.taskQueue = make(chan task, pool.taskQueueSize)

	pool.workers = make([]*worker, pool.minWorkers)
	pool.workerStack = make([]int, pool.minWorkers)

	if pool.cond == nil {
		pool.cond = sync.NewCond(pool.lock)
	}
	// Create workers with the minimum number. Don't use pushWorker() here.
	for i := 0; i < pool.minWorkers; i++ {
		worker := newWorker()
		pool.workers[i] = worker
		pool.workerStack[i] = i
		worker.start(pool, i)
	}
	go pool.adjustWorkers()
	go pool.dispatch()
	return pool
}
package gopool

import (
	"sync"
	"time"
)

// Option represents an option for the pool.
type Option func(*goPool)

// WithTaskQueueSize sets the size of the task queue for the pool.
func WithTaskQueueSize(size int) Option {
	return func(p *goPool) {
		p.taskQueueSize = size
	}
}

这样,用户就可以在创建 GoPool 时通过 WithTaskQueueSize 函数来设置任务队列的大小了。例如:

pool := gopool.NewGoPool(100, gopool.WithTaskQueueSize(5000))

--- 到这里结束 ---

GPT-4 给出的第一段代码有接近100行,这就让我犯难了,我能猜到这里面只有不到10行是更新的内容,但是我怎么才能直观地看到这10行修改,然后判断这10行修改是否符合我的预期呢?我需要在100行里找出10行然后将其贴到我原先200多行的源文件中合适的位置,这听起来一点也不酷。

行,今天的故事就从“让这件事变酷”开始。

2. 你需要的背景知识都在这里

容我先介绍下 GoPool 的工作原理以及我想要添加的新功能。

2.1 关于 GoPool 和 DevChat

  1. GoPool 是一个高性能,功能完善且简单易用的 Golang worker pool 库;
  2. DevChat 是一个对接了 GPT-4 的 VS Code 辅助编程插件。

2.2 关于 GoPool 的工作原理

GoPool 大概是这样用的:

package main

import (
    "sync"
    "time"

    "github.com/devchat-ai/gopool"
)

func main() {
    pool := gopool.NewGoPool(100)
    defer pool.Release()

    for i := 0; i < 1000; i++ {
        pool.AddTask(func() (interface{}, error){
            time.Sleep(10 * time.Millisecond)
            return nil, nil
        })
    }
    pool.Wait()
}

也就是说你可以通过 GoPool 来创建一个 worker pool,然后向这个 pool 中添加任务,GoPool 会自动将任务分配给 worker 来执行。

在 GoPool 的源码中有一个 goPool 结构体,其中有2个“队列”,分别是表示 “worker 池”的 workers 和表示“任务队列”的 taskQueue

type goPool struct {
	workers     []*worker
    // ......
	// tasks are added to this channel first, then dispatched to workers. Default buffer size is 1 million.
	taskQueue chan task
    // ......
}

当调用 AddTask() 方法的时候,task 会被先加入到 taskQueue 中,然后被 dispatch() 函数取出并分配给 worker 来执行。

2.3 我想要让 taskQueue 的大小可配置

多数情况下被 AddTask() 方法添加到 taskQueue 中的 task 会被很快取出并分配给 worker 来执行,顺利的话 taskQueue 会被快速“消费”。但是如果 task 的执行时间过长,workers 很繁忙,这时候调用方又一直疯狂地“add task”的话,那么 taskQueue 就会被填满,这时候新添加的 task 就会被阻塞。

当然,阻塞本身并没有大问题,疯狂“add task”除了阻塞也没有其他办法(难道丢弃?似乎阻塞相对更合理一些)。这里的问题是如果 taskQueue 过大,会不会占用过多的内存?举个例子,如果 task 比较复杂,那么当 taskQueue 中有100万个 task 时,那么这100万个 task 就可能会占用过多的内存,这或许不是用户期望的结果。

因此我希望用户可以通过类似 WithTaskQueueSize() 的方式来设置 taskQueue 的大小,这样用户就可以根据自己的需求来灵活排队的 task 的数量了。

3. 用 Diff 视图来看 GPT-4 写的新代码

当你看到这局面的时候,是不是感觉有点迷:

当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!

这也是我们通过网页版 ChatGPT 写代码的时候会遇到的困境:怎么知道具体改了那几行?

这时我才发现 DevChat 里的 view diff 功能太好用了:

当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!

如上图,点一下“View Diff”按钮,这样就知道了 GPT-4 写的代码具体改了哪些地方了。

你还可以通过这个小箭头选择“不接受”某一处修改:

当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!

啥意思呢,就是默认情况下点击 “apply diff” 按钮会应用全部的修改,但是如果你不想应用某一处修改,那么你可以点击这个小箭头。

比如图中的场景,GPT-4 给的代码其实只包含涉及更新的一大段代码,后面还有100行没有给出来,所以直接 “apply diff” 就会导致“后面的100行被删掉”。

所以我们先点击下面这个小箭头,然后再点击 “apply diff” 就可以了:

当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!

接着你也可以通过 VS Code 的“Source Control”面板来检查下修改:

当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!

4. 通过 Diff 内容让 GPT-4 总结 Commit Message

当代码写完后,就到了最考验人的“commit message”编写环节了。别再“update”一个单词走天下了,让 GPT-4 来帮你写吧:

当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!

步骤如下:

  1. 可以用 IDE 里的 Source Control 相关插件来“Stage Changes”,也可以通过 git add 命令来手动添加修改;
  2. 然后在 DevChat 窗口里点击“+”,选择“git diff --cached”,这样就能将当前 diff 内容添加到你和 GPT-4 聊天的“上下文”里;
  3. 在 DevChat 里发送 commit_message 命令,接着就能让 GPT-4 基于当前的 diff 内容来生成 commit message 了。如下图:

当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!

最后你可以选择直接在 DevChat 窗口里完成 commit,也可以复制这段 commit message 到其他地方进一步编辑,应用:

当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!

BTW:这次我提交的代码是:Add configurable task queue size to GoPool

5. 总结

又到一天总结时,今天我们获得的新技能是:

  1. 通过 DevChat 的“View Diff”功能来查看 GPT-4 写的代码具体改了哪些地方;
  2. 将 “git diff --cached” 内容添加到 GPT-4 聊天上下文,可以让 GPT-4 基于当前的 diff 内容来生成 commit message。

打完收工。文章来源地址https://www.toymoban.com/news/detail-653238.html

到了这里,关于当 GPT-4 拥有了 Diff 视图,那真的是如虎添翼!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 探索VSCode新宠:AI小助手,让你编程如虎添翼!

    跟着这位大佬的教程来的!给VSCode插上一双AI的翅膀_文心一言 vscode-CSDN博客          在编程世界里,有一款令人兴奋的插件名为DevChat,它是程序员们最好的秘密武器!这款插件集成了多个超强大的模型,如GPT-4、GPT4.0、XINGHUO-2、CLAUDE-2、LLAMA-2-13B-CHAT等,它们都是顶尖的自

    2024年01月16日
    浏览(42)
  • Unity学会使用高级功能Attributes(特性),让您的程序如虎添翼

    在Unity中,Attributes用于增强类、字段、方法等程序元素的行为或元数据信息,这些信息可以在编辑器界面中或者通过代码反射来访问和使用。以下是如何在Unity中使用内置及自定义Attributes的示例说明: 此Attribute允许将私有变量显示在Unity Inspector中,尽管它不是public。 使Insp

    2024年02月01日
    浏览(42)
  • 推荐10大Midjourney关键词网站,让你Ai创作如虎添翼!

    为了让大家提高工作效率,本期将给大家推荐一些灵活高效Midjourney网站,这样各位就可以直接参考别人的AI进行创作了,听起来是不是很棒棒啊!其实当AI盛行后,网上Ai网站就如雨后春笋般一样出现,近期也有在试玩了下,感觉挺不错,但是想会让

    2024年02月06日
    浏览(52)
  • 有了 GPT,还需要付费咨询吗?

    之前写过一篇文章《在创业公司,我靠它续命 …》,提到现在写代码基本靠 GPT。现在这种状况不仅没有改变,反而依赖更深。公司立项开发产品的 Linux 版本,全靠我一个人。我之前虽然一直使用 Linux 开发环境,对 Linux 系统使用非常熟练,但实际上几乎没有开发过 Linux 应用

    2024年02月06日
    浏览(35)
  • 前端(八)——深入探索前端框架中的Diff算法:优化视图更新与性能提升

    😊博主:小猫娃来啦 😊文章核心: 深入探索前端框架中的Diff算法:优化视图更新与性能提升 前端框架中的diff算法是一种比较两个虚拟DOM树之间差异的算法。在更新页面时,为了提高性能,前端框架通常会先生成新的虚拟DOM树,然后通过diff算法比较新旧虚拟DOM树的差异,

    2024年02月16日
    浏览(49)
  • 一键拥有你的GPT4

    这几天我一直在帮朋友升级ChatGPT,现在已经可以闭眼操作了哈哈😝。我原本以为大家都已经用上GPT4,享受着它带来的巨大帮助时,但结果还挺让我吃惊的,还是有很多人仍苦于如何进行升级。所以就想着写篇教程来教会大家如何进行升级(主要是我懒,下次有人问的时候直

    2024年01月24日
    浏览(50)
  • 【AI】【GPT4ALL】如何拥有本地GPT以及有无可能自己训练GPT

    GPT4ALL是一款易于安装,可以连接多款自然语言模型包括GPT3.5模型,并且自带上传文件搜索功能的AI本地软件。部署后,也可以通过自己连接它的AI后台,自建前台,在公司内部自建一个AI平台。 要实现这个需要解决两个问题: 构建一套局域网UI连接本地GPT模型API的可用服务,

    2024年01月17日
    浏览(48)
  • 三分钟拥有自己的 chat-gpt (开发到上线)

    首先你需要有一个 laf 账号,如果你还不知道 laf 是什么,点击这里三分钟学会 然后你还需要有一个 chat-gpt 的账号并且生成一个 apiKey (这一步可以问 Google ) 具备了上面这两个条件我们就可以开始啦。 点击 NPM 依赖右边的加号 搜索 chatgpt 找到对应的 npm 包 保存并重启应用。 然

    2023年04月25日
    浏览(56)
  • 如何拥有自己的专属GPT-本地部署目前最强大模型llama3

    你是不是苦于没法使用ChatGPT?或者访问了ChatGPT却没法使用GPT4?现在一切问题都可以解决了! 4月18日,Meta发布两款开源Llama 3 8B与Llama 3 70B模型,供外部开发者免费使用。这个消息轰动了全球开发者。按照Meta的说法,Llama 3 8B和Llama 3 70B是目前同体量下,性能最好的开源模型。

    2024年04月26日
    浏览(49)
  • 日益强大的人工智能OpenAI ChatGPT GPT-4真的会让程序员失业吗?

    今年肯定开始看起来像人工智能起义之年,它进入所有类型的IDE软件只是时间问题。随着微软对OpenAI的至少10亿美元的巨额投资,球真正开始滚动,OpenAI是令人钦佩的强大ChatGPT,Dall-E以及人工智能和机器学习(ML)类似进展背后的公司。这是微软的一个勇敢举动,它似乎让谷

    2023年04月09日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包