Log in to leave a comment
No posts yet
像 Cursor 或 Devin 这样的工具固然方便。但由于很难看清其内部的具体运作机制,有时它们会以我不希望的方式对代码进行“乱砍滥伐”。对于后端开发人员来说,将 Python 标准库与 LLM API 结合,亲手打造最适合自己的 Agent,反而更加经济且可靠。
要让 Agent 超越单纯编写代码的阶段,进而直接执行终端命令,就需要精细地操控 subprocess 模块。如果盲目使用 shell=True 选项,不仅会暴露在 shell 注入攻击的风险之下,还可能导致进程在超时情况下无法关闭,像僵尸一样残留。
在自行实现时,请在调用 subprocess.run() 时设置 shell=False,并将命令以列表形式传递。建议将超时时间设为 30 秒左右的短时限,一旦触发 TimeoutExpired 异常,必须立即调用 process.kill() 以回收资源。在向模型传递执行结果时,也没必要发送全部内容。如果文本超过 1,000 字,请截取最后 20 行左右进行返回。这既能节省 Token 浪费,也足以让模型分析出错误原因。
对话越长,堆积在上下文窗口(Context Window)中的数据就会演变成“计费炸弹”。根据 Anthropic 发布的消息,在 Claude 3.5 模型中使用 cache_control 标记,读取缓存数据的成本最高可节省 90%,每 100 万 Token 仅需 0.30 美元左右。
为了降低成本,请严格区分系统消息和用户输入。将项目文件树结构等固定不变的信息固定在系统提示词顶部,并设为缓存点。当对话记录堆积导致 Token 溢出时,可以使用 tiktoken 计算量级,然后通过层级化摘要(Hierarchical Summarization)方式,利用另一次 LLM 调用对旧消息进行总结。通过这种只在顶部保留摘要上下文并附加最新消息的滑动窗口机制,即使在长时间的开发会话中,也能在节省 40% 以上成本的同时,保障模型的推理准确度。
让 Agent 重新输出整个文件的方式既笨拙又缓慢。输出 Token 越多,模型遗漏中间代码或胡言乱语的概率就越高。所谓的“编辑技巧(Edit Trick)”会诱导模型仅查找并替换需要修改部分前后的文本(Anchor)。这种技术在实际数据中最高可减少 86% 的输出 Token 量。
利用 Python 的 re.sub(),根据特定的 XML 标签或正则表达式来实现将修改内容应用到本地文件的功能。此外,不要将所有技术文档都塞进提示词,而应通过连接像 LanceDB 这样轻量级的向量数据库(Vector DB),只调取必要的文档片段。具备这种结构后,文件修改速度感官上可提升 79% 以上,并能解决处理大文件时模型经常表现出的“不知所措”的顽疾。
我们应该停止手动复制调试消息并粘贴给模型这种费力活。在 Agent 编写代码之前,先让它编写基于 pytest 的测试代码。
构建一个反馈回路:当测试失败时,将产生的 Traceback 全文不加修饰地重新扔给模型,让其自行修复。不过,对于 rm 或 deploy 等危险命令,必须使用 Python 的 input() 函数插入需要用户确认的安全护栏。一旦这种循环结构完成,开发人员只需确认 Agent 提交的 git diff 摘要,然后点击提交按钮即可。
归根结底,构建 Agent 的核心不在于华丽的框架,而在于终端与 LLM 之间数据精炼与缓存的精细程度。你自己写的 600 行 Python 代码,可能比数万行的“黑盒”工具更能理解并执行你的意图。