本页目录
为 LLM 提供工具,需要通过 系统提示词可以为 LLM 提供工具。系统提示词只是消息历史中的另一条消息,用来告诉 LLM 应该做什么;在这里,它还会说明模型可以调用哪些工具。
每个工具都需要提供三项信息:
- 工具名称,例如
writeFile) - 工具描述,例如“把文件写入文件系统”
- 工具接收的参数及其类型,例如
pathandcontent)
这些参数使用 JSON Schema 定义,因此可以传入 JSON Schema 支持的任何内容,例如对象、数组和其他复杂类型。
工具定义会被注入系统提示词,其他系统提示信息则放在它们下面。这里没有什么神秘机制,只是把工具定义写进系统提示词。
LLM 选择工具
当我们要求 LLM 选择工具时,神奇的部分开始了。系统提示词告诉它“你可以使用以下工具”,随后用户消息要求“新建一个名为 .gitignore 的文件”。
随后会收到一条助手消息,其中包含一次 工具调用 。这只是 LLM 发出的指令,用来说明应该调用哪个工具。它带有一个 id ,并包含所需参数。
在这个例子中,指令要求向“.gitignore”路径写入一个空文件。
想继续深入: 加入“面向真正工程师的 AI 编码”候补名单
工具调用与工具执行
工具调用只是说明应该调用哪个工具的指令。此时什么都还没有发生,助手只是生成了一条消息,仅此而已。
接下来需要在我们的机器上执行工具。LLM 已经生成消息,但真正创建文件的操作仍要由本机应用执行。
实现要求
这意味着系统提示词中的每个工具,都需要在代码库中有一个与之对应的函数。
如果工具执行成功,我们会向 LLM 返回一条用户消息,其中带有与前一次工具调用相同的 id ,并说明工具执行后发生了什么。
处理错误
错误处理非常重要。如果执行工具时发生错误,需要把错误消息展示给 LLM,让它调整后续操作。
因此,一条 工具结果 既可能表示成功,也可能表示失败。
完整流程
再完整梳理一遍整个流程:
- 在系统提示词中定义工具:“你可以使用以下工具……”并传入一组 JSON Schema
- 发送用户消息:“新建一个名为 .gitignore 的文件”(不必明确说“调用这个工具”,LLM 会自行决定调用哪个工具)
- LLM 生成包含正确参数的工具调用消息
- 应用识别工具调用消息,并在本机执行
- 应用通过消息返回执行结果
- LLM 看到完整历史,并返回总结
在这个例子中,它回答:“完成了。里面应该写什么?”
工具总结
这就是工具:让 LLM 生成特定类型的消息,应用拦截消息、在本机执行操作,再把结果返回给 LLM。
只靠这个简单循环,就能构建非常强大的应用。