From the project: https://github.com/HamaWhiteGG/langchain-java
Please refer to the ChatFunctionTest for the complete test code.
1. Core main process
- Generates a ChatParameter instance that represents the given class.
- Invoke the OpenAI API and return the function name and parameters.
- Execute functions through the FunctionExecutor.
2. Step–by-step introduction
2.1 Declare function parameters and response
public record Weather(
@JsonProperty(required = true)
@JsonPropertyDescription("The city and state, e.g. San Francisco, CA")
String location,
@JsonPropertyDescription("The temperature unit")
WeatherUnit unit
) {}
public enum WeatherUnit {
CELSIUS,
FAHRENHEIT
}
@Data
@Builder
public class WeatherResponse {
public String location;
public WeatherUnit unit;
public int temperature;
public String description;
}
WeatherResponse getCurrentWeather(Weather weather) {
// mock function
return WeatherResponse.builder()
.location(weather.location())
.unit(weather.unit())
.temperature(new Random().nextInt(50))
.description("sunny")
.build();
}
2.2 Generates a ChatParameter instance that represents the given class
Automatically convert Weather.class
to ChatParameter
using the ChatParameterUtils.generate
method.
ChatFunction.ChatParameter chatParameter = ChatParameterUtils.generate(Weather.class);
The output of converting chatParameter
to JSON String is as follows:
{
"type" : "object",
"properties" : {
"location" : {
"type" : "string",
"description" : "The city and state, e.g. San Francisco, CA"
},
"unit" : {
"type" : "string",
"description" : "The temperature unit",
"enum" : [
"celsius",
"fahrenheit"
]
}
},
"required" : [
"location"
]
}
2.3 Invoke the OpenAI API and return the function name and parameters.
ChatFunction chatFunction = ChatFunction.builder()
.name(functionName)
.description("Get the current weather in a given location")
.parameters(ChatParameterUtils.generate(Weather.class))
.build();
Message message = Message.of("What is the weather like in Boston?");
ChatCompletion chatCompletion = ChatCompletion.builder()
.model("gpt-4")
.temperature(0)
.messages(List.of(message))
.tools(List.of(new Tool(chatFunction)))
.toolChoice("auto")
.build();
ChatCompletionResp response = client.createChatCompletion(chatCompletion);
ChatChoice chatChoice = response.getChoices().get(0);
The output of converting chatChoice
to JSON String is as follows:
{
"index":0,
"message":{
"role":"assistant",
"content":null,
"tool_calls":[
{
"id":"call_aS4LspVVBkE8uIiBSLZWXe6O",
"type":"function",
"function":{
"name":"get_current_weather",
"arguments":"{n "location": "Boston, MA"n}"
}
}
]
},
"finish_reason":"tool_calls"
}
2.4 Execute functions through the FunctionExecutor.
The code for FunctionExecutor
is as follows, allowing the caller to avoid explicit type casting through generics, making the code more concise and elegant.
public class FunctionExecutor {
private static final Map<String, Function<?, ?>> FUNCTION_MAP = new HashMap<>(16);
public static <T> void register(String functionName, Function<T, ?> function) {
FUNCTION_MAP.put(functionName, function);
}
@SuppressWarnings("unchecked")
public static <T, R> R execute(String functionName, Class<T> clazz, String arguments) throws ClassCastException {
Function<T, R> function = (Function<T, R>) FUNCTION_MAP.get(functionName);
if (function == null) {
throw new IllegalArgumentException("No function registered with name: " + functionName);
}
T input = convertFromJsonStr(arguments, clazz);
return function.apply(input);
}
}
The caller’s code is as follows:
Function function = chatChoice.getMessage().getToolCalls().get(0).getFunction();
// execute function
WeatherResponse weatherResponse = FunctionExecutor.execute(function.getName(), Weather.class, function.getArguments());
System.out.println(weatherResponse)
WeatherResponse(location=Boston, MA, unit=null, temperature=2, description=sunny)
原文地址:https://blog.csdn.net/xin_jmail/article/details/134721378
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_14325.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!