在 Dify 的 agent 的 prompt 中实现调用工具的方法如下:
此外,当模型判断需要调用工具函数时,即检测到返回的 json 里面 function_call 字段不为空,则执行异步函数调用,可通过判断返回的 functionCall 的名称来执行不同的函数并返回结果。
在提升可控性方面,有以下建议:
本文采用的提示词工程主要有两部分代码组成:提示词注入和工具结果回传。提示词注入用于将工具信息以及使用工具的提示词添加到系统提示中。工具结果回传则是解析tool calling的输出,并将工具返回的内容再次嵌入LLM。[heading2]1、提示词注入阶段[content]INSTRUCTION为最后注入到系统提示中的字符串,他又包含了TOOL_EAXMPLE、tools_instructions、REUTRN_FORMAT三个部分。TOOL_EAXMPLE用于提示LLM如何理解tool以及如何使用tool。在编写TOOL_EAXMPLE时,请注意用一些无关紧要的工具作为示例,例如本文使用的将数字加一和数字减一的工具,从而避免LLM混淆真正可以使用的工具与示例工具。tools_instructions是由目前通用的工具字典转换成LLM可读的工具列表。实际使用LLM时,可以通过输入不同的工具来动态调整tools_instructions,让LLM得知目前可用的工具有哪些以及如何使用。REUTRN_FORMAT定义了调用API的格式。[heading2]2、工具结果回传阶段[content]利用正则表达式抓取输出中的"tool"和"parameters"参数。对于interpreter工具,使用了另一种正则表达式来提取LLM输出的代码,提高LLM使用interpreter工具的成功率。本文使用代码如下:通过识别LLM返回的调用工具的字典,提取出对应的值,再传入相应的工具函数,最后将工具返回的结果以observation的角色返回给LLM。对于一些不接受observation、tool、function角色的LLM接口,可以改为回传给user角色,例如:通过以上提示词工程,可以避免微调,让完全没有tool calling能力的LLM获得稳定的tool calling能力。
[title]游戏实操|利用LLM进行环境叙事和解谜——《Im Here2》[heading1]三、Demo实现[heading2]3.2提示词设计具体而言,当模型判断需要调用工具函数时,即检测到返回的json里面function_call字段不为空,则执行异步函数调用,这里采用回调的方式以获取函数返回的结果。通过判断返回的functionCall的名称来执行不同的函数,执行逻辑同时返回结果。1.对守卫者和指引者一类具有单一明确任务的代理来说,虽然不同代理负责不同的谜题如一般谜题和世界观谜题,但由于指令结构的存在保持着一定的兼容性,所以只要调试出一个可行的结构,进一步更换谜题和回答正确后提供的线索即可。在这里调试它们的指示预设更像是尝试使它们输出特定的内容,有点像:《完蛋!我被LLM包围了!》,感兴趣的可以试玩一下:[https://huggingface.co/spaces/LLMRiddles/LLMRiddles](https://huggingface.co/spaces/LLMRiddles/LLMRiddles)[https://modelscope.cn/studios/LLMRiddles/LLMRiddles/summary](https://modelscope.cn/studios/LLMRiddles/LLMRiddles/summary)这里举了两个有不同谜题的代理示例,可以试着一段段输入测试查看模型输出的结果,指令预设如下:守卫者1:【角色预设+谜题】
上面讲到了4种实现Function Calling的方式:Json Output:通过Prompt的方式让模型输出JSON格式内容优劣势:Prompt麻烦,输出不稳定,串业务成本高Json Mode:官方Josn Output,1106与Tools同期推出优劣势:JSON格式稳定,但实际上它与Tools的适用场景是不同的,JSON mode是为了输出JSON存在的,而Tools是为了Call API存在的Function Calling和Tools就不再赘述但是从可控的角度来说,还是会推荐Function Calling和Tools来实现。1、放弃JSON mode:随着模型能力提升,模型能够准确地输出JSON,但是它还是会出错,不能保证100%正确;模型厂家对Function Calling是有微调优化的,也有说法是专门的MOE专家,但是无从验证;2、降低System prompt依赖,化繁为简S yste m prompt里面写的东西太多了,你不能保证模型能很好地遵循它;能在Tools里面去写的东西,尽量写在Tools里面3、API Response增强Prompt:其实所有输入给模型的内容,都可以算作是Pormpt。同理,Tools调用的结果也就是API Response也会被返回给到模型。可以在这一步增加一些给大模型的约束和提示,这里的准确率非常高,毛估估95%以上。4、尽量让模型做选择,而不是填空把确定的答案做成选项给到模型,比如用Enum的方式。一方面减少token的输出,提高速度;另一方面,准确率高5、利用Tools来做Route,构建Multi Agent一个不行就上两,两个不行就上四。术业有专攻,Agent的世界也一样。