一个简单的java使用llm的tool的案例

有时候我们希望模型能够帮我们推理出一些需要的东西,然后我们用这个东西去处理一些其他的功能

以下案例比如说公司内部有一个天气查询系统和一个二手商品交易系统,我们希望模型能够推理出当前会话是否需要查询天气系统或者二手交易系统,如果需要,则能够推理出需要的具体函数以及对应的入参

引入openai-java的依赖

        <dependency>
            <groupId>com.openai</groupId>
            <artifactId>openai-java</artifactId>
            <version>2.2.1</version>
        </dependency>

 

编写示例

package com.zm.ai.tool;

import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.core.JsonArray;
import com.openai.core.JsonField;
import com.openai.core.JsonString;
import com.openai.core.JsonValue;
import com.openai.models.FunctionDefinition;
import com.openai.models.FunctionParameters;
import com.openai.models.chat.completions.*;

import java.util.*;

public class Starter {

    public static void main(String[] args) {

        ChatCompletionTool completionTool1 = ChatCompletionTool.builder()
                .function(FunctionDefinition.builder()
                        .name("get_goods_info")
                        .description("可以获取到某类二手商品的信息")
                        .parameters(FunctionParameters.builder()
                                .putAdditionalProperty("type", JsonString.of("object"))
                                .putAdditionalProperty("required", JsonArray.of(Arrays.asList(JsonString.of("goodsType"),JsonString.of("age"),JsonString.of("priceRange"),JsonString.of("color"))))
                                .putAdditionalProperty("properties",JsonValue.from(getGoodsProperties()))
                                .build()
                        )
                        .build())
                .build();
        ChatCompletionTool completionTool2 = ChatCompletionTool.builder()
                .function(FunctionDefinition.builder()
                        .name("get_weather_info")
                        .description("可以获取到某个地方的天气信息")
                        .parameters(FunctionParameters.builder()
                                .putAdditionalProperty("type", JsonString.of("object"))
                                .putAdditionalProperty("required", JsonArray.of(Arrays.asList(JsonString.of("location"),JsonString.of("time"))))
                                .putAdditionalProperty("properties",JsonValue.from(getWeatherProperties()))
                                .build()
                        )
                        .build())
                .build();

        OpenAIClient openAIClient = OpenAIOkHttpClient.builder()
                .apiKey("***")
                .baseUrl("***")
                .build();
        ChatCompletionCreateParams.Builder paramsBuilder = ChatCompletionCreateParams.builder()
                .addSystemMessage("返回给用户时,请按照非常萌的语气,最好加一些颜文字")
                .addUserMessage("我想买个二手电视机,最好是3年以内白色的,价格在1000以内")
                .model("deepseek-r1")
                .addTool(completionTool1)
                .addTool(completionTool2).add;


        ChatCompletion chatCompletion = openAIClient.chat().completions().create(paramsBuilder.build());

        List<ChatCompletion.Choice> choices = chatCompletion.choices();
        for (ChatCompletion.Choice choice : choices) {
            JsonField<List<ChatCompletionMessageToolCall>> listJsonField = choice.message()._toolCalls();
            List<ChatCompletionMessageToolCall> chatCompletionMessageToolCalls = listJsonField.asKnown().get();
            for (ChatCompletionMessageToolCall chatCompletionMessageToolCall : chatCompletionMessageToolCalls) {
                ChatCompletionMessageToolCall.Function function = chatCompletionMessageToolCall.function();
                System.out.println("获取到的function:" + function.name());
                String arguments = function.arguments();
                System.out.println("获取到的args:" + arguments);
                String goodsResult = getGoodsResult();
                paramsBuilder.addMessage(ChatCompletionToolMessageParam.builder()
                        .toolCallId(chatCompletionMessageToolCall.id())
                        .content(goodsResult)
                        .build()
                );

            }
        }

        List<ChatCompletion.Choice> choices2 = openAIClient.chat().completions().create(paramsBuilder.build()).choices();
        System.out.println("===========================================");
        for (ChatCompletion.Choice choice : choices2) {

            choice.message().content().ifPresent(System.out::println);
        }

    }


    public static Map<String,Object> getGoodsProperties(){
        Map<String,Object> properties = new LinkedHashMap<>();
        properties.put("goodsType",getDesc("二手商品的类型,例如洗衣机,电冰箱,电视机等"));
        properties.put("age",getDesc("二手商品的生产日期,按照yyyy-MM-dd的样式给,如果是一个范围的话,请用yyyy-MM-dd~yyyy-MM-dd的样式给"));
        properties.put("priceRange",getDesc("二手商品的价格,如果是一个范围的话请在两个价格中间用-拼接"));
        properties.put("color",getDesc("二手商品的颜色"));
        return properties;
    }

    public static Map<String,Object> getWeatherProperties(){
        Map<String,Object> properties = new LinkedHashMap<>();
        properties.put("location",getDesc("获取天气情况的城市信息,例如北京,上海,纽约等"));
        properties.put("time",getDesc("获取天气情况的时间,如果是节假日的话那这个时间可能是一个范围,时间按照yyyy-MM-dd的样式给,如果是一个范围的话,请用yyyy-MM-dd~yyyy-MM-dd的样式给"));
        return properties;
    }

    public static Map<String,String> getDesc(String desc){
        Map<String,String> descMap = new LinkedHashMap<>();
        descMap.put("type","string");
        descMap.put("description",desc);
        return descMap;
    }

    public static String getGoodsResult(){
        return "商品名称:索尼电视;商品金额:200CNY;商品颜色:白色(泛黄);使用时间:13个月";
    }

    public static String getWeatherResult(){
        return "苏州10月1日天气为多云,气温28度到31度,气温较热,注意防暑";
    }
}

 

 

我们可以拿到推导的函数结果以及最终返回

 



posted @ 2025-05-30 15:27  雨落寒沙  阅读(185)  评论(0)    收藏  举报