V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
2214962083
V2EX  ›  分享创造

两个月 8 万行代码, 我是如何写出 GPT-Runner 直接对话文件和管理运行 AI 预设的

  •  5
     
  •   2214962083 · 2023-07-14 23:56:34 +08:00 · 3285 次点击
    这是一个创建于 505 天前的主题,其中的信息可能已经有所发展或是发生改变。

    WechatIMG260.png

    前言

    实时对话代码库??

    我是第一批 copilot 内测用户,早在 2021 年 11 月我就开始体验 copilot 了。在 chatgpt 出来第二天我就注册并体验了。

    可以说别人还在农耕时代我就早早地用上了蒸汽机。这让我在开发效率上获得了巨大的优势,我可以用同样的开发评估时间摸更多的鱼。

    但是我还是不满足,chatgpt 无法阅读我整个代码库,直到 chatpdf 在 2 月份横空出世,它打破了 chatgpt 上下文不足的局面。让我萌生了要把这项技术应用到我的工作中的想法。

    我开始研究他们的代码、查找资料,我发现它们用的是 embedding 方式,先把你的文件内容拆分,然后发到 openai embedding (向量化)后,再把文件内容片段和向量结果保存到向量数据库。

    当你提问时,把你的问题 embedding ,然后把 embedding 结果和向量数据库里的向量进行比较,找到最相似的向量,然后把这个向量对应的文件内容片段返回给 openai ,让 openai 根据这个片段和你的问题生成答案。

    这样就可以实现 “无限” 的上下文了。但是效果并不理想,因为语义向量片段只对文章之类效果好(勉强),代码压根就不行。

    我还是保持复制文件内容,然后去 chatgpt 问的方式,虽然傻,但是效果好。

    复制粘贴是一件反人类的事,我想,如果我能把这个过程自动化,那就好了。这个想法在我脑海诞生。

    Prompt Storybook ??

    我在新的公司里试图把 AI 工作流标准化,我阅读了大量的 prompt 教程,我为项目量身写了一些 prompt 放到 txt 文件里并用 git 进行管理。

    我告诉队友在写组件或单元测试时 copy 我的 prompt 提问会更精准。

    事实也的确如此,因为 prompt 里有说了我们的项目架构和依赖,还有一些例子给 AI 。

    但是这样的工作流还是不够优雅,我想,有没有类似 storybook 这样的工具,可以直接管理并运行项目里的 prompt 呢?

    虽然有,但是他们都是 APP 形式或者要本地部署 web ,无法标准化,比如一条命令就可以运行,或者可以直接在 IDE 里运行。

    我想,我可以自己写一个,对 vscode 和 jetbrains 系列 IDE 进行支持,对其他 IDE 提供 cli 快速启动 web 的 AI 预设 storybook ,这样就可以把 AI 工作流标准化了。

    开始

    架构:我需要同时提供 cli/vscode/web/jetrains (未来) 三种方式,cli 方式可以快速启动 web ,vscode 方式可以直接在 vscode 里运行,web 方式让没有适配该 IDE 的人也可以使用。

    我还需要后端,因为很多文件操作都无法在 web 端完成。

    因此,我徒手用 express + langchian + react + vite + ts 写了一个完整的项目,通过 web window 开放配置介入 vscode 扩展 webview 。

    期间我重构了很多次功能和 ui ,改到我用得顺手为主,这个 GPT-Runner 只有一个目标,就是提升我的效率!让我有更多摸鱼时间!

    经过两个月下班时间打磨,我终于在今天完成了它:https://github.com/nicepkg/gpt-runner

    功能

    勾选文件向 AI 提需求

    GPT Runner 的主要功能是什么呢?它可以让你直接与你选中的多个代码文件进行提问,提需求给 AI ,提 bug 给 AI ,让 AI 替你完成。

    它不是 embedding ,我实测测效果非常好,我本地也装了很多其他的 vscode ai 扩展,它们并没有这个功能,ui 也远不及我的 GPT-runner ,我现在只会用 copilot 和 GPT-runner 。

    它最核心的是管理你的 AI 预设 ( xxx.gpt.md 文件),你可以在项目中创建一些 AI 预设文件,这些文件可以包含一些系统提示、用户提示以及一些 AI 参数,比如模型名称、温度等。

    WechatIMG300.jpeg

    让我为你介绍一下我的 AI 工作流

    比如开发人员 A 写了一份 AI 预设专门根据这个项目的 class 生成单元测试,用它生成的结果代码接近 70% 可用。他把它用 git 推上去了。

    开发人员 B 在写单元测试时,他只需要在 GPT Runner 里选择这个 AI 预设,然后选中他要测试的 class ,然后问 AI 生成单元测试,AI 就会根据这个 class 生成单元测试。

    突然开发人员 B 发现这份 AI 预设提示词缺少了一些关键词,他就在 AI 预设文件里添加了一些关键词,这份 AI 预设生成的单元测试就更加准确了。达到了 80% 代码可用。

    随着不断的迭代,这份 AI 预设生成的单元测试无限接近 100% 代码可用。

    这份 AI 预设无疑是非常具用价值的新时代代码 ! Prompt Engineer!

    image.png

    其他功能

    1. 响应式 UI ,在不同宽度布局下都做了精心调整。侧边栏和输入框都可以拖拽调整宽高。
    2. 输入框是 vscode 同款 monaco-editor 编辑器。你可以代码高亮编辑问题。
    3. 在 vscode 扩展里它能感知你正在编辑的文件和选中的文本,根据这些内容给你作答。
    4. 可以通过局域网分享 web 链接给队友用,放心,ai key 是私密的,他们看不到。
    5. cli 还自带内网穿透分享功能,可以远程分享你的 gpt-runner web 给对方用,具体自己探索。
    6. 同时支持 openai 和 anthropic ( claude ),未来还会支持更多
    7. 多语言多主题。
    8. 实时估算 Token (为了提高估算速度降低了精度),右上角有当前 token 数。
    9. 我强烈建议你看完 README 视频。

    WechatIMG254.png

    大白菜 2023-07-07 23.49.17.jpeg

    安装

    GPT Runner 的安装也非常简单,如果你有 VSCode 的话,你只需要在扩展商店搜索 GPT Runner ,然后安装就可以了。

    如果你没有 VSCode ,你也可以通过安装 nodejs ( >= 16.15.0 ),去到你的项目目录然后执行 npx gptr 来运行就行。第一次要下载资源会比较慢。

    Jetrains 系 IDE 请等待后续支持。

    WechatIMG297.png

    后续

    你可以去 https://github.com/nicepkg/gpt-runner/blob/main/docs/gpt-config.cn.md 查看 AI 预设配置规范。

    可以的话帮忙点一下 Github star 收藏一下,摸鱼效率神器,至少这个工具我自己喜欢用,我相信你也会喜欢的。

    31 条回复    2023-07-18 19:59:58 +08:00
    anjingdexiaocai
        1
    anjingdexiaocai  
       2023-07-15 00:15:31 +08:00 via Android
    不明觉厉,牛
    Pernalin
        2
    Pernalin  
       2023-07-15 00:42:51 +08:00 via Android
    感觉很棒,等上班时试试看
    huntzhan
        3
    huntzhan  
       2023-07-15 00:45:37 +08:00
    恭喜。不过比较好奇,为什么会有八万行代码的规模,主要的复杂度在哪?
    2214962083
        4
    2214962083  
    OP
       2023-07-15 00:59:30 +08:00
    @huntzhan 我是使用 git ls-files | xargs cat | wc -l 统计,可能把一些无关文件统计进来了,但是抛开这个整体代码量还是非常大的,60% 在 packages/gpt-runner-web 包,ui 细节逻辑占据了很多代码,除此之外还有 shared 包存放着很多类型和 utils ,横夸浏览器、node 环境,这个项目同时具备了 browser 、node 、vscode 、cli 代码
    thet
        5
    thet  
       2023-07-15 01:06:56 +08:00
    我艹,牛啊,试试看
    amlee
        6
    amlee  
       2023-07-15 01:13:54 +08:00
    看起来很牛逼,我必须忍住尝试的冲动,先 star ,等小白鼠先体验
    huntzhan
        7
    huntzhan  
       2023-07-15 01:17:31 +08:00
    akira
        8
    akira  
       2023-07-15 01:56:36 +08:00
    先留言 mark 一下,看起来终于有个不错的实战经验可以学习了
    vmlinz
        9
    vmlinz  
       2023-07-15 06:00:07 +08:00 via iPhone
    非常感谢,正在找更多 ai 应用的实例。
    a4526047
        10
    a4526047  
       2023-07-15 08:10:12 +08:00 via iPhone
    Mark,等支持 idea 试试
    yafoo
        11
    yafoo  
       2023-07-15 09:07:42 +08:00 via Android
    logo 为啥少个字母 r ?
    Jirajine
        12
    Jirajine  
       2023-07-15 09:28:24 +08:00
    我使用 GPT 最大的感受就是就经常给出错误信息,调试 GPT 生成的错误代码比自己写还麻烦,可能是缺乏 prompt engineering 的原因吧。
    subframe75361
        13
    subframe75361  
       2023-07-15 10:51:01 +08:00
    很棒的应用❤️

    顺带一提,能否支持自定义 baseurl ?
    2214962083
        14
    2214962083  
    OP
       2023-07-15 11:07:42 +08:00
    @yafoo ai logo 生成的,当时没注意,我决定将 R 不见解释为 Robot run 了
    2214962083
        15
    2214962083  
    OP
       2023-07-15 11:08:15 +08:00   ❤️ 1
    @subframe75361 支持的,而且还支持 claude
    chenY520
        16
    chenY520  
       2023-07-15 11:40:32 +08:00 via iPhone
    大佬真牛啊
    simo
        17
    simo  
       2023-07-15 19:49:19 +08:00
    咋这么优秀捏!
    ruoxie
        18
    ruoxie  
       2023-07-15 20:11:53 +08:00
    预设 System Prompt 用处大不大呢,我写的插件支持预设 User Prompt ,ChatGPT 的回答真的是一言难尽
    看这个图就知道 https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c30eede4784e4f81a61102c3e85ed06c~tplv-k3u1fbpfcp-zoom-1.image
    prompt:
    <%- rawSelectedText || rawClipboardText %>
    将这段 typescript 类型的中文字段翻译为英文,驼峰格式,使用中文注释字段,返回 markdown 代码块
    ruoxie
        19
    ruoxie  
       2023-07-15 20:21:06 +08:00
    接上
    2214962083
        20
    2214962083  
    OP
       2023-07-15 21:46:57 +08:00
    @ruoxie 假如队友用的是其它 ide 呢? prompt storybook 的意义是标准化,不管你用什么 ide 都能运行这个 prompt
    2214962083
        21
    2214962083  
    OP
       2023-07-15 21:48:54 +08:00
    @ruoxie 再加一句,我说的这个 AI 预设文件是指可以长篇大论的 prompt 文件(还包含温度、topP 、模型名字),能纳入版本管理的,易于阅读维护
    2214962083
        22
    2214962083  
    OP
       2023-07-15 21:51:33 +08:00
    @ruoxie 关于你说的 System prompt 用处不大,我不认可,System prompt 的权重比 user prompt 大,而且 user prompt 容易多轮对话遗忘,而 System prompt 会一直被 ai 遵守
    ruoxie
        23
    ruoxie  
       2023-07-15 21:58:38 +08:00
    麻烦看清楚我的评论,ok?
    2214962083
        24
    2214962083  
    OP
       2023-07-15 22:00:19 +08:00
    @ruoxie 我想我看清楚并回复你了。
    ruoxie
        25
    ruoxie  
       2023-07-15 22:03:33 +08:00
    我就是想问预设 System Prompt 用处大不大,因为我自己写的插件不支持预设 System Prompt ,导致 ChatGPT 的回答一言难尽。结果劈头盖脸来给我强调你写的东西有多么厉害
    2214962083
        26
    2214962083  
    OP
       2023-07-15 22:06:12 +08:00
    @ruoxie 抱歉我刚刚在喝酒,用手机 pc 版看,我看成了不大,而不是大不大。我为我的评论抱歉。System prompt 是非常有用的,它是针对第三方公司定制建立自己的 robot 所做的特别参数,AI 会严格遵守 system prompt 的规则要求。
    ruoxie
        27
    ruoxie  
       2023-07-15 22:13:11 +08:00
    @2214962083 没事
    DjvuLee
        28
    DjvuLee  
       2023-07-17 10:37:03 +08:00
    挺有意思的,这些 Prompts 是用的作者之前理解积累的一些?比如单元测试等等。
    如果是自己要添加,如何进行?现在 prompt engine 的一个问题是没有很好的 style guide ,合作的时候其他人写的如何保证比较好的 style 。
    2214962083
        29
    2214962083  
    OP
       2023-07-18 02:28:12 +08:00
    @DjvuLee 我们将会开一个 ai 预设仓库,细分化 ai 预设,专门面向向发者。比如前端>vue 专用 ai 预设,后端>java>springboot 专用 ai 预设,让所有开发者参与贡献,一起前人栽树
    izzy27
        30
    izzy27  
       2023-07-18 12:58:12 +08:00
    期待 Jetrains 的上线
    huiyanpohundh123
        31
    huiyanpohundh123  
       2023-07-18 19:59:58 +08:00
    厉害
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2861 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 12:33 · PVG 20:33 · LAX 04:33 · JFK 07:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.