跑通Agent的过程其实主要是在让LLM跑通以下链条:
有什么工具 → 当前需要用什么工具 → 结构化返回工具和参数 → 本地调用对应工具 → 得到最终结果
上述链条所有的实现均离不开prompt,因此我们可以将链条转换为以下两个问题:
- 问题一:如何在prompt中告知LLM可用工具及工具用途?
- 问题二:如何在prompt中约束LLM结构化返回工具和参数?
完成上述两个问题后Agent其实就可以完成单一工具的问题了,此时将会有一个新的问题:
- 问题三:如何在prompt中约束LLM有次序的选择工具完成复杂任务?
本篇文章将针对上述问题进行简单总结
注意:出于简洁便于理解的意图,本篇文章中大面积结合 LangChain 实现。
一. 如何在prompt中告知LLM可用工具及工具用途?
利用LangChain我们可以先将工具及其信息生成一个工具对象,这及便于管理也便于后续对工具的调用,如下:
from langchain.tools import StructuredTool
tool = StructuredTool.from_function(
func=func,
name="ToolName",
description="xxx",
)
参数解析:
func
传入我们已经实现的工具函数name=
对该工具的命名description
对该工具用途的描述
之后我们在写prompt的同时便可将工具及其信息一同写入,该步骤同样可用LangChain的接口实现。
from langchain_core.tools import render_text_description
with open(path, "r", encoding="utf-8") as f:
main_prompt = ChatPromptTemplate.from_messages(
[
HumanMessagePromptTemplate.from_template