在人工智能技术日益复杂、大模型不断推陈出新的当下,知名Go语言专家Thorsten Ball以315行代码构建编程智能体的举动,无疑是向大众展示了技术“祛魅”的可能。这位凭借《用Go语言自制编译器》《用Go语言自制解释器》两部著作,成为编译原理领域“入门平替”的技术大牛,再次用实际行动践行了自己一贯的理念——通过开源项目和实践,揭开技术的神秘面纱,让更多人得以一窥智能体构建的核心奥秘。
对于多数人来说,智能体编辑文件、运行命令、自行解决错误的过程,听起来充满了高深莫测的技术门槛。但Thorsten Ball的实践证明,构建一个小型编程智能体,并非遥不可及。其核心要素不过是一个大语言模型、一个循环结构,以及足够的tokens。整个过程,甚至不需要400行代码,其中大部分还是常规的样板代码。这颠覆了人们对智能体开发的固有认知,展现出技术背后的简洁本质。
在构建智能体的初始阶段,准备工作就像是为创作搭建舞台。首先要获取GoANTHROPIC_API_KEY,这是与Claude模型进行交互的关键凭证。接着,通过四个简单的命令设置新的Go项目,在main.go文件中搭建起基础框架。虽然此时的代码尚不能直接编译,但已经构建出了一个Agent,它能够访问anthropic.Client,从终端的标准输入读取用户消息,为后续的交互奠定基础。
智能体运行的核心,在于添加Run()方法。这部分代码虽然只有90行,却承载着与Claude对话的关键逻辑。其中的循环结构,如同智能体的“呼吸”,持续不断地推动着交互进程。它先打印提示询问用户输入,将用户的消息添加到对话中,发送给Claude,接收Claude的回复后,再将回复加入对话并打印,随后又开始下一轮循环。这一过程,其实与日常使用的AI聊天应用原理相同,只不过是在终端环境中实现。运行该程序,用户便能与Claude展开对话,且对话能够在多个回合中保持连贯,Claude会记住对话中的关键信息,这得益于每次都将整个对话发送给模型。不过,需要注意的是,Anthropic的服务器是无状态的,维护对话上下文的任务由客户端完成。
然而,仅仅实现对话功能,还不足以称之为智能体。智能体的关键特征,在于具备访问工具的能力,能够修改上下文窗口之外的内容。Thorsten Ball对工具的定义十分清晰:向模型发送特定的prompt,告知其在想要使用工具时以特定方式回复;接收消息后,执行该指令并返回结果。其他的功能实现,都是在这个基础上进行的抽象。就像与朋友约定特定信号来传达指令一样,在与Claude交互时,也可以设定类似的“信号”。例如,告诉Claude,当它想知道天气时,就用“get_weather”来表示。模型经过训练和微调,能够理解并使用这些“工具”,因为它们在一定程度上“知道”自身信息的局限性,需要借助外部工具获取更多信息。
在构建工具的过程中,以read_file工具为例,每个工具都需要明确名称、描述、输入模式和实际执行函数这几个要素。名称用于唯一标识工具;描述则详细告知模型工具的功能、适用场景和返回值等信息;输入模式通过JSON schema来定义工具期望的输入形式;实际执行函数则负责使用模型发送的输入执行具体操作并返回结果。将这些工具定义发送给模型后,模型在需要时会触发工具调用。但在初始阶段,智能体还无法识别模型发出的工具使用请求,通过替换智能体的Run方法,增加对模型回复内容类型的判断,当检测到“tool_use”类型时,调用executeTool函数,在本地注册表中查找工具,解析输入并执行,将结果返回给模型,从而实现工具的完整调用流程。
有了read_file工具的基础,Thorsten Ball还进一步介绍了添加list_files(列出文件)和edit_file(编辑文件)等工具的方法。通过这些工具的组合使用,智能体能够完成从文件读取、内容查看,到文件编辑等一系列复杂任务。用户无需详细指导智能体在何种情况下使用哪个工具,只需提出解决问题的需求,智能体就能自主判断并调用合适的工具,展现出一定的自主性和智能性。
Thorsten Ball的这个编程智能体项目,虽然无法与Claude、Gemini等推出的编码功能相媲美,但却为初学者提供了一个绝佳的学习范例。它打破了智能体开发的技术壁垒,以简洁的代码和清晰的逻辑,向人们展示了智能体的运行原理和构建过程。这种开源和实践导向的方式,不仅降低了技术学习的门槛,更激发了开发者探索智能体技术的热情,让更多人有机会参与到人工智能的开发和应用中,推动技术的普及和创新。
完

