各位专家,请教个问题,我用function calling方式调用天气预报接口,然后返回给大模型,但是大模型给我回答的不是天气预报相关的信息,是我参数那里传的有问题吗?我调的是星火的spark pro
public void run() {
try {
JSONObject requestJson=new JSONObject();
JSONObject header=new JSONObject(); // header参数
header.put("app_id",appid);
header.put("uid",UUID.randomUUID().toString().substring(0, 10));
JSONObject parameter=new JSONObject(); // parameter参数
JSONObject chat=new JSONObject();
chat.put("domain", Constant.DOMAIN);
chat.put("temperature",0.5);
chat.put("max_tokens",4096);
parameter.put("chat",chat);
JSONObject payload=new JSONObject(); // payload参数
JSONObject message=new JSONObject();
JSONArray text=new JSONArray();
// 历史问题获取
if(historyList.size()>0){
for(RoleContent tempRoleContent:historyList){
text.add(JSON.toJSON(tempRoleContent));
}
}
// 最新问题
RoleContent roleContent=new RoleContent();
roleContent.role="user";
roleContent.content = NewQuestion;
text.add(JSON.toJSON(roleContent));
historyList.add(roleContent);
message.put("text",text);
payload.put("message",message);
//Function call,当前Spark Pro/Max/4.0 Ultra 支持了该功能
// **********************************************************
JSONObject functions = new JSONObject();
JSONArray textList = new JSONArray();
textList.add(getWeather());
textList.add(calculateRefundFee());
// functions.put("type","function");
functions.put("text",textList);
payload.put("functions",functions);
// **********************************************************
requestJson.put("header",header);
requestJson.put("parameter",parameter);
requestJson.put("payload",payload);
String cityName = NewQuestion;
System.err.println("requestJson1:" + requestJson);
// 可以打印看每次的传参明细
webSocket.send(requestJson.toString());
HashMap<String, Object> map = new HashMap<>();
map.put("cityName" , cityName);
String weatherData = new FunctionCaller().getWeather(map);
//TODO 从getWeather接口返回获取argument
String cName = "";
String temp_C = "";
String FeelsLikeC = "";
String humidity = "";
String weatherDesc = "";
String observation_time = "";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode;
try {
rootNode = mapper.readTree(weatherData);
cName = rootNode.get("cityName").asText();
temp_C = rootNode.get("temp_C").asText();
FeelsLikeC = rootNode.get("FeelsLikeC").asText();
humidity = rootNode.get("humidity").asText();
weatherDesc = rootNode.get("weatherDesc").asText();
observation_time = rootNode.get("observation_time").asText();
} catch (JsonProcessingException e) {
e.printStackTrace();
}
ToolCallFunction tcf = ToolCallFunction.builder().name(
"getWeather").arguments(cityName).build();
ToolCalls tc = ToolCalls.builder().id(function_call_id).type(ToolCalls.Type.FUNCTION.getName()).function(tcf).build();
RoleContent roleContent1 = new RoleContent();
roleContent1.role="assistant";
roleContent1.content = NewQuestion;
roleContent1.toolCalls = Collections.singletonList(tc);
text.add(JSON.toJSON(roleContent1));
historyList.add(roleContent1);
String finalPrompt = cName +
",今天的天气情况为" + weatherDesc +
",气温为" + temp_C +
",体感温度为" + FeelsLikeC +
",湿度为" + humidity +
",检测时间为" + observation_time;
RoleContent roleContent2 = new RoleContent();
roleContent2.role="tool";
roleContent2.content = finalPrompt;
// text.clear();
text.add(JSON.toJSON(roleContent2));
historyList.add(roleContent2);
message.put("text",text);
payload.put("message",message);
requestJson.put("payload",payload);
System.err.println("requestJson2:" + requestJson);
webSocket.send(requestJson.toString());
// 等待服务端返回完毕后关闭
while (true) {
// System.err.println(wsCloseFlag + "---");
Thread.sleep(200);
if (wsCloseFlag) {
break;
}
}
webSocket.close(1000, "");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public String getWeather(Map<String,Object> params) {
String cityName = params.get("cityName").toString();
System.out.println("调用getWeather接口:cityName:"+cityName);
// if (cityName == null || cityName.isEmpty()) {
// throw new IllegalArgumentException("City name must not be null or empty");
// }
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
try {
Map<String, String> headers = new HashMap<>(16);
headers.put("Content-Type", "application/json");
Request.Builder builder = new Request.Builder()
.url("https://wttr.in/" + cityName + "?format=j1");
builder.headers(Headers.of(headers));
builder.method("GET", null);
Request request = builder.build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
ResponseBody responseBody = response.body();
JSONObject jsonObject = JSONObject.parseObject(responseBody.string());
System.out.println("调用https://wttr.in/" + cityName + "?format" +
"=j1接口:cityName:"+cityName+",返回:"+jsonObject);
JSONObject weatherData = new JSONObject();
// Extract the desired weather data from the JSON response
JSONArray currentCondition = jsonObject.getJSONArray("current_condition");
JSONObject firstEntry = currentCondition.getJSONObject(0);
weatherData.put("temp_C", firstEntry.getString("temp_C"));
weatherData.put("FeelsLikeC", firstEntry.getString("FeelsLikeC"));
weatherData.put("humidity", firstEntry.getString("humidity"));
weatherData.put("weatherDesc", firstEntry.getString("weatherDesc"));
weatherData.put("observation_time", firstEntry.getString("observation_time"));
weatherData.put("cityName", params.get("cityName").toString());
return weatherData.toString();
} else {
return "Failed.接口访问失败";
}
} catch (IOException e) {
e.printStackTrace();
return "Error encountered while fetching weather data!";
}
}
第一次请求大模型的参数
{
"payload": {
"functions": {
"text": [
{
"name": "getWeather",
"description": "天气插件可以提供天气相关信息。你可以提供指定的地点信息,来精准检索到天气信息。",
"parameters": {
"type": "object",
"properties": {
"cityName": {
"description": "城市名称",
"type": "string"
}
},
"required": [
"cityName"
]
}
},
{
"name": "calculateRefundFee",
"description": "计算退票费插件可以计算出退票的手续费。你可以提供票价、出发时间和退票时间,来计算退票的手续费。",
"parameters": {
"type": "object",
"properties": {
"departureTime": {
"description": "出发时间",
"type": "localDateTime"
},
"ticketPrice": {
"description": "票价",
"type": "double"
},
"refundTime": {
"description": "退票时间",
"type": "localDateTime"
}
},
"required": [
"ticketPrice",
"departureTime",
"refundTime"
]
}
}
]
},
"message": {
"text": [
{
"role": "user",
"content": "北京"
}
]
}
},
"parameter": {
"chat": {
"max_tokens": 4096,
"domain": "generalv3",
"temperature": 0.5
}
},
"header": {
"uid": "097236b0-2",
"app_id": "61558de7"
}
}
第二次请求大模型的参数
{
"payload": {
"functions": {
"text": [
{
"name": "getWeather",
"description": "天气插件可以提供天气相关信息。你可以提供指定的地点信息,来精准检索到天气信息。",
"parameters": {
"type": "object",
"properties": {
"cityName": {
"description": "城市名称",
"type": "string"
}
},
"required": [
"cityName"
]
}
},
{
"name": "calculateRefundFee",
"description": "计算退票费插件可以计算出退票的手续费。你可以提供票价、出发时间和退票时间,来计算退票的手续费。",
"parameters": {
"type": "object",
"properties": {
"departureTime": {
"description": "出发时间",
"type": "localDateTime"
},
"ticketPrice": {
"description": "票价",
"type": "double"
},
"refundTime": {
"description": "退票时间",
"type": "localDateTime"
}
},
"required": [
"ticketPrice",
"departureTime",
"refundTime"
]
}
}
]
},
"message": {
"text": [
{
"role": "user",
"content": "北京"
},
{
"role": "assistant",
"toolCalls": [
{
"function": {
"name": "getWeather",
"arguments": "北京"
},
"id": "",
"type": "function"
}
],
"content": "北京"
},
{
"role": "tool",
"content": "北京,今天的天气情况为[{\"value\":\"Sunny\"}],气温为30,体感温度为30,湿度为59,检测时间为02:08 AM"
}
]
}
},
"parameter": {
"chat": {
"max_tokens": 4096,
"domain": "generalv3",
"temperature": 0.5
}
},
"header": {
"uid": "097236b0-2",
"app_id": "61558de7"
}
}