【源码解读】qwen-max的工具调用 Function Calling过程分析
【源码解读】qwen-max的工具调用 Function Calling过程分析。
·
官方文档地址:
https://help.aliyun.com/zh/model-studio/qwen-function-calling?spm=a2c4g.11186623.help-menu-2400256.d_0_1_4.6cc920b91Ab0jd&scm=20140722.H_2862208._.OR_help-T_cn~zh-V_1
下面是claud模型的分析过程:
根据代码分析,模型生成包含工具调用响应的过程如下:
- 模型配置和初始化:
// 1. 配置模型参数
GenerationParam param = GenerationParam.builder()
.model("qwen-max") // 使用通义千问增强版模型
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.messages(messages) // 对话历史
.resultFormat(ResultFormat.MESSAGE) // 指定返回格式为消息格式
.tools(Arrays.asList( // 注册可用的工具
ToolFunction.builder().function(fdWeather).build(),
ToolFunction.builder().function(fdTime).build()
)).build();
// 2. 创建模型实例
Generation gen = new Generation();
- 工具定义和描述:
// 1. 生成工具的JSON Schema
ObjectNode jsonSchemaWeather = generateSchema(GetWeatherTool.class);
// 2. 定义工具函数
FunctionDefinition fdWeather = FunctionDefinition.builder()
.name("get_current_weather") // 工具名称
.description("获取指定地区的天气") // 工具描述
.parameters(JsonUtils.parseString(jsonSchemaWeather.toString()).getAsJsonObject()) // 参数定义
.build();
- 对话上下文设置:
// 1. 系统提示,引导模型使用工具
Message systemMsg = Message.builder()
.role(Role.SYSTEM.getValue())
.content("You are a helpful assistant. When asked a question, use tools wherever possible.")
.build();
// 2. 用户输入
Message userMsg = Message.builder()
.role(Role.USER.getValue())
.content(userInput)
.build();
// 3. 构建消息历史
List<Message> messages = new ArrayList<>(Arrays.asList(systemMsg, userMsg));
- 模型调用和响应生成:
// 1. 调用模型
GenerationResult result = gen.call(param);
// 2. 处理模型响应
for (Choice choice : result.getOutput().getChoices()) {
Message message = choice.getMessage();
if (message.getToolCalls() != null) {
// 处理工具调用
for (ToolCallBase toolCall : message.getToolCalls()) {
if (toolCall.getType().equals("function")) {
// 获取工具调用信息
String functionName = ((ToolCallFunction) toolCall).getFunction().getName();
String functionArgument = ((ToolCallFunction) toolCall).getFunction().getArguments();
// ...
}
}
}
}
- 工具调用结果处理:
// 1. 执行工具调用
GetWeatherTool weatherTool = new GetWeatherTool(functionArgument);
String weather = weatherTool.callWeather();
// 2. 构建工具调用结果消息
Message toolResultMessage = Message.builder()
.role("tool")
.content(weather)
.toolCallId(toolCall.getId())
.build();
// 3. 添加到消息历史
messages.add(toolResultMessage);
// 4. 继续对话
if (needToolCall) {
param.setMessages(messages);
result = gen.call(param);
}
模型生成工具调用响应的关键因素:
-
模型能力:
- 使用 qwen-plus 模型,支持函数调用能力
- 能够理解工具定义和参数要求
- 可以生成符合规范的工具调用请求
-
工具定义:
- 清晰的工具名称和描述
- 规范的参数定义(JSON Schema)
- 完整的功能说明
-
上下文引导:
- 系统提示鼓励使用工具
- 完整的消息历史
- 工具调用结果反馈
-
交互流程:
- 模型理解用户需求
- 选择合适的工具
- 生成正确的参数
- 处理工具返回结果
- 继续对话直到完成任务
这种实现方式使模型能够:
- 理解用户意图
- 选择合适的工具
- 正确构造工具调用
- 处理工具返回结果
- 生成连贯的对话响应
更多推荐
所有评论(0)