欢迎光临
我们一直在努力

大模型突破:Fucation-call(tools的工具调用)

对于一些基础的大模型的通病: 

知识滞后性。

目前所有的大模型基本上都可以进行联网查询,解决了这个问题。
无法访问企业内部的数据库、文档、系统

无法主动调用API以及工具。

Function-call正是解决了这些问题。

流程:

第1步:用户提问
└─ "上海明天会下雨吗"

第2步:大模型理解意图
└─ 识别出:这是一个天气查询问题
   ├─ 地点:上海
   ├─ 时间:明天
   ├─ 关注点:是否下雨
   └─ 匹配到工具:queryWeather

第3步:大模型提取参数并调用工具
└─ 执行 queryWeather("上海", "2024-01-15")
   └─ 返回结果:{"rain": true, "rainfall": "5mm", "temperature": "18-22℃"}

第4步:大模型整合结果
└─ 结合原始问题 + 工具返回结果
   └─ 生成自然语言:"上海明天会下雨,预计降雨量5毫米,气温18到22度"

第5步:返回给用户
└─ "上海明天会下雨,预计降雨量5毫米,出门记得带伞哦"

实现:
 

@Service
public class ToolService {
@Tool("查询天气工具。\\n" +
" ⚠\\uFE0F 重要:只有当用户明确询问天气相关问题时才能调用此工具!\\n" +
" 如果用户只提供地点名称(如\\"北京\\")而没有提到天气、气温、下雨等关键词,\\n" +
" 绝对不能调用此工具,应该由AI直接回复询问用户意图。\\n" +
" \\"\\"\\")")
public String weather() {
//todo 调用天气api或者其他关于天气的接口
return "天气晴朗";
}
}

public interface Assistant {
String chat(String message);
// 流式响应
TokenStream stream(String message);
}

@Bean
public Assistant assistant(ChatLanguageModel qwenChatModel,
StreamingChatLanguageModel qwenStreamingChatModel,
ToolsService toolsService) {
ChatMemory chatMemory = MessageWindowChatMemory.withMaxMessages(10);

Assistant assistant = AiServices.builder(Assistant.class)
.chatLanguageModel(qwenChatModel)
.streamingChatLanguageModel(qwenStreamingChatModel)
.tools(toolsService)
.chatMemory(chatMemory)
.build();

return assistant;
}

加入预设角色(系统消息SystemMessage)

在langchain4j中实现也非常简单

  • @SystemMessage 系统消息, 一般做一些预设角色的提示词,设置大模型的基本职责
  • 可以通过{{current_date}} 传入参数, 因为预设词中的文本可能需要实时变化
  • @V("current_date"), 通过@V传入{{}}中的参数
  • 一旦参数不止一个, 就需要通过@UserMessage设置用户信息

加入系统的提示词 再次问
 

@SystemMessage("""
您是一个专业的天气助手,名叫"小天"。请以热情、细致、贴心的方式回复用户。

【核心规则】
1. 只有当用户【明确提到天气相关词汇】时,才能调用 weather 工具
天气词汇包括:天气、气温、温度、下雨、下雪、刮风、晴天、阴天、多云、预报、摄氏度、热、冷、暖、凉、雷雨、台风、雾霾

2. 如果用户【只输入城市名称】,没有天气词汇,不要调用任何工具
正确回复:"请问您想了解[城市名]的天气信息吗?或者需要其他帮助?"

3. 调用 weather 工具前,必须提取到【城市名称】
如果用户没有明确说城市,默认使用用户当前所在城市(如果知道)或主动询问

4. 获得天气数据后,根据温度给出贴心建议:
– 30℃以上 → 提醒防晒、多喝水
– 10℃以下 → 提醒保暖、穿厚衣服
– 下雨 → 提醒带伞
– 下雪 → 提醒路滑小心

【示例对话】
用户:"北京"
回复:"请问您想了解北京的天气信息吗?或者需要其他帮助?"

用户:"上海天气怎么样"
调用 weather("上海") → 回复:"上海今天多云,22-28℃,天气不错,适合出门散步哦~"

用户:"今天热不热"
调用 weather("默认城市") → 回复:"今天杭州33℃,确实比较热,出门记得防晒,多补充水分!"

今天的日期是 {{current_date}}。
请全程使用中文回复。
""")
TokenStream stream(@UserMessage String message,@V("current_date") String currentDate);
}

@RequestMapping(value = "/memory_stream_chat",produces ="text/stream;charset=UTF-8")
public Flux<String> memoryStreamChat(@RequestParam(defaultValue="我是谁") String message, HttpServletResponse response) {
TokenStream stream = assistant.stream(message, LocalDate.now().toString());

return Flux.create(sink -> {
stream.onPartialResponse(s -> sink.next(s))
.onCompleteResponse(c -> sink.complete())
.onError(sink::error)
.start();

});
}

重写了stream的方法,这个要传入TokenStream stream = assistant.stream(message, LocalDate.now().toString());
你就会发现他已经遵从了你设置的规则了。

赞(0)
未经允许不得转载:171主机测评 » 大模型突破:Fucation-call(tools的工具调用)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址