返回首页
最新
大家好,
我一直在考虑如何提升自己在Go语言方面的能力,但一直没有合适的想法来展示这一点。我想,也许可以利用Go在基于API的解决方案和工具方面的高性能特点。
特别是,我想确保Go的goroutine能够很好地处理一些分发任务,例如接收请求、记录日志和发布事件,而不会显著降低性能。
我在AWS方面有相当多的经验,尤其是在无服务器架构方面。基本上,除了EventBridge之外,没有其他调度选项,尽管它有一个不错的免费套餐。但是,如果你不在AWS的基础设施内,那就另当别论了,因为基础设施本身可能会很昂贵,尤其是在他们取消了“12个月试用”政策之后。
因此,我想到了像“服务化的cron”这样的方案,作为一个不错的起点。
我决定采用一个简单的技术栈:Go API服务器、Postgres、Redis作为任务队列和缓存,所有这些都运行在一个每月5欧元的Hetzner VPS上,后面使用Caddy进行反向代理。
我了解到可以将Redis用作队列。因此,我也想尝试一下——通过LPUSH/BRPOP实现任务队列,并使用5分钟的TTL来缓存API密钥,这样可以减少每个经过身份验证的请求对Postgres的调用次数。
为了验证性能,我在欧洲内部进行了基准测试——10,000个请求,100个并发,针对实时API:
请求/秒:621
平均延迟:158毫秒(网络主导——服务器位于德国Hetzner)
p99:442毫秒
最快:84毫秒
大部分延迟是由于跨欧洲的往返时间。实际的服务器处理时间——Go处理程序 + 本地Postgres查询——要少得多。但这仍然是针对一个非常基础的Hetzner VPS实例。
我非常希望能得到任何反馈——特别是关于调度器设计以及工作池方法是否能够处理实际负载的意见。
嘿,HN,
我们厌倦了浏览器框架对大型语言模型(LLM)的限制,因此我们去掉了框架,让LLM可以自由发挥,尽情使用它所训练的内容。我们赋予了这个工具自我纠正的能力,并允许LLM在需要时添加新工具(如果它已经预训练过的话)。
我们的浏览器使用库包含数万行确定性的启发式代码,封装了Chrome(CDP websocket)。包括元素提取器、点击助手、目标管理(超级痛苦)、监控程序(崩溃处理、文件下载、警报)、跨域iframe(如果你想点击一个元素,必须先切换目标,这非常麻烦)等。
监控程序特别痛苦,但却是必需的。例如,如果Chrome触发了一个本地文件弹出窗口,代理就会完全卡住。因此,有两种解决方案:
1. 一一编码这些启发式和边缘情况并加以防范
2. 给LLM一个工具来处理这些边缘情况
可以想象,这样的启发式代码数量庞大,因此如果你选择第二种方案,最终会得到很多工具。所以你必须做出妥协,干脆编码这些启发式代码。
但是,如果LLM“知道”CDP足够好,能够在遇到跨域iframe时切换目标,在警报出现时将其关闭,编写自己的点击助手或上传功能,那么你就不必担心这些边缘情况了。
事实证明,现如今LLM对CDP的理解相当不错。因此,我们对这个工具进行了“苦涩的调整”。应该保留下来的概念有:
- 一个保持CDP websocket活跃的东西(守护进程)
- 极其基础的工具(helpers.py)
- 解释如何使用的skill.md
新的范式是什么?SKILL.md + 几个需要能够动态更改的Python助手。
一个很酷的例子:
我们忘记实现upload_file函数。然后在任务进行中,代理想要上传一个文件,于是它搜索helpers.py,什么也没找到,结果自己用原生的DOM.setFileInputFiles编写了这个函数(我们后来在git diff中才注意到这一点)。这是一个非常神奇的时刻,展示了LLM的强大。
与其他方法(Playwright MCP、浏览器使用CLI、代理-浏览器、Chrome开发者工具MCP)相比:它们都将Chrome封装在一组预定义的函数中供LLM使用。最糟糕的失败模式是沉默。LLM的click()返回正常,因此LLM认为它已经点击了,但在这个特定网站上实际上什么也没发生。它继续前进,带着一个错误的世界模型。浏览器工具为LLM提供了最大的自由和完美的上下文,帮助它理解工具的实际工作方式。
以下是浏览器工具可以做的一些疯狂示例:
- 玩国际象棋引擎Stockfish [链接](https://x.com/shawn_pana/status/2046457374467379347)
- 在俄罗斯方块中创下世界纪录 [链接](https://x.com/shawn_pana/status/2047120626994012442)
- 找到用JavaScript画心形的方法 [链接](https://x.com/mamagnus00/status/2046486159992480198?s=20)
你可以通过告诉Claude代码轻松安装它:
`为我设置 <a href="https://github.com/browser-use/browser-harness">https://github.com/browser-use/browser-harness</a>。`
仓库:[链接](https://github.com/browser-use/browser-harness)
你会如何称呼这个新范式?一种方言吗?
我的公司开始探索人工智能编程。我是一名拥有20多年经验的开发人员,负责帮助公司了解如何利用这一工具。我只使用过Claude,因此我的经验仅限于此。
正如你可能猜到的,我发现人工智能在某些方面非常出色,而在其他方面则表现得相当糟糕。我所阅读的许多内容和观看的演示都与合理的代码库有关。然而,我们的代码库并不合理。它已有超过20年的历史,由多位不同的开发人员编写,风格、设计模式各异……这正是一个小公司经过数十年缓慢发展所能预期的情况。我还在医疗领域工作,因此缓慢演变的旧代码库是常态。
人工智能不断失败的原因之一是它无法理解整个代码库的上下文。它无法在每个会话中保持这种上下文。因此,除非有一位熟悉系统的技术开发人员进行指导,否则它会主动向系统添加冗余内容。我在尽可能的情况下使用记忆功能,但它必须定期读取大量代码,这会消耗很多令牌。我在专业账户上经常达到使用限制。
你对此有什么经验吗?有没有提高输出和降低成本的技巧或建议?任何帮助都非常感谢。谢谢!
以下是我为何/如何构建TurboPentest的故事。TurboPentest是为人工智能时代而设计的,旨在应对当前由编码助手生成的大量代码及其带来的相关安全漏洞。