案例:
- package com.jinhei;
-
- import com.alibaba.fastjson2.JSONObject;
- import com.openai.client.OpenAIClient;
- import com.openai.client.okhttp.OpenAIOkHttpClient;
- import com.openai.models.chat.completions.ChatCompletion;
- import com.openai.models.chat.completions.ChatCompletionCreateParams;
-
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.HashMap;
-
- /**
- * 调用模型
- */
- public class AiChat {
- private static final String TEMPLATE = """
- 你是一位能力强大的 AI 助手,擅长通过逻辑推理与调用工具来解决问题。
- 你可以使用的工具如下:
- {tools}
- 当前用户的问题是:
- {input}
- """;
- public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
- //第0步: 准备工作 - 注册可用的工具
- HashMap<String, Method> tools = new HashMap<>();
- // 获取AgentTools类中的putFile方法。第一个参数是方法名,第二个参数是该方法的参数类型(String)。返回一个Method对象,用于后续动态调用该方法或获取其注解信息。
- tools.put("putFile", AgentTools.class.getMethod("putFile", String.class));
-
- //第1步: 创建AI客户端 - 建立与AI服务的连接通道
- OpenAIClient aiClient = OpenAIOkHttpClient.builder()
- .apiKey(AiConfig.API_KEY) //设置API密钥
- .baseUrl(AiConfig.BASE_URL) //设置服务地址
- .build();//建造完成
-
- //第2步: 准备要问的问题
- //2.1用户的实际问题
- String promptString = "将1+1的结果写到文件中, 文件名为haha.txt";
-
- //2.2 替换模板中的工具占位符
- String prompt = TEMPLATE.replace("{tools}", ToolUtil.getToolDescription(AgentTools.class));
-
- //2.3替换模板中的用户问题占位符
- prompt = prompt.replace("{input}", promptString);
-
- //第3步: 构建请求参数 - 把问题打包成AI能理解的格式
- ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
- .addUserMessage(prompt) //添加用户消息: 你说的话
- .model(AiConfig.LLM_NAME) //指定用哪个AI大模型来处理
- .build();//打包完成 - 准备发送
-
- //第4步: 发送请求并获取回复 - 把信寄出去, 等待回信
- ChatCompletion chatCompletion = aiClient.chat() //打开聊天功能
- .completions() //开启补全模式(AI回复)
- .create(params); //发送请求并等待响应
-
- //第5步: 提取AI的回答 - 拆开回信, 取出内容
- //5.1 获取AI返回的原始信息
- String message = chatCompletion.choices().get(0).message().content().get();
- System.out.println(message);
- //5.2清理消息格式
- message = message.replace("```tool_code", "");
- message = message.replace("```", "");
-
- //5.3解析JSON
- JSONObject jsonObject = JSONObject.parseObject(message);
-
- //获取工具的名称
- String toolName = jsonObject.getString("toolName");
- String toolParams = jsonObject.getString("params");
-
- //第6步: 执行工具调用
- //6.1 从工具注册表中找到对应的方法
- Method toolMethod = tools.get(toolName);
-
- //6.2创建工具实例并且执行方法
- Object result = toolMethod.invoke(new AgentTools(), toolParams);
-
- //第7步: 显示结果
- System.out.println(result);
-
- }
-
- }
复制代码
再举个例子:
- // 电器类
- class Appliance {
- public void turnOn() { System.out.println("开机"); }
- public void turnOff() { System.out.println("关机"); }
- }
复制代码
- Appliance tv = new Appliance();
-
- // 情况1:用户按"开机"按钮
- String command = "turnOn"; // 命令是动态的
- Method action = Appliance.class.getMethod(command);
- action.invoke(tv); // 相当于 tv.turnOn()
-
- // 情况2:用户按"关机"按钮
- command = "turnOff";
- action = Appliance.class.getMethod(command);
- action.invoke(tv); // 相当于 tv.turnOff()
复制代码
|