普通视图

发现新文章,点击刷新页面。
昨天以前Xieisabug

产品职业随想

作者 xiejingyang
2025年3月24日 13:58

随着干产品这个职业的深入,发现这个职业对于聪明要求的上线真是无限高,最近这段时间的几个感触记录一下:

  1. 产品经理最好是有一定的增长能力,把增长能力转化为设计的功能点做到产品里,比如了解当前的主流叙事和“流量密码”,把这些东西快速的融入到产品中,方便增长。这一点大部分的老板都比较敏感,通常有“流量密码”出来的时候老板总是第一时间希望能够在产品中添加,以蹭到这波流量,但老板的产品设计能力较弱,通常容易出现非常突兀的融合。
  2. 能把握到科技的发展,尤其是在现在 AI 发展速度爆炸的现在,仅仅设计一款利用到现有科技力量的产品是远远不够的,要能设计出随着领先与科技发展的产品,随着科技发展而得到提高。最火的例子就是 Cursor 了,模型越来越强,让 Cursor 从不好用变成了神器。
  3. 要有一定的非共识,有非共识的产品才能脱颖而出,否则就是靠资源堆砌的普通产品,随时可以被以更多资源堆砌的另一个产品替代。
  4. 接着上面的非共识,我举个我自己领悟到的:免费用户(或者说弱用户)应该被作为产品的资源和能力,来融入产品的设计。著名的设计比如网游的氪金机制、排行榜机制等。

工具-Copilot 的更新

作者 xiejingyang
2025年3月7日 18:19

最近从 Windsurf 切回 Cursor 又切回 Copilot 了,一是对 AI 越来越了解,交给 AI 的活越来越多,导致积分制的 AI 根本不够用,二是 Copilot 现在也上了御三家所有的前沿模型想要试试,三是我一直有 Copilot 的资格只是之前嫌弃它。

首先说感受,我觉得我不用买 Cursor 了(不代表别人不用)。

他目前更新了以下几个方面,我觉得完全可以平替 Cursor,然后不限量的这个特点又非常适合我。

Tab Tab

TabTab 是我一直以来觉得 Copilot 被吊打的部分,现在 Copilot 也有多次 Tab 提示了,和 Cursor 体验有一点差距,主要是速度不如 Cursor,但是当个代餐其实够了。

Agent

和 Cursor 的 YOLO(You only look once) 一样,会根据要求自动的去完成任务,发现不能理解的地方也会自动去阅读代码,会规划任务并且一步步的去执行和更新任务状态。碰到要执行命令的情况,也会弹出提示要求授权执行,命令碰到报错还会自动解决。

并发更新

这是今天发现的,他在编辑代码文件的时候,并发编辑了好几个文件:

29 个文件大概十几秒就改完了,以前用大模型来编辑代码基本上就是我的尿点,三四个文件的编辑就要花上几分钟了,现在感觉无尿点了(当然咯,可以看到我的修改确实也很简单,就几行代码需要修改)。

模型的选择

这个还是挺重要的,能用最好的模型对于代码质量是最好的保障,不过 Copilot 的模型应该不是最高算力,或者被内置提示词影响了,但是绝对是没有掺假(我用智力提测试过了 o1 和 o3):

内置了 Code Review 和 Commit Message 生成

这个好像别的编辑器也有,不过 Copilot 这个不限量用起来没啥负担,我几乎是每次提交前都会让 AI Code Review 下。

还有什么你觉得 Cursor 是无法替代的?

日常-AI 帮我解决了Cloudflare Worker 和阿里云 SDK 的小坑

作者 xiejingyang
2025年3月5日 16:10

最近有个小玩具要做,想要能够通过授权链接来给公司的阿里云服务器添加白名单。最开始想到这个事情的时候,就决定用 Cloudflare 的 Worker 或者 Pages 来做,因为开发方便,又不需要自己搞服务器来部署服务端和数据库。也因此踩了个小坑,特此记录。

首先我选择了 Pages,因为可以加前端页面,前后端都写到一个项目里,反正是个小玩具。前端不赘述了,用 Cursor 直接简单描述一下就能生成,包含登录页和功能页两个页面,用 Pages 提供的 Function 能力直接进行 JWT 鉴权,开发得飞快。然后核心功能点就是功能页里的授权白名单按钮了。
这个功能从 Cloudflare 的 Request 中拿到访问的 IP,然后和 D1 数据库里用户上次授权的 IP 进行比较,如果相同则不去阿里云授权,如果不相同,则删除用户上次授权的 IP,然后再添加新的。此时我去阿里云的开发者网站上找 OpenAPI,只看到了几个 SDK 的使用示例,而且做得还挺不错的。于是挑选了一个 Node.js 的 SDK 然后开发这个功能,开发也异常顺利,我直接上传到 Cloudflare 进行测试,突然看到报错:

[unenv] https.request is not implemented yet!

我是知道 Worker 是一个不完整的 Node.js 环境的,但是没想到这个包也没有,关键是阿里云的 SDK 没有提供修改“网络请求实现”的方法,我也没在阿里云的开发者网站上发现直接的 RESTful 调用方法。

当我一筹莫展的时候,我发现阿里云的官网上有个 AI 功能,就是这个按钮:

没抱啥希望地点开问了问,居然真的给我找到了 RESTful 接口的调用方式,并且还让它直接生成了可用的代码:


我把使用 fetch 的代码丢给 Copilot,然后让 Copilot 参考一下,把之前使用 SDK 的代码换成新的使用 fetch 的,直接一把搞定。

总结起来两个坑:

  1. 阿里云其实是有 RESTful 的调用方式的,不过官方示例工具里只提供了 SDK 的示例,通过 AI 能够查到,估计是隐藏得比较深吧。
  2. Worker 环境里很多 Node.js 包不可用,都需要使用 Worker 专用的包,GitHub 有很多,不过Worker现在支持的Node 包也越来越多了。
    本该俩小时搞定的东西,最后搞了一天。

Weekly-07

作者 xiejingyang
2024年10月23日 14:12

又是一个双周记,最近事情是真的很多,而且又碰上假期综合征,就周记的优先级就越来越靠后了。

工作

最近碰到了许多以前没有碰到的问题,以后也许会把这些问题排查清楚后当做连载来做个交代,简单介绍下遇到的几个问题:

clickhouse断电数据损坏

国庆节写字楼断过一次电,服务器上的多个数据库中的一个clickhouse损坏了,这个问题倒是比较好解决,可以让clickhouse自己进行修复,只需要修改一些配置。不过我选择了更加粗暴的解决方案,重新搞个新的clickhouse,毕竟那个clickhouse只是存放开发和测试环境日志的。

数据库与查询结果不同

某个配置在没有进行操作过的情况下,被一个每10秒巡检一次的定时任务判定为开启,但实际上该配置从接口日志上来看,没有在界面上被触发过,查看了mysql的binlog也没有发现过该时段有过修改记录。
定时任务的逻辑非常简单,入口就是直接select该配置值,如果该值没有开启,后续的逻辑都不会走。现在陷入了灵异的事件,数据根据证据表明是没有修改过的,逻辑表明该配置是开启了的。也就是数据库和查询的结果对不上,现在还没有找到问题所在。数据库没有读写分离,没有集群,就是单例架构,代码中也没有使用缓存。

内存泄露

在使用kafka的时候,发送消息会返回一个凭证,但是没有消费这个凭证,所以随着消息的积累,这个凭证占用内存会不停升高。解决起来也很简单,消费一下不做逻辑就行了。

新版本的宣讲PPT用了很多PowerPoint的自动过度转场,没花什么功夫就让整个PPT高级了很多,也让很多页PPT看起来更加有连贯性。我现在做PPT的动画会直接复制几页,然后移动需要播放动画的个体,利用转场自动过度的效果,就很简单又丝滑的让几个个体在页面上动画起来了。
可惜审美和时间都没有允许我做出好看的PPT,大多数的页面就是截图和文字,有空了一定要去学一下排版相关的设计教程。

还在和客户配合排查问题的时候发生了一件“有意思”的事情:
客户有多个安全设备,目前发现线上的某个文件被安全设备影响了访问不正常,配合排查的时候短暂关闭了所有的安全设备,确认文件可以正常访问了。于是开始一个个启动安全设备排查问题,看起来其实这个操作很正常,不过在我们安全厂商眼里变成了“俄罗斯轮盘”游戏。启动了第一个安全设备,没问题,启动了第二安全设备,也没问题。本来非常自信的我,也开始怀疑自己的安全设备是否有问题了。这种情况和俄罗斯轮盘的游戏一模一样,我在等待的时候,我的心率和压力飙升:

最后的结局很神奇,所有设备启动了都没有问题了,最后也只能不了了之,但我却感受到了“俄罗斯轮盘”的力量。

学习

最近把我的开源项目的前端框架换了,与其说是换了一个,不如说是用了一个,因为之前的组件都是我从零手写的,确实耽误了我不少功夫,而且还不好看,现在换成了shadcn ui,不仅好看而且好用。
从DevOps到日常脚本:聊聊Go语言的多面性 Tony Bai 这篇文章有一些感想,我也是一直用go来做为devops的开发工具的,主要是编译出来的东西能在各个地方来跑,这文章里还介绍了一种把go作为脚本使用的方法,很有启发,也许以后能用的上。
老板推荐了一本《牧羊少年奇幻之旅》,读完了,最近碰到了一些事情就总想着天命,事实上顺应天命去做了似乎结果确实还挺好,其实换种说法应该就是保持平常心去顺应自然吧,挺不错的。
最近看到一篇推文:https://x.com/DentesLeo/status/1844045312089825657

If you want fame, solve poor people’s problems.
If you want wealth, solve rich people’s problems.

Poor people don’t need real solutions—they just want to forget their problems. That’s why their demand for entertainment never ends.

翻译过来就是:

要想出名,解决穷人的问题。
要想致富,解决富人的问题。

穷人不需要真正的解决方案——他们只想忘却烦恼。这就是他们对娱乐的需求永无止境的原因。

感触很深。

最近国内的AI发展的不错,我一直很喜欢的零一发布了新模型yi-lightning,测试了非常不错,在很多方面都让我很满意,可惜只有16k的上下文,而且指令遵循在aider中经常无法写出需要的格式,导致不能用在编程里,比较遗憾了。
国内的AI在可用性和工程上感觉和国外的AI已经有一站之力了,虽然还是没有出现o1或者opus这种能思考或者很有思想的模型出现,但感觉中国很擅长在别人从0走到1的基础上,快速走到100甚至10000。

生活

黑神话的进度还是很慢,刚干了虎先锋杀了虎伥,这游戏还是好玩,没有那种放下了就不想玩了的感觉,有一定的空余时间,还是会想打开,就算我已经云通关过了。
家附近的步步高超市被胖东来改造之后,天天爆满,晚上8点多日清菜就卖完了,是真的做到了日清,我八点半出门跑步,过去都只能捡最后打包剩的一两盒。而且胖东来的啤酒真不错,度数不高还有麦香味,适合我这种不怎么喝酒的人。

Weekly-06

作者 xiejingyang
2024年10月9日 15:57

工作

国庆假期是真的在放松,很少工作,最多也就是巡检下客户的服务器,预研下之后要用到的自动测试框架之类的。

学习

为了设计Tea的插件系统,我研究了很多带有插件能力的程序的实现方式,其中我比较中意的是Obsidian的设计方式。
关于插件系统,我有几个苦恼的点,第一是如何提供原生能力给插件,毕竟我不想插件也编写Rust,Obsidian是通过在前端项目中提供很多API来定义该插件的能力,并且提供了一些生命周期函数来让插件定义行为,而且好在我用的tauri本来就会开放一些基础API给前端,少了我很多工作。
第二个苦恼是,灵活性和安全性的问题。插件很难像我开发Tea的本体一样做到那么多能力,而且那样也失去了插件系统本身的意义,我希望在我提供了大模型交互能力和存储能力的基础上,再来通过界面提供大模型驱动的一些应用功能,但在我实际设计这个插件系统的时候,我自己设想的应用在我设计的框架上都举步维艰,所以很明显的是我设计的并不够灵活,这还得从前辈们的设计里取取经。安全性就更难保证了,我参考了figma的插件设计的文章,他们为了安全花费了大量的精力,并且我觉得他们牺牲了开发的便利性,和我制作Tea插件系统的初衷背道而驰,我希望以后AI能便利的按照需求来为用户创建插件,太过复杂的插件系统很难和现在的AI能力匹配,我决定用最偷懒的方法来解决安全问题,我只内置我审核过并且开源的插件(Obsidian好像也是这么做的)。
第三个苦恼的是技术方面,我希望插件打包后不要太大,如果每个插件都包含一套React相关的库,势必是会浪费很多存储空间,加载也会变慢,这个目前还是没有解决,插件只能自带UI库,不过也带来了一个好处,就算是用Vue也能加载进来了。。。
还有更多的苦恼,不过解决苦恼也是会带来爽感的,可能这就是为啥我一直喜欢编程的原因吧。

在日常用Tea的时候,又发现了一个很爽的地方:我想 给terminal设置环境变量之后自动切换到obsidian目录然后git push到github 这个操作加个别名然后一键完成(因为github时不时被墙),我不知道如何在powershell里编写这个命令,于是我用Tea来询问,并且让他编写一个命令能够运行后自动添加别名并且持久化,接下来我就只要利用Tea的代码运行能力直接点一下运行,这个别名就加好了。

生活

这个假期过得非常放松,和朋友开黑玩《三角洲行动》,想想之前开黑玩游戏,好像是几年前玩绝地求生了。
还带娃去逛了逛公园,七天中唯一一天离开电脑,结果客户那边就出问题找过来了,好在同事帮忙解决完了。

Weekly-05

作者 xiejingyang
2024年10月1日 23:00

工作

本周大部分还是干的产品的活,不过现在相对于之前来说已经得心应手了,而且AI大大的增强了我作为产品经理的能力,平时使用AI的时候会把需求一步步分解然后描述清楚,让我现在写PRD文档的时候如鱼得水。
并且还碰到了之前没怎么遇见过的两个问题:时间回溯导致定时任务和雪花算法都报错的问题、Clickhouse在某些查询条件下会内存爆掉无法查询的问题。目前还没找到原因,只能先加强巡检避免问题产生影响。之后解决了问题会单独记录下解决过程。
本周的工作还有一个重要的事情,我将开发环境从IDEA切换到了VS Code,IDEA的AI插件太难用了,我怀疑Copilot团队就是故意不做好让用户转向VS Code,至于不转到Cursor和Zed的原因是,Cursor的能力在我的评估体系里不如VS Code+Aider,而Zed也非常不适合Java这种体量的项目。目前转到VS Code还不是正式转过去,我需要先用VS Code工作一个月才能说能否正式抛弃IDEA。

学习

过于忙了没有产出多少的BIL文章,其实学习了不少东西的,十一假期的时候一一给这些文章补上。像是Cloudflare的产品更新、SQLite的“Many Small Queries”性能、一些特定场景下AI的提示词等等,这些属于文章不短且内容较深,我写文章的时候应该对这些东西的理解还会加深一个层次,我自己也很期待来写这些文章。
Tea的更新进度我个人还比较满意,把Bang的交互调整了下,对于补全的交互能达到我自己还相对满意的程度了,就是前端调试补全面板位置的时候废了我老劲了,之前有一部分代码是AI写的,所以不熟悉结构和css的情况下来调整绝对定位让难度提高了一个数量级。

生活

娃去了动物园,我没去,其实还是很想看到娃看见各种动物的反应的。还是得努力让财富自由啊,这样就能人身自由了。
最近股市疯了,可能这就是所谓的“调动市场预期”吧,大家突然都觉得大A能赚钱所以都开始买了,反正我亏的基金回本有望了,噢耶。

Cursor Composer、Zed Workflow、Aider、Copilot Workspace对比

作者 xiejingyang
2024年9月26日 20:31

本文只是对四款自动编码的产品做一个横向比较,单独的产品使用评测可以看看博客里单独评测的文章。最后有AI生成的对比表,省流的可以看每个对比的结果和最后的表。
并且该横向评测的结果也只是我自己日常使用的主观感受,每个人的场景不同自然会有不同的体验。(叠甲

选手简介

  • Cursor Composer:Cursor Composer是一款集成在Cursor编辑器中的AI自动化编程工具。它能够根据用户的需求描述,自动分析项目代码,并生成相应的代码修改方案。
Cursor Composer
  • Zed Workflow:Zed Workflow是Zed编辑器的一个功能,允许用户通过提示来指导AI进行代码修改。与其说它像Cursor Composer,不如说是Github Copilot Chat的增强版。
Zed Workflow
  • Aider:Aider是一个命令行工具,可以与多种AI模型配合使用。
Aider
  • Copilot Workspace:Copilot Workspace是GitHub的扩展功能,目前只能通过Github Next提供的Web界面使用。它可以分析GitHub Repository,然后根据用户输入的需求生成解决方案,并直接修改代码。
Copilot Workspace

用于评测的项目是我编写的一个开源大模型客户端:https://github.com/xieisabug/tea

对比维度

我会针对以下几个维度来进行体验对比:

  • 工程能力
  • 代码质量
  • 用户体验
  • 价格与性价比

详细对比

工程能力

  • Cursor Composer:能根据需求自动识别出需要修改的文件、能够多轮次的迭代修改、能够选择是否应用单个修改,实际体验下来识别需要修改的文件不是非常的准确,并且使用的过程中还碰到了找不到历史记录或者修改文件失败之类的小bug。
  • Zed Workflow:工程能力很弱,需要手动提供上下文文件给AI,修改也需要自己去一个个点Transform按钮,而且不知道是不是因为格式过于复杂,Deepseek有时候会无法遵循格式导致这个Workflow没法用。
  • Aider:同样能根据需求自动识别出需要修改的文件、能够多轮次的迭代修改,修改会直接应用到文件上,通过git的能力来查看本次修改和回退修改。特殊的是aider具备出色的自检和自纠错能力,能自动运行测试用例并确保通过。Aider使用Deepseek也偶尔会出现没有遵循格式修改,但是Aider会自动让Deepseek重试。
  • Copilot Workspace:同样能根据需求自动识别出需要修改的文件、能够多轮次的迭代修改,能在网页上用diff格式展示出所有的修改,特殊的是它在输入需求之后提供分步骤的需求分析、代码分析、代码修改计划,有助于处理复杂任务理清思路,能够直接提交到Github Repository,也能通过最新的一个VS Code插件来同步修改到本地运行测试。

Aider > Copilot Workspace = Cursor Composer >> Zed Workflow

代码质量

本来不应该在评测这种大模型工具的场景下,评测代码质量,因为代码都是模型写的并不是这些工具提供的能力。但在我使用的过程中,由于Prompt、工具限制等各种情况导致代码的质量还真有一些不同。

  • Cursor Composer:能用GPT和Claude之类的SOTA模型,也可以用自己的key,但是要转换为Cursor“认证”过的模型,也就是把模型名字要改成gpt4o之类的,我就是把deepseek用worker覆写成gpt4o来使用的。
  • Zed Workflow:纯纯的就是靠模型能力了。
  • Aider:得益于其强大的自我纠错和测试运行能力,代码质量最佳。支持几乎所有的模型,并且有一套自己的榜单Aider leaderboard和测试集,有钱的大哥可以体验体验用o1 preview自动写代码的快感。
  • Copilot Workspace:可惜只能用GPT(居然变成了减分项),有Copilot写代码的通病,喜欢吞括号和分号。现在可以申请o1系列的模型了,我还在waitlist里等着。

Aider = Cursor Composer > Zed Workflow > Copilot Workspace

用户体验

  • Cursor Composer:集成在编辑器中,使用便捷直观,和聊天是用的同一套UI体系,一方面来说比较稳没有什么学习成本,一方面来说又太稳了不突破很难有惊艳的效果。也许就是因为Cursor的这个稳让新入场的开发者都能非常快速的感受到它的能力。
  • Zed Workflow:学习曲线也低,毕竟没啥东西。
  • Aider:对于熟悉命令行的开发者体验还是不错的,与终端的结合度高,可能是因为不需要操心界面的原因,功能的完成度也非常高,基本上该有的命令该有的提示该有的检查全部都做到了,并且减少了对鼠标的依赖。但是学习曲线较陡峭,需要一定时间来“学习”使用这些功能,会用和不会用简直就是两种体验。
  • Copilot Workspace:也是直观的界面且易于使用,但是其功能是独立于IDE的,所以使用的时候总是要切换来切换去。允许用户调整AI生成的分析和计划,可调整的空间很大。没什么学习的东西,基本上也就是一个输入框用来提需求就完事了。

Cursor Composer > Copilot Workspace > Aider > Zed Workflow

价格与性价比

  • Cursor Composer:必须开通Cursor Pro才可以使用这个能力,然后只有500次高级模型的使用权限,所以500次之后就得用自己的key来使用Composer功能。价格是20刀,不过20刀里还有Cursor的补全服务,这个补全服务我觉得比Composer值钱。不过我觉得20刀换500次高级模型使用+补全,还是不太值 (经过网友指正,不是500次高级模型,是500次快速的高级模型,之后应该还是会有可排队的高级模型使用),20刀买api能用很久了,尤其是带有缓存命中的Claude和Deepseek(Deepseek 20刀能用一年吧,能不能提高点价格然后加加速啊)。
  • Zed Workflow:有自己的Zed AI服务,但是暂时没收费,也可以用Copilot提供的GPT4o,这点还挺好,目前推荐用这俩,因为Zed的机制导致它使用的时候会消耗很多Token,如果没有缓存命中机制的提供商用起来会破产,除了Zed AI和Copilot之外最好就是用Deepseek了。
  • Aider:工具本身免费开源,需要付费的是大模型的API。同样,使用缓存命中机制的提供商会便宜很多。
  • Copilot Workspace:价格性价比优秀,尤其对于已经使用GitHub和Copilot的开发者。目前还不用额外订阅,暂时只需要Copilot的10刀。

Copilot Workspace > Aider = Zed Workflow > Cursor Composer

总结

  • 对于需要强大工程能力和高质量代码输出的开发者,Aider 是一个很好的选择,Aider是一个长板很明显短板也很明显的工具。
  • 暂时还不推荐Zed Workflow,就算是结合Zed AI的各种能力和插件来使用,也达不到很好的效果,可以再让它发展一段时间。
  • Copilot Workspace 对于目前拥有Copilot,并且维护了开源项目的开发者,非常友好,暂时没有额外的收费并且用户体验做的很好。
  • 对于那些希望在熟悉的VS Code环境中获得自动编码辅助的开发者,Cursor Composer 是一个不错的选择,并且因为其高结合度,操作非常便捷。
  • 目前这类的产品我最终还是找到了使用场景,最初我认为:复杂的任务无法完成、简单的任务用它完成徒增复杂度,现在我认为:复杂的任务拆解成简单的(这是我的能力)、经过多次与AI配合熟练后简单的任务让AI来做,我和AI配合起来还是很节省时间的

对比表

同样,最后让AI出一个表格

特性Cursor ComposerZed WorkflowAiderCopilot Workspace
工程能力⭐⭐⭐⭐☆⭐☆☆☆☆⭐⭐⭐⭐⭐⭐⭐⭐⭐☆
代码质量⭐⭐⭐⭐⭐⭐⭐⭐⭐☆⭐⭐⭐⭐⭐⭐⭐⭐☆☆
用户体验⭐⭐⭐⭐☆⭐⭐☆☆☆⭐⭐⭐☆☆⭐⭐⭐⭐⭐
价格性价比⭐⭐⭐☆☆⭐⭐⭐⭐☆⭐⭐⭐⭐☆⭐⭐⭐⭐☆
自动文件识别⭐⭐⭐⭐☆⭐⭐☆☆☆⭐⭐⭐⭐☆⭐⭐⭐⭐⭐
复杂任务处理⭐⭐⭐⭐☆⭐⭐⭐☆☆⭐⭐⭐⭐☆⭐⭐⭐⭐⭐
自我纠错能力⭐⭐⭐☆☆⭐⭐⭐☆☆⭐⭐⭐⭐⭐⭐⭐⭐☆☆
模型选择灵活性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐☆☆☆☆
版本控制集成⭐⭐⭐☆☆⭐⭐⭐☆☆⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
学习曲线⭐⭐⭐⭐⭐⭐⭐⭐⭐☆⭐⭐☆☆☆⭐⭐⭐⭐☆

注:⭐⭐⭐⭐⭐ 表示最佳,⭐☆☆☆☆ 表示最差

工具-Copilot Workspace

作者 xiejingyang
2024年9月23日 18:02

不久前获取了Copilot Workspace的权限,一直没时间做测试,最近写了一个大模型工具客户端,刚好用这个开源项目来做下实验。
可以通过Github上的Issue触发(AI自动改简单的bug和完成简单的需求现在就实现了?),也可以直接在网页里提自己的需求来触发。是的,看到这里你应该发现了,这个Workspace目前是无法直接在IDE里使用的。最近出了一个VsCode插件(2024.09.21 目前需要自己去下载vscode 插件文件安装),但是这个插件只能做到帮忙同步修改到vscode中。
先介绍下流程吧,同样是之前测试Cursor Composer的那个需求(它没能完成),我直接通过Github Issue触发的:
https://github.com/xieisabug/tea/issues/2
点击了之后就自动进行分析,会列出它对需求或者bug的分析和解决方案。分析和方案都可以手动增删改,而且可以点击上面那个聊天的窗口对代码的情况进行自然语言描述,Workspace会根据描述再次改进之后,生成分析和解决方案。

确认好分析之后,会根据分析来生成实现代码的计划,按照文件来列出所有计划,这个计划也是能自己进行增删改的。

再之后就直接确认开始修改代码了。

评价

工程能力部分

体验上来说比Composer要强上一些,毕竟编写代码是需要一定时间的,所以在我确认了你要如何修改之后,再去编写代码,我觉得这是能节省我大量时间的。
而且寻找需要修改的文件比Composer的能力要强很多,应该也是在代码搜索方面下了很多功夫的,这次测试中,能准确找到我的rust文件和前端文件,但是同样找不到我的测试文件,好在我可以轻松的在Plan里自己加上这个文件。
不过同样是写错的代码就直接错了,还是需要自己去调试的,好在有一个vscode插件能够同步修改到vscode里调试,之前没有这个插件的时候,只能在网页上人肉看,看完了提交然后再到vscode拉取到本地去修改。

代码完成部分

Copilot Workspace只能用默认的模型,也就是gpt 4o,之后可能会加上o1家族。
使用了gpt 4o可能要作为减分项了,gpt 4o写代码完全不如sonnet 3.5,并且会犯Copilot也犯的错误,比如下图:
![[Pasted image 20240922164323.png]]
喜欢去掉别人的括号或者分号,很是蛋疼。

UI UX部分

本来属于加分项,个人的体验感受是比Composer要强上不少的,直观、灵活,但是只能在网页上用而且只能用于Github项目,这应该就劝退了很多用户使用了。
希望之后Composer或者别的项目能够参考Workspace项目的界面交互。

总结

如果Openai未来的模型代码能力提升上来,或者把o1接入进来,未来比Composer可期。

工具-Cursor Composer

作者 xiejingyang
2024年9月23日 17:24

我在我的开源项目上正式使用了一下Cursor Composer,这是一个相对来说中型的客户端项目,用这个项目来做测试有两个目的:一是我不想测试从零开始搞个网站或者开发个小工具的场景,那在我的日常场景中占比太小了,没有参考价值;二是我的项目刚好还有很多需要做的新需求,这些需求足够清晰且难度大于单独写一个网页。

使用的需求场景是这个Issue:https://github.com/xieisabug/tea/issues/2
输入到Composer的Prompt就是Issue的描述:

当前的bang操作有:  
!s、!selected_text 获取打开快速聊天窗口之前选中的文字(暂时不太好用,需要优化)  
!sub_start([text],[length]) 从开始截取[text]文字[length]长度  
!ct、!current_time 获取当前的时间  
!cd、!current_date 获取当前的日期

计划增加:  
!sc、!screen 获取打开快速聊天窗口之前的屏幕截图  
!w([url])、!web([url]) 获取对应[url]的网页  
!wm([url])、!web_to_markdown([url]) 获取对应[url]的网页并且转换为markdown

在 快速聊天窗口 或者 完整聊天窗口的新对话界面 中展示部分bang的预览内容  
在输入框中敲击!时出现bang列表用于选择

评价

工程能力部分

能够在我仅给出需求的情况下,准确的找到了之前编写bang的rust代码文件,属于加分项。但它并没有对我的前端文件进行更改(rust和前端都在这一个项目里),因为我的描述其实明确提到了需要修改界面。
并且它没有帮我创建对应的测试用例来检测该bang的实现,我是有专门针对bang的测试文件的,如果能力强一点肯定是能发现需要编写测试用例的,不过在我要求创建测试用例的时候,它还是能准确的找到之前编写测试用例的文件并且完成测试用例编写。

代码完成部分

此次测试使用Sonnet3.5加持。
正确按照我之前的编写模式创建了我需要增加的6个bang命令,且实现了获取网页内容和获取网页内容并且转markdown这两个功能的内容。
但是,实现的部分功能不可用甚至报错,当然这不是Composer的问题,这是大模型的问题。但它没有将大模型出现的非前端问题解决掉,而是留在了那里。

UI UX部分

都说Composer交互是最好的,个人觉得还不是最完美的方案,对话界面和功能较为割裂,我觉得可能会有更好的展示方式来对每次对话产生的影响进行展示,比如每次修改产生的影响都和对话做一个能够对印上的交互。
并且不知道是不是我使用的bug,我过去使用的Composer记录找不到,个人觉得查看过去的Composer然后继续改还挺重要的。
不过能够直接在编辑器里选择每一项更改是否生效,这个交互还是比较爽,不过我想这个操作是否有必要,在不久的将来,肯定是无需人去干预这个交互的,而且如果有git之类的版本控制,基本的IDE都能看到修改对比的。不想修改这个不分直接撤回就行了。

总结

和我之前Cursor的评测结论差不多,干简单的事情太麻烦,干麻烦的事情干不成,未来可期。

大模型-用Deepseek翻译时带给我的欢乐时刻

作者 xiejingyang
2024年9月21日 20:25

文章全部是我在使用沉浸式翻译+deepseek的时候发现的欢乐时刻,翻译的全都很传神。

不香吗?

我他妈高兴坏了

啊对对对

YYDS

我们程序员就是这么说话的

真是!

以上均是使用沉浸式翻译自带的AI专家 Twitter翻译增强器:

Weekly-03

作者 xiejingyang
2024年9月10日 11:31

工作

工作中需要把tls的一些特性相关内容实现到caddy中,找到了一个很完美的库,但是适配的是gin,我需要把这个项目改为caddy plugin。突发奇想使用AI来帮我干,毕竟不是什么特别需要技术的活,只要懂caddy plugin和gin,然后再把这个库的代码当做上下文去适配修改就行了。如果是我来做,起码要去学习gin的一些基本原理和caddy plugin的写法,然后再把这个库读一遍之后重写,这都是很费时间的事情,交给AI来做简直就是完美方案。
不过现实很骨感,尝试了Cursor(Sonnet3.5)、Zed AI(Sonnet3.5)、Aider(Deepseek Coder)、Kagi Assistant(Sonnet3.5、GPT4o、Gemini)之后,耗费了我一个下午时间,完全无法获取可用的代码,并且因为我自己不懂Caddy pugin和gin,我也无法教AI如何去修改这些代码。
事实证明,如果是要使用AI,自己是需要懂相关的东西的,我也不太明白社交网络里宣传的“零基础用AI开发一个应用”是如何做到的,很多情况下没有编程基础的人要写一个应用都无法跑的起来,开发环境都没法靠AI教学安装。如果是有很基础的编程基础,倒是可以通过AI来帮助开发一个比自身水平稍高的应用。没办法,这个Caddy plugin只能够我自己去学了。

学习

承接工作的内容,我获得了Github Copilot Workspace的体验权限,最近应该会体验下。这是个比Cursor更早的带多文件编辑能力的AI编程环境,可惜的是这是GPT4o驱动的,不过由Github Copilot团队打造的,应该能力还是在线,估计不用多久我会出一个评测。
Side Project动的也少了,目前基础做完了,开始设计核心插件系统了,我的设计思路是提供一系列非常方便的接口,让用户可以方便的使用到AI的能力。第一阶段是做好基础能力,也就是我现在做的能够对接所有的大模型,并且完成日常聊天要做的事情;第二阶段是做好二开的能力,我先用这个框架提供的能力来做一些实用工具,并且这些能力想要二次开发的人自己也可以调用;第三阶段是AI使用这些能力的能力,也就是我想要什么工具,描述给AI,AI帮我调用这些能力并且编写好对应的插件。
目前还是在第一阶段的尾声,开发完应该就会正式开源了。

看了一篇文章有点意思,大意是讲一种新的提供给大模型的robot.txt叫做llm.txt,用markdown这种大模型更易懂且简洁的语言来描述网站的情况和地图,让大模型能够用最少的token和最快的速度对网站有了解。
这让我想到了之前听AI炼金术播客中提到的AI时代的新想法,以前只有调色师通过基本的三原色调出来各种不同的颜色,后来有了RGB之后能通过修改数字来获取到新的颜色;再到最近AI能够生成音乐了,那乐器所产生的声音也可以用数字量化,这样就能找到除了物理世界能产生的声音之外更多的声音;再到未来AI能够把想法量化,在想法和想法之间,通过不同的参数能过获取到不一样的想法。
AI时代的东西,可以参照以前时代的东西进化出无数新东西。

生活

周末去乡下住了两天,带娃在外公外婆家过生日,给我最大的感受是在乡下时间变长了。早上看完了新闻,吃完早饭,还和娃玩了很久,一看表才9点,平时这个点刚到公司;晚上吃完饭在外面溜达一圈,回到家又陪娃玩了一会,一看表才7点,平时还没到家。
在长沙的生活感觉非常紧凑,早上急急忙忙还担心会迟到,陪娃的时间也很少。但到了乡下,事情其实也没少做,娃也没少陪,时间就是感觉很长,我也不知道是什么原理,但是觉得这肯定是我不工作之后的第一选择,感觉这样生命都更长了点呢。

减肥搁置了很久,好在没有反弹太多,以后不写减肥计划了,都写在周报里吧。

VS Code Copilot、Zed AI、Cursor 对比

作者 xiejingyang
2024年9月1日 23:04

背景

我决定评测这三个产品的原因是,我日常都是使用的VS Code Copilot,很久以前尝试过Cursor感觉不理想,但是最近国外都很推崇Cursor,就有点想尝试一下,恰好之前一直关注的Zed也推出了自己的AI功能,所以干脆集中一起使用对比下。

选手简介

  • VS Code Copilot:算是“老牌”编程助手了,虽然Copilot在别的编辑器上也有扩展,不过体验最好的还是VS Code,毕竟都是微软家的所以功能集成更好一些;主要提供的是Complete和Chat能力,也就是代码补全和聊天。
  • Zed AI:Atom的作者开的新坑,还是一个非常年轻的编辑器,以快著称;原本不提供AI能力,后来支持了Copilot(对,就是Github Copolit),近几天出的Zed AI支持Chat。
  • Cursor:基于VS Code的开源代码来进行的二次开发,没有像Copilot一样作为VS Code的插件来编写,据作者说这是为了实现 VS Code 现有架构无法实现的理想交互方式;提供了Cursor Tab(原Cursor++)和Chat,其实也是代码补全和聊天,还有个“杀手锏”功能Composer。

对比维度

我会针对下面几个维度,分享我自己的使用体验:

  • IDE本身
  • AI
  • 价格
  • 潜力

详细对比

IDE本身

  • VS Code:非常丰富的插件,插件多到可以直接配置出一个强大的IDE,但这样也就会拖慢VS Code的速度;最初使用VS Code是因为有些项目不是很重,使用的Go、Python、Nodejs等,开一个JB家的IDE犯不着,并且我很喜欢VS Code的Remote dev container,在我的M芯片上简直救我的命(很多库没arm版本);由于免费且用户数量巨大,所以社区异常活跃,我还没有碰到找不到解决方案的情况。
  • Zed:刚打开这个IDE应该会懵逼一会,界面非常简单,简单的和Sublime一样,基本没有个IDE的样子,只能算作Editor,和使用下来的体验和第一印象基本一致,缺少了很多开发过程需要的功能,不过对于习惯使用Sublime或者Vim的用户来说,可能会习惯的比较快,我已经将一个Side Project的主力IDE切换为了Zed;快一直是Zed宣传的强项,我当时嘲笑了它,我为啥会需要120fps的切换tab?不过我还是被打脸了,用起来会发现它是真快,而且“快”对写代码是真的有加持(?我也说不清是为什么)。
  • Cursor:由于Cursor依托于VS Code,基本和VS Code的情况一模一样,相对于Zed,它能支持VS Code的庞大插件群。

完善程度:Cursor > VS Code > Zed
使用感受:每个产品都有其独特的优势,但需要注意的是,Zed目前没有推出Windows版本

AI

首先介绍大家相同的能力,基本都会提供代码补全和Chat的能力。

代码补全

其中Zed是借助的Copilot提供的代码补全,但要说一句的是它的代码补全比VS Code要快;而Cursor的代码补全体验是最好的,不仅快,而且时常会出现连续补全的情况,这个时候你只要不停地按Tab键,AI会猜测你后边的代码编写和修改,一并提示补全,值得注意的是“修改”代码补全是Cursor才有的能力,只要Cursor触发这个连续Tab,没有人会不喜欢Cursor了。

Cursor > Zed > Copilot

Chat

三个软件都具有与当前代码上下文聊天的能力,其中Copilot和Cursor都对代码有embedding,可以自动调取上下文,Zed AI我目前没有看到有自动调取上下文的功能,上下文自动调取效果最好的我感觉是Copilot,能够非常精准的定位到我提问相关的代码,并且Copilot和Cursor都具有Apply的能力,也就是在Chat中的代码块能够自动以diff的方式映射到代码中,而Zed需要使用目前还在Beta的Workflow才能够触发Apply,普通的代码块无法直接Apply,但Zed有一个特别的能力,那就是Chat的内容允许随意修改,这个能力要结合Zed的别的能力来用,效果会非常好。

不分胜负

Inline Assitant

也是三个软件都有的能力,Cursor和Copilot的体验差不多,但Zed AI是在这个能力上发力了的,他的Inline Assistant是会带上Chat中的上下文的,这也是Zed AI演示的能力,可以在Chat中与AI进行多轮沟通之后,在工作区用Inline Assistant进行”应用代码修改”,AI会再对应的位置根据之前聊天约定的内容来进行diff模式的代码修改,这期间肯定会携带大量的上下文,Token消耗非常巨大,解决办法就是使用带Cache的AI,比如Deepseek和Claude Sonnet3.5,我强烈建议大家配置个Deepseek,这样就算没触发缓存(第一次肯定无法触发)也不会产生太多的费用(Deepseek充个20人民币能用非常久了),还有一个解决办法就是上面说的编辑Chat内容,把多轮调整的一部分内容删去,或者手动添加一部分外界的内容进来用于Inline Assistant。

Zed AI > Copilot > Cursor

不同点

  • VS Code Copilot:与VS Code进行了深度集成,在Source Control的提交框里都能自动帮你总结代码修改的commit message,并且最近更新了4o之后,Chat飞快。并且Copilot不光是可以在VS Code里用,比如写Java的兄弟们要用IDEA也是可以用Copilot的。
  • Zed AI:Zed AI的理念和另外两个软件都不太一样,所以对比起来很不一样,但是就Workflow这样的能力来看,Zed的上限太高了,而且Chat里面的Slash能力是可以自己扩展的,比如官网示例就编写了一个Perplexity的插件,能够自动通过 /perplexity 来进行搜索并且把内容贴在Chat里当做上下文。
  • Cursor:提供了一个叫Composer的能力。这个能力被很多人称为杀手锏,也就是对整个项目提需求,然后AI会自动对多个文件进行编辑,我使用下来除了很简单的需求,复杂点的需求或者项目,AI完成的都不是很好,但是很简单的需求其实也能直接在Chat里完成了。不过这个能力肯定是随着AI模型的能力而水涨船高的,未来可期。但是Composer的能力其实可以用Aider进行替代。

价格

  • VS Code Copilot:Copilot的订阅价格为每月10美元,我目前是用学生包获取了这个的,而且始皇还有override可以替换为自己的模型。
  • Zed AI:目前Zed AI的价格策略尚未明确,但其基础功能是免费的,并且所有的功能都没有限制使用内置AI才能完成,可以自己配置API Key,就算以后收费了也没关系。而且目前免费试用期间,可以白嫖Sonnet 3.5,但是有RPM或者TPM的限制。
  • Cursor:Cursor目前是20美元开Pro,免费只能补全2000次,很快就用完了。Pro包含了无限补全和500次高级模型的调用。最重要的是,Cursor的高级功能比如Apply、Composer等都是需要使用Cursor自己的模型才能够使用的。

Zed AI > Copilot > Cursor

潜力

  • VS Code Copilot:作为3位选手中,当前市场最好的编辑器,Copilot只要把自己的体验向Cursor无限靠拢,凭借低价格和多IDE使用,加之没有太多的限制,肯定是能够继续稳坐老大的位置的,至于非常新颖的交互方式,Github也一直在探索,最近出的Copilot Workspace就是其中之一,能够直接在Github的仓库里让AI来完成任务。
  • Zed AI:单论潜力大小,那Zed肯定是进步空间最大的,光是向VS Code看齐就还需要很久了。不过AI方面独特的理念和高扩展性,并且也将大模型Cache利用的很好,用长上下文和大量的Token换取模型的编码准确性和全面性的提升,在我这至少是走的通的。
  • Cursor:Cursor的潜力在于其独特的用户交互设计和Composer功能。Cursor Tab独一档的补全体验和Composer站在大模型智力的肩膀上只会越来越强,而且还有Shadow Workspace这种新颖的点子,以后也是能力非凡的。

Cursor > Zed AI > Copilot

优缺点总结

  • VS Code Copilot
    • 优点:功能强大,插件丰富,AI能力出色,社区活跃,多IDE支持,价格相对合理。
    • 缺点:插件过多可能影响性能,部分高级功能需要付费。
  • Zed AI
    • 优点:界面简洁,运行速度快,AI理念独特,高扩展性,支持大模型Cache,价格策略灵活。
    • 缺点:功能相对较少,部分功能仍在测试阶段,暂无Windows版本。
  • Cursor
    • 优点:独特的用户交互设计,出色的代码补全体验,Composer功能潜力大,支持VS Code插件。
    • 缺点:价格较高,高级功能需使用Cursor自有模型,部分复杂需求处理能力有限。

总结与建议

  • 追求功能全面和成熟稳定的体验,选择 VS Code Copilot
  • 追求简洁快速的开发环境和高扩展性,选择 Zed AI
  • 追求独特交互体验和尝鲜,项目复杂度不高并且不差钱,选择 Cursor

我个人会继续嫖Cursor的试用,然后有些项目会使用Zed AI来进行开发,并且配合Aider这样的项目来补齐Zed AI所缺失的Cursor Composer能力,在Cursor不能试用Pro后我应该也不会续费,目前来说这样的体验不足以让我多花10刀去为了这个补全付费,多出来的10刀购买API后可以在Zed AI和Aider用很久了。

能力/特性VS Code CopilotZed AICursor
IDE完善程度最高基础
IDE性能可能因插件过多而变慢最快类似VS Code
代码补全良好优秀(借助Copilot,速度快)最佳(快速,连续补全,支持代码修改)
Chat优秀(精准上下文定位)良好(可编辑聊天内容)优秀(自动调取上下文)
Inline Assistant良好最佳(带上Chat上下文)良好
代码应用(Apply)支持需使用Beta版Workflow支持
特色功能深度集成VS Code,多IDE支持Workflow,可扩展Slash命令Composer(多文件编辑)
插件支持丰富有限支持VS Code插件
价格$10/月未定价,基础功能免费,可自配置API$20/月(Pro版)
使用限制较少免费期有RPM/TPM限制免费版补全次数有限
潜力稳定发展进步空间大创新交互,依赖模型进步
AI总结的表格

Weekly-01

作者 xiejingyang
2024年8月26日 15:24

2024年第34周:8月19日-8月25日


工作

这周终于回归到写代码的工作中,之前一段时间都是在做产品经理的活,写代码的时候居然感受到了非常的快乐和放松,太讽刺了。在AI技术刚兴起的时候,我一直在寻找工作流里能融入AI的地方,现在已经在工作流中使用了很多AI了,这周用AI把测试用例生成了,生成的时候非常爽,我突然想到,是不是资本家安排我们完成任务的时候,是否也有种使唤AI的快感?

学习

Zed AI

这段时间的AI驱动的编程工具很多,而且进步很大,交互也越来越趋近于自动化,之前的Copilot、Amazon还有国产的一众公司也都跟进了Copilot,但其实交互都差不多,也就是行内补全和ChatWithCode,然后就是最近大火的Cursor才彻底改变的交互,“修改补全”、”Chat transform“和“多文件处理“让体验提高了很多个档次,并且Sonnet 3.5的加持,让Cursor的能力水涨船高。
当我看到Zed AI的公告的时候我才想起来之前也有人推荐过Zed这个IDE,以快著称,当时确实嘲笑了一番,一两百毫秒之间的差距着实不能成为我切换IDE的理由。但这次Zed推出了AI服务,交互方式和别的IDE都不相同,于是去体验了一番,确实给我了很多惊喜。
我发现自己当时认为毫无作用的”快“其实能显著提升我的工作效率,并且通过它很新颖的AI使用方式,让我编写代码的时候效率又更高了一些。具体的体验心得可以看这篇

Rust

最近用AI来写Rust碰到了瓶颈,说来惭愧,我还没去正式看过任何的Rust教程,全凭别的语言的经验和AI的指导在开发Side Project,但是目前AI的Rust能力似乎不如其他语言,在我的个人使用感受中,Rust的能力Deepseek Coder大于Sonnet 3.5大于GPT 4o。而这几个AI都不能解决我最近碰到的Rust问题,问题大概是我使用了tokio和rusqlite,我想让rusqlite能够兼容一些异步操作,但是仅凭我和AI的能力无法完成整个项目的重构(还有很多业务逻辑)。
虽然最后问题确实解决了,不过方案是我自己想的,和之前我提需求AI来帮我找方案写代码体验感要稍微差了一点,成功的让AI回到了Copilot的角色上。
由此可见,程序员这一行当前还不会被AI完全取代。

帮老婆改东西有感

其实任务很简单,就是将另外一个前端项目中的一段逻辑,挪到另外一个新的前端项目。但由于该逻辑是核心逻辑,非常的复杂,并且原项目使用的是Typescript,有很多定义文件,新项目是Javascript,代码又不能够直接无脑拷贝,需要做对应的语言转换。
我的感受是,明明这是一个很简单、纯工作量大的工作,非常适合AI,但是既没有现成的AI工具,想自己开发一个AI工具也找不到方便使用的一些工具库,我也会继续思考下这个问题,也许这是我改进我的Side Project的一个方向。

生活

改善饮食习惯

家人身体出问题了,而且我感觉我的身体也有点问题。之前有段时间减肥而改善了一波饮食习惯,但是没能坚持下来,借口原因是工作太忙导致能跑步的时间减少,并且长沙太热了,晚上也有32 33,我怕跑步中暑。然后爸妈回去了一段时间导致我和老婆吃了很久的外卖,外卖哪有能减肥的。。。
眼下我们都需要更加注重养生,重拾健康饮食的好习惯,也推荐大家有能力的都健康饮食吧。

减重反弹了几斤

既然要重启减肥,那就上称,反弹了10斤左右,等于上轮减肥成果还是保持住了10斤。

抽空玩了暗黑四

是的,不是抽空玩黑神话,是抽空玩了暗黑四,因为工作特别忙,基本没有长时间去玩一个游戏的机会,大概每次都是半小时以内的零散时间,所以只能选暗黑四了。
不得不说暗黑系列卖的好是有原因的,各种游戏机制的设计让人很容易沉迷,尤其是获取奖励的那一刻,期待感达到巅峰,而且游戏机制的设计让每次获取奖励都有一定的提升,让人不至于失望。

黑神话做的好,推荐看寅子

当然黑神话我也买了,等到有时间玩的时候会去玩的,最近先云了一波剧情,做的是真不错,虎伥的剧情让我内心难受了很久,看的出来制作团队讲故事的能力很强,而且每个怪物的小传都不错。
推荐去看寅子的录播,自带说书人的属性,看这种经典故事有加成。

大模型-自动编写SecRule规则验证工具

作者 xiejingyang
2024年8月23日 17:19

背景

我们有类似waf的攻击检测产品,所以需要测试一些攻击是否能够正确识别,并且识别的原因是否正确,如果是自己去看规则,来编写,几十上百个规则太难了,要搞很久很久,而且是非常无聊的任务

大模型

用大模型来完成这个任务刚好,大模型懂SecRule语法,并且能够理解正则表达式,是干这个活的完美人选。
只要写一个不太烂的prompt约定一下产出的格式,我这里是产出的python代码,然后保存为文件,方便我以后经常调用验证产品。

import pandas as pd
import openai
import os

# 设置OpenAI API密钥和自定义endpoint
API_KEY = ''
# 替换为您的自定义endpoint
API_BASE = ''

# 读取CSV文件
input_csv_path = 'input.csv'
df = pd.read_csv(input_csv_path)

# 创建一个数据目录
output_directory = 'payload_output/'
os.makedirs(output_directory, exist_ok=True)


# 假设CSV文件中有一列名为'text',我们将对其进行文本生成
generated_texts = []

client = openai.OpenAI(
    api_key=API_KEY,
    base_url=API_BASE
)

for index, row in df.iterrows():
    print(f"正在处理第 {index + 1} 行... {row.iloc[0]}")
    prompt = row.iloc[1]

    # 调用OpenAI的API生成文本
    response = client.chat.completions.create(
        stream=False,
        model="deepseek-coder",  # 选择适当的模型
        messages=[
            {"role": "system", "content": """
                需要对WAF规则进行匹配测试,所以要根据用户提供的Secrule规则进行python poc的编写。
                请使用requests库来进行请求发送,函数名直接命名为attack,在函数的顶部用注释表明该模拟的意图,传入参数为url、cookie,url为模拟攻击网站host,cookie参数如果生成的poc脚本中用到了则拼接在一起,否则直接传递cookie参数,举例如下:
                ```python
                # 模拟cookie中超过3个符号
                def attack(url, cookie):
                  payload={}
                  headers = {
                    'Host': 'example.com',
                    'Cookie': 'TestCookie=-1-1-1-1-;' + cookie,
                    'User-Agent': 'Jetknown-Test-Case'
                  }

                  response = requests.request("GET", url, headers=headers, data=payload)

                  print(response.text)
                ```
                仅需输出代码块,不要进行解释和说明,也不要在代码块中引入requests
                """},
            {"role": "user", "content": "规则如下:\n" + prompt + "\n"}
        ],
        max_tokens=4000  # 根据需要调整生成文本的长度
    )

    generated_text = response.choices[0].message.content.strip()
    print(f"生成的文本:{generated_text}")

    # 从生成的文件的markdown中提取代码
    generated_text = generated_text.split("```python")[1].split("```")[0].strip()
    generated_text = "import requests \n\n" + generated_text
    # 将生成的文本保存到文件中
    file_name = f"{output_directory}attack_{row.iloc[0]}.py"
    # 写入文件
    with open(file_name, 'w') as f:
        f.write(generated_text)

然后写一个代码来动态引入python文件并且执行

def execute_attacks(directory, url, cookie):
    # 遍历指定目录中的所有Python文件
    for filename in os.listdir(directory):
        if filename.endswith('.py'):
            file_path = os.path.join(directory, filename)

            # 动态导入Python文件
            spec = importlib.util.spec_from_file_location(filename[:-3], file_path)
            module = importlib.util.module_from_spec(spec)
            spec.loader.exec_module(module)

            # 检查是否存在attack函数
            if hasattr(module, 'attack'):
                attack_func = getattr(module, 'attack')

                # 执行attack函数
                try:
                    result = attack_func(url, cookie)
                    print(f"执行 {filename} 中的attack函数,结果: {result}")
                except Exception as e:
                    print(f"执行 {filename} 中的attack函数时出错: {str(e)}")
            else:
                print(f"{filename} 中没有找到attack函数")

大大减少手写测试用例的工作量,提高测试效率,而且可复用,方便后续持续验证产品。并且如果发现不理想的代码,可以挑出来再让大模型重新生成。

工具-winget

作者 xiejingyang
2024年7月1日 09:48

起因是我去研究了下tauri,发现了其中的一条rust环境安装命令:

winget install --id Rustlang.Rustup

winget 支持安装多种类型的软件和服务,包括但不限于以下几类:

开发工具:如 Visual Studio Code、Git、Node.js 等。
浏览器:如 Google Chrome、Mozilla Firefox、Microsoft Edge 等。
办公软件:如 Microsoft Office、LibreOffice 等。
媒体播放器:如 VLC Media Player、Spotify 等。
压缩工具:如 7-Zip、WinRAR 等。
安全软件:如 Avast、Bitdefender 等。
虚拟化和容器工具:如 Docker、VirtualBox 等。
数据库管理工具:如 MySQL、PostgreSQL 等。

可以通过以下命令查看可用的软件和服务:

winget search <关键词>

例如,搜索所有可用的数据库管理工具:

winget search database

winget 的软件库不断更新和扩展,因此几乎涵盖了常见的所有软件需求

而且install命令还支持YAML格式的列表,感觉是可以通过列一个清单来进行环境初始化了?以后有新电脑了试试。

大模型-MoA方法尝试

作者 xiejingyang
2024年6月22日 15:19

由开源大模型API提供机构Together提出,论文地址

这篇论文探讨了一种称为混合代理(Mixture-of-Agents, MoA) 的方法,旨在提升大型语言模型的能力。混合代理(Mixture-of-Agents, MoA) 方法的核心思想是利用多个代理之间的协作现象来提升大型语言模型的能力。这些代理通过协作和信息共享,能够更有效地处理复杂的任务和提高模型的整体性能。
MoA方法在自然语言理解和生成任务中表现出色,尤其是在推理任务(如MATH数据集)中显著提高了模型的准确性和效率。通过这种协作机制,MoA方法能够充分发挥每个代理的优势,从而提升整体模型的能力。
从代码不难看出,实际上该方法就是定义了很多个不同的大模型:

default_reference_models = [
    "Qwen/Qwen2-72B-Instruct",
    "Qwen/Qwen1.5-72B-Chat",
    "mistralai/Mixtral-8x22B-Instruct-v0.1",
    "databricks/dbrx-instruct",
]

然后对于用户的输入问题,使用上述定义的所有大模型进行回答:

with console.status("[bold green]Querying all the models...") as status:
    for i_round in range(rounds):
        eval_set = eval_set.map(
            partial(
                process_fn,
                temperature=temperature,
                max_tokens=max_tokens,
            ),
            batched=False,
            num_proc=num_proc,
        )
        references = [item["output"] for item in eval_set]
        data["references"] = references
        eval_set = datasets.Dataset.from_dict(data)

其中的process_fn就是用模型进行回答。将所有模型的回答统计到一起之后,再使用一个模型来进行总结:

output = generate_with_references(
    model=model,
    temperature=temperature,
    max_tokens=max_tokens,
    messages=data["instruction"][0],
    references=references,
    generate_fn=generate_together_stream,
)

这就完成了所谓的MoA,这其实和我改造的MetaGPT的使用方法一样,但是MetaGPT的方法有一个更好的点在于每个Agent都是经过精心编写的提示词,而这个MoA并没有,而且MetaGPT为每个Agent选择最合适的大模型之后,和这个所谓的MoA其实没什么区别。

Together是想通过多个臭皮匠来顶一个诸葛亮,但是达到的效果是多个臭皮匠顶不了诸葛亮,只能达到多个臭皮匠中最强的那个臭皮匠的能力,再多的臭皮匠得出的结论99%也是臭皮匠的结论,只不过是5条臭皮匠的结论变成了10条。我测试的3.5Sonnet和GPT 4o回答的效果都是特别好的,几乎趋近甚至超越我。在大模型中,最重要的还是模型本身,其次是提示词,再次才是工程化,想通过工程化来提高模型回复的能力,这条路走的注定比前面两条路要更难。

Java-动态接口地址

作者 xiejingyang
2024年6月1日 13:35

为了高系统的安全性并且有效隐藏接口信息,我们决定采用动态化接口地址的方式来防止被恶意扫描和利用。Spring框架提供了便捷的Path参数功能,使得动态化接口地址的实现变得轻而易举。

这个设计的思路来自TOTP(基于时间的一次性密码)技术,通常用于双因素验证的情况,比如游戏的动态令牌。借鉴这个思路,通过计算当前时间戳,可以在一段时间内生成相同的结果,这个结果被用于作为Path参数的校验,如果Path参数值和服务端计算出来的不同则返回404模拟接口不存在。并且Path参数应该允许5秒左右的延迟。

代码大概如下:

@RestController
public class DynamicPathController {

    private static final String SECRET_KEY = "your-secret-key";
    private static final long TIME_STEP = 30;
    private static final long WINDOW_SIZE = 5;

    @GetMapping("/api/{path}")
    public String getApi(@PathVariable("path") String path) {
        if (isValidPath(path)) {
            // 处理实际的接口逻辑
            return ResponseEntity.ok("Valid path parameter received");
        } else {
            // 返回404状态码,模拟接口不存在
            return ResponseEntity.status(HttpStatus.NOT_FOUND);
        }
    }

    private boolean isValidPath(String path) {
        long timestamp = System.currentTimeMillis();
        return path.equals(generatePath(timestamp)) || path.equals(generatePath(timestamp - WINDOW_SIZE * 1000));
    }

    private String generatePath(long timestamp) {
        long timeSlice = timestamp / TIME_STEP;
        String message = SECRET_KEY + timeSlice;

        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] hash = md.digest(message.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : hash) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("无法生成Path参数", e);
        }
    }
}

这种方式提高了一部分安全性,但仅限于防止恶意扫描的情况,如果是客户端被逆向,这种方式就失去作用了,需要使用更多的安全措施来进行安全保障。

大模型工具-Shell Helper

作者 xiejingyang
2024年5月25日 22:50

https://github.com/xieisabug/shell-helper

根据原repo汉化并稍加修改而来:https://github.com/76616c6172/shell-helper

替换了原来调用的openai gpt4o,用了更加经济的yi-large-turbo,用来提示shell脚本是完全没问题了,但是再向下调整,给出来的命令几乎就不可用了。

主要思路就是让大模型根据需求,给出带有shell脚本的代码块,然后用python代码去匹配markdown代码块然后根据用户的输入来使用python进行运行或者复制。

技术上没啥好分享的,重要的是这个使用大模型的思路,平时的一些比较琐碎的烦恼都能够将一部分丢给LLM来解决。

❌
❌