要在 Dify 的 agent 的 prompt 里让 DeepSeek 通过 Function Calling 调用工具,您可以参考以下内容:
本文采用的提示词工程主要有两部分代码组成:提示词注入和工具结果回传。提示词注入用于将工具信息以及使用工具的提示词添加到系统提示中。工具结果回传则是解析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:【角色预设+谜题】
其实只要看过官方文档的应该都能知道,大模型请求中,最大的两个变量:Messages和Tools。Messages里面放的是sys prompt,memory,user query;Tools里面放的是一些能力的Json Scheme;而这两者组合在一起,就形成整个完全的Prompt。所以Agent应用开发的本质是什么?动态Prompt拼接。通过工程化的手段,不断把业务需求转述成新的prompt。短期记忆:messages里的历史QA对;长期记忆:summary之后的本文,再塞回system prompt;RAG是啥?向量相似性检索,然后放在system prompt里或者通过tools触发检索Action:触发tool_calls标记,进入请求循环,拿模型生成的请求参数进行API request,再把结果返回给大模型进行交互;没有tool_calls标记了,循环结束。对应页面上就是对话一轮对话结束。Multi Agents是啥?把system prompt和tools换一换,A就变成B了。还有啥?没了呀,本质就是这些东西。当然,这也就是最基本的原理,想做深,做好,肯定还有很多坑需要踩。