找回密码
 立即注册

invoke()使用

[复制链接]
admin 发表于 2026-6-2 18:37:16 | 显示全部楼层 |阅读模式
案例:

  1. package com.jinhei;
  2. import com.alibaba.fastjson2.JSONObject;
  3. import com.openai.client.OpenAIClient;
  4. import com.openai.client.okhttp.OpenAIOkHttpClient;
  5. import com.openai.models.chat.completions.ChatCompletion;
  6. import com.openai.models.chat.completions.ChatCompletionCreateParams;
  7. import java.lang.reflect.InvocationTargetException;
  8. import java.lang.reflect.Method;
  9. import java.util.HashMap;
  10. /**
  11. * 调用模型
  12. */
  13. public class AiChat {
  14.     private static final String TEMPLATE = """
  15.             你是一位能力强大的 AI 助手,擅长通过逻辑推理与调用工具来解决问题。
  16.             你可以使用的工具如下:
  17.             {tools}
  18.             当前用户的问题是:
  19.             {input}
  20.             """;
  21.     public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
  22.         //第0步: 准备工作 - 注册可用的工具
  23.         HashMap<String, Method> tools = new HashMap<>();
  24. //        获取AgentTools类中的putFile方法。第一个参数是方法名,第二个参数是该方法的参数类型(String)。返回一个Method对象,用于后续动态调用该方法或获取其注解信息。
  25.         tools.put("putFile", AgentTools.class.getMethod("putFile", String.class));
  26.         //第1步: 创建AI客户端 - 建立与AI服务的连接通道
  27.         OpenAIClient aiClient = OpenAIOkHttpClient.builder()
  28.                 .apiKey(AiConfig.API_KEY) //设置API密钥
  29.                 .baseUrl(AiConfig.BASE_URL) //设置服务地址
  30.                 .build();//建造完成
  31.         //第2步: 准备要问的问题
  32.         //2.1用户的实际问题
  33.         String promptString = "将1+1的结果写到文件中, 文件名为haha.txt";
  34.         //2.2 替换模板中的工具占位符
  35.         String prompt = TEMPLATE.replace("{tools}", ToolUtil.getToolDescription(AgentTools.class));
  36.         //2.3替换模板中的用户问题占位符
  37.         prompt = prompt.replace("{input}", promptString);
  38.         //第3步: 构建请求参数 - 把问题打包成AI能理解的格式
  39.         ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
  40.                 .addUserMessage(prompt) //添加用户消息: 你说的话
  41.                 .model(AiConfig.LLM_NAME) //指定用哪个AI大模型来处理
  42.                 .build();//打包完成 - 准备发送
  43.         //第4步: 发送请求并获取回复 - 把信寄出去, 等待回信
  44.         ChatCompletion chatCompletion = aiClient.chat() //打开聊天功能
  45.                 .completions() //开启补全模式(AI回复)
  46.                 .create(params); //发送请求并等待响应
  47.         //第5步: 提取AI的回答 - 拆开回信, 取出内容
  48.         //5.1 获取AI返回的原始信息
  49.         String message = chatCompletion.choices().get(0).message().content().get();
  50.         System.out.println(message);
  51.         //5.2清理消息格式
  52.         message = message.replace("```tool_code", "");
  53.         message = message.replace("```", "");
  54.         //5.3解析JSON
  55.         JSONObject jsonObject = JSONObject.parseObject(message);
  56.         //获取工具的名称
  57.         String toolName = jsonObject.getString("toolName");
  58.         String toolParams = jsonObject.getString("params");
  59.         //第6步: 执行工具调用
  60.         //6.1 从工具注册表中找到对应的方法
  61.         Method toolMethod = tools.get(toolName);
  62.         //6.2创建工具实例并且执行方法
  63.         Object result = toolMethod.invoke(new AgentTools(), toolParams);
  64.         //第7步: 显示结果
  65.         System.out.println(result);
  66.     }
  67. }
复制代码

1.jpg

再举个例子:
  1. // 电器类
  2. class Appliance {
  3.     public void turnOn() { System.out.println("开机"); }
  4.     public void turnOff() { System.out.println("关机"); }
  5. }
复制代码
  1. Appliance tv = new Appliance();
  2. // 情况1:用户按"开机"按钮
  3. String command = "turnOn";  // 命令是动态的
  4. Method action = Appliance.class.getMethod(command);
  5. action.invoke(tv);  // 相当于 tv.turnOn()
  6. // 情况2:用户按"关机"按钮  
  7. command = "turnOff";
  8. action = Appliance.class.getMethod(command);
  9. action.invoke(tv);  // 相当于 tv.turnOff()
复制代码


QQ|网站地图|Archiver|小黑屋|金黑网络 ( 粤ICP备2021124338号 )

网站建设,微信公众号小程序制作,商城系统开发,高端系统定制,app软件开发,智能物联网开发,直播带货系统等

Powered by Www.Jinhei.Cn

Copyright © 2013-2024 深圳市金黑网络技术有限公司 版权所有

快速回复 返回顶部 返回列表