当前位置: 首页> 游戏> 游戏 > 如何做微信小程序游戏_陕西网站建设厦门网站制作_企业文化建设方案_百度招聘电话

如何做微信小程序游戏_陕西网站建设厦门网站制作_企业文化建设方案_百度招聘电话

时间:2025/8/2 5:14:45来源:https://blog.csdn.net/qq_42402854/article/details/146502036 浏览次数:2次
如何做微信小程序游戏_陕西网站建设厦门网站制作_企业文化建设方案_百度招聘电话

一、工具(Function Calling)简介

Spring AI Alibaba工具(Function Calling):https://java2ai.com/docs/1.0.0-M6.1/tutorials/function-calling/

1、工具(Function Calling)

“工具(Tool)”或“功能调用(Function Calling)”允许大型语言模型(LLM)在必要时调用一个或多个可用的工具,这些工具通常由开发者定义。工具可以是任何东西:网页搜索、对外部 API 的调用,或特定代码的执行等。

LLM 本身不能实际调用工具;相反,它们会在响应中表达调用特定工具的意图(而不是以纯文本回应)。然后,我们应用程序应该执行这个工具,并报告工具执行的结果给模型。

通过在请求中声明一个或多个工具,当 LLM 可以访问工具时,它可以在合适的情况下决定调用其中一个工具,这是一个非常强大的功能。

比如说,googleSearch 和 sendEmail 工具,并且有一个查询像是“我的朋友想了解 AI 领域的最新新闻。将简短的总结发送到 email.com”,那么它可以使用 googleSearch 工具查找最新新闻,然后总结这些信息并通过 sendEmail 工具将总结发送到指定的邮箱。

2、API 概览

通常,自定义函数需要提供一个 name、description 和 function call signature,以便模型知道函数能做什么、期望的输入参数。

Spring AI 使这一过程变得简单,只需定义一个返回 java.util.Function 的 @Bean 定义,并在调用 ChatModel 时将 bean 名称作为选项进行注册。

在底层,Spring 会用适当的适配器代码包装你的 POJO(即函数),以便与 AI 模型进行交互,免去了编写繁琐的样板代码。FunctionCallback.java 接口和配套的 FunctionCallbackWrapper.java 工具类包含了底层实现代码,它们是简化 Java 回调函数的实现和注册的关键。

在这里插入图片描述

二、工具(Function Calling)使用

示例需求: 我们将创建一个聊天机器人,通过调用我们自己的函数来回答问题。

为了支持聊天机器人的响应,我们将注册一个自己的函数,该函数接受位置信息并返回该位置的天气。

当模型需要回答诸如 “What’s the weather like in Boston?” 这样的问题时,AI 模型将调用客户端,将位置值作为参数传递给函数。这种类似 RPC 的数据将以 JSON 格式传递。

我们的函数调用某个基于 SaaS 的天气服务 API,并将天气响应返回给模型以完成对话。

1、自定义函数

使用 ToolCallback接口。

这里定义一个 RealTimeWeatherFunction函数来获取实时天气信息。

/*** 获取实时天气信息*/
@Slf4j
@Component
public class RealTimeWeatherFunction implements ToolCallback {@Overridepublic ToolDefinition getToolDefinition() {ToolDefinition toolDefinition = DefaultToolDefinition.builder()//.name(getName()).name("realTimeWeatherFunction").description("获取实时天气信息")// inputSchema值为:JSON字符串.inputSchema("""{"city": {"type": "string","description": "城市名"},"days": {"type": "integer","description": "天数"},"hours": {"type": "integer","description": "小时数"}}""").build();log.info("RealTimeWeatherFunction --> getToolDefinition方法,toolDefinition = {}", toolDefinition);return toolDefinition;}/*** @param toolInput JSON字符串为 getToolDefinition方法中定义的 inputSchema*                  model.* @return*/@NotNull@Overridepublic String call(String toolInput) {log.info("RealTimeWeatherFunction --> call方法,toolInput = {}", toolInput);if (StringUtils.isBlank(toolInput)) {return null;}// TODO 模拟西安未来5天天气状况的数据String weatherData = getWeatherData();return weatherData;}public String getWeatherData(){return """嗯,用户问的是西安未来24小时和15天的天气情况,我得先看看搜索结果里的各个网页内容。首先,今天是2025年3月25日,所以得找最新的信息。网页1提到从3月26日开始陕西会有寒潮,大风沙尘天气,最高气温降幅可达20℃。不过用户关心的是未来24小时,也就是到3月26日的天气。网页1里的西安三日天气显示,今天(25日)晴,14℃~29℃;明天(26日)多云,14℃~25℃。不过这个网页的发布时间是3月25日8点21分,应该是最新的。网页2是天气网的7天预报,显示25日(今天)晴,27/13℃,也就是最高27℃,最低13℃?不过网页1里的今天温度是14℃~29℃,这可能存在矛盾。需要确认哪个更准确。网页3发布于3月25日0点,提到今天(25日)晴天间多云,16时气温21.2℃~32℃,可能用户所在时间不同,但今天白天的最高气温在网页3里提到是29℃。而网页7提到3月25日西安最高气温可达29℃,所以可能网页1的今天温度是14℃~29℃,但实际可能更高,比如网页7提到24日最高气温32℃,25日可达29℃。但用户问的是未来24小时,也就是从今天3月25日到3月26日的天气。网页2的天气预报显示26日多云,26/11℃,也就是最高26℃,最低11℃,但网页1里的明天(26日)是14℃~25℃,这里也有不一致。可能网页1的数据更准确,但需要结合其他网页。网页3提到26日夜间至28日有寒潮,26日夜间开始降温,风力加大到4-5级,阵风6级以上,并伴有沙尘。所以未来24小时可能包括26日白天,而26日白天可能多云,温度在25℃左右,但到夜间开始降温。网页3的具体预报显示26日晴转多云,夜间有5级阵风,浮尘,12℃~27℃。所以未来24小时到26日晚上,温度可能在12℃到27℃之间,但夜间开始降温,并有大风和沙尘。关于15天的天气,网页2提供了7天的预报,但用户需要15天。不过搜索结果里没有直接的15天数据,可能需要根据现有的7天预报和趋势来推断。网页2的7天预报显示到31日都是多云或阴天,气温逐渐回升,但可能之后会有更多变化,但具体无法确定。网页6提到寒潮影响持续到3月30日左右,最低气温出现在29日夜间到30日凌晨。网页3的预报显示到31日气温回升到4℃~18℃,但可能之后继续回升。不过只能根据现有数据尽量总结。此外,沙尘和霜冻的情况需要注意。网页1、3、5、6都提到沙尘天气,尤其是26日至27日。霜冻出现在27日至31日,尤其是山区。森林火险红色预警在网页4提到,需要注意防火。综合以上信息,未来24小时应该是今天(25日)晴,高温29℃,夜间转多云,26日白天多云,可能有浮尘,温度在14℃到25℃之间,但夜间开始剧烈降温,风力加大。而15天的天气可能前7天有详细数据,后续只能根据趋势推测,但需要说明可能的不确定性。""";}
}

函数调用某个天气服务 API逻辑替换为 同样的用户问题返回 deepseek的推理信息。

deepseek的推理信息如下:

在这里插入图片描述

2、编写 Controller接口

在 Prompt 请求中指定函数有几种方式:

  • 全局设置默认函数集合
  • ChatModel请求中指定函数集合

在普通 Controller Bean 中注入 ChatModel 实例,并为 Prompt 指定函数,实现下面几个功能:

  • 简单调用
  • 流式调用
/*** “工具(Tool)”或“功能调用(Function Calling)”允许大型语言模型(LLM)在必要时调用一个或多个可用的工具,这些工具通常由开发者定义。**/
@Slf4j
@RestController
@RequestMapping("/dashscope/function-calling")
public class DashScopeFunctionCallingController {private final ChatModel dashScopeChatModel;/*** 使用如下的方式自动注入 ChatModel** @param chatModel*/public DashScopeFunctionCallingController(ChatModel chatModel) {this.dashScopeChatModel = chatModel;}/*** 编程方式自行创建一个 ChatClient.Builder 实例.* 使用自动注入 ChatModel** @param chatModel*///public DashScopeFunctionCallingController(ChatModel chatModel) {////    this.dashScopeChatModel = chatModel;////    // 构造时,可以设置 ChatClient 的参数//    // {@link org.springframework.ai.chat.client.ChatClient};//    this.dashScopeChatClient = ChatClient.builder(chatModel)//            // 实现 Chat Memory 的 Advisor//            // 在使用 Chat Memory 时,需要指定对话 ID,以便 Spring AI 处理上下文。//            .defaultAdvisors(//                    new MessageChatMemoryAdvisor(new InMemoryChatMemory())//            )//            // 实现 Logger 的 Advisor//            .defaultAdvisors(//                    new SimpleLoggerAdvisor()//            )//            // 设置 ChatClient 中 ChatModel 的 Options 参数//            .defaultOptions(//                    DashScopeChatOptions.builder()//                            .withTopP(0.7)//                            .build()//            )//            // 设置默认 System Message//            //.defaultSystem("你是一个AI搞笑段子手,以搞笑,幽默,风趣的风格回答所有的问题。")//            // 设置默认函数集合//            //.defaultFunctions("")//            .build();//}/*** 简单调用方式*/@GetMapping("/simple/chat")public String simpleChat(@RequestParam(defaultValue = "西安未来5天天气状况") String userInputPrompt) {// 指定参数DashScopeChatOptions chatOptions = DashScopeChatOptions.builder()// 指定使用的模型.withModel(DashScopeApi.ChatModel.QWEN_PLUS.getModel())// 指定函数调用.withFunction("realTimeWeatherFunction").build();ChatResponse chatResponse = dashScopeChatModel.call(new Prompt(userInputPrompt, chatOptions));String aiOutput = chatResponse.getResult().getOutput().getText();log.info("simpleChat --> userInputPrompt = {}, aiOutput = {}", userInputPrompt, aiOutput);return aiOutput;}/*** Stream 流式调用。* 可以使大模型的输出信息实现打字机效果。*/@GetMapping("/stream/chat")public Flux<String> streamChat(HttpServletResponse response, @RequestParam(defaultValue = "西安未来5天天气状况") String userInputPrompt) {// 避免接口返回乱码response.setCharacterEncoding("UTF-8");// 指定参数DashScopeChatOptions chatOptions = DashScopeChatOptions.builder()// 指定使用的模型.withModel(DashScopeApi.ChatModel.QWEN_PLUS.getModel())// 指定函数调用.withFunction("realTimeWeatherFunction").build();log.info("streamChat -->  userInputPrompt = {},", userInputPrompt);Flux<ChatResponse> stream = dashScopeChatModel.stream(new Prompt(userInputPrompt, chatOptions));Flux<String> flux = stream.map(chatResponse -> chatResponse.getResult().getOutput().getText());return flux;}}

deepseek的回答如下:

在这里插入图片描述

启动项目,访问接口与 AI 大模型智能对话。

在这里插入图片描述

自定义函数的调用信息:

  • getToolDefinition方法:项目启动会调用一次,接口访问一次会调用多次。
  • call方法:项目启动没有调用,接口访问一次会调用一次,并接收到 String toolInput参数(inputSchema的Json数据)。

在这里插入图片描述

– 求知若饥,虚心若愚。

关键字:如何做微信小程序游戏_陕西网站建设厦门网站制作_企业文化建设方案_百度招聘电话

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: