1.概要

我们使用AI大模型开发程序时,比如我需要查一下平台中有多少个客户。这个时候大模型肯定时不知道的,如果大模型不知道,他可能会回答不知道或者胡乱回答,这个时候就需要借助函数时调用来解决这些问题。

大模型胡乱回答实际是大模型幻觉的问题,解决幻觉问题有以下方案

  1. 模型微调

    这种情况一般公司不用做,因为需要自己训练,费用比较贵效果不一定好。
  2. 检索增强生成 (RAG)
  • 使用外部的知识库,作为大模型知识的来源
  • 使用向量的相似性查找相关文档
  • 相关的文档作为大模型的一部分
  1. 方法调用 (function calling)
  • 将问题和函数作为问题一起发给大模型
  • 大模型解析出函数的参数
  • 应用调用函数返回结果
  • 将结果和上下文的数据丢给大模型,由大模型返回结果

2.函数调用过程

  1. 应用构造用户的问题和我们定义的函数的信息提交给大模型。

    请求信息
{
"model": "qwen-plus",
"input": {
"messages": [
{
"role": "user",
"content": "广州有多少叫张三的人"
}
]
},
"parameters": {
"temperature": 0,
"result_format": "message",
"tools": [
{
"function": {
"name": "add",
"description": "add two numbers",
"parameters": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"v1": {
"type": "integer",
"format": "int32"
},
"v2": {
"type": "integer",
"format": "int32"
}
}
}
},
"type": "function"
},
{
"function": {
"name": "loation",
"description": "某地区有多少叫什么名字的人",
"parameters": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"address": {
"type": "string"
},
"name": {
"type": "string"
}
}
}
},
"type": "function"
}
]
}
}

我们将问题和配置的函数一起发给大模型,如果大模型判断当前的问题是否需要调用函数,它会返回是否需要函数调用,并同时计算出函数的参数。

  1. 大模型解析出是否需要调用函数,如果不需要则直接返回
{
"choices": [
{
"finish_reason": "tool_calls",
"message": {
"role": "assistant",
"tool_calls": [
{
"function": {
"name": "loation",
"arguments": "{\"address\": \"广州\", \"name\": \"张三\"}"
},
"id": "",
"type": "function"
}
],
"content": ""
}
}
]
}
  1. 如果需要 那么应用则调用函数。

    spring ai 框架会去调用函数,获取函数名和参数,调用我们定义的参数。
  2. 函数返回结果,并将返回结果组成提示词再次发给大模型
  3. 大模型获取数据后得到完整的输出。

3.主要代码如下

3.1 定义函数

public class LocationFunction implements Function<LocationRequest, LocationResponse> {

    private final Logger LOGGER = LoggerFactory.getLogger(getClass());

    @Override
public LocationResponse apply(LocationRequest locationRequest) {
LOGGER.info("调用某个地方有多少叫什么的人 {}", locationRequest);
int amount=10;
if(locationRequest.name().equals("张三")){
amount=5;
}
return new LocationResponse(amount);
}
}

请求参数定义

public record LocationRequest(String name, String address) {
}

返回数据定义

public record LocationResponse (int amount){
}

配置函数

@Bean
@Description("某地区有多少叫什么名字的人")
public Function<LocationRequest, LocationResponse> loation() {
return new LocationFunction();
}

定义 chatclient

@Bean
public ChatClient chatClient(
FunctionCallbackContext functionCallbackContext) {
return new DashscopeChatClient(new DashscopeApi(),
DashscopeChatOptions.builder()
//使用千问plus 数据
.withModel(DashscopeModelName.QWEN_PLUS)
.withTemperature(0.0f)
//定义函数
.withFunction("add")
//定义第二个函数
.withFunction("loation")
.build(),
functionCallbackContext);
}

这里我们可以定义多个函数,但是还是不要定义太多的函数,这样发送给大模型的包太大,会需要消耗更多的token ,会影响大模型收费。

spring ai 函数调用的更多相关文章

  1. 完全自制的五子棋人机对战游戏(VC++实现)

    五子棋工作文档 1说明: 这个程序在创建初期的时候是有一个写的比较乱的文档的,但是很可惜回学校的时候没有带回来……所以现在赶紧整理一下,不然再过一段时间就忘干净了. 最初这个程序是受老同学所托做的,一 ...

  2. Spring AOP详解

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  3. Artificial intelligence(AI)

    ORM: https://github.com/sunkaixuan/SqlSugar 微软DEMO: https://github.com/Microsoft/BotBuilder 注册KEY:ht ...

  4. spring的AOP

    最近公司项目中需要添加一个日志记录功能,就是可以清楚的看到谁在什么时间做了什么事情,因为项目已经运行很长时间,这个最初没有开来进来,所以就用spring的面向切面编程来实现这个功能.在做的时候对spr ...

  5. JPA in Spring

    JPA(Java Persistence API):Sun官方提出的Java持久化规范,定义了对象-关系映射(ORM)以及实体对象持久化的标准接口.Sun引入JPA出于两个原因:一.简化现有Java ...

  6. Spring Bean

    一.Spring的几大模块:Data access & Integration.Transcation.Instrumentation.Core Spring Container.Testin ...

  7. 非Spring下的Quartz

    转自:Nick Huang.    http://www.cnblogs.com/nick-huang/ 阅读目录 > 参考的优秀资料 > 版本说明 > 简单的搭建 > 在We ...

  8. Spring AOP在函数接口调用性能分析及其日志处理方面的应用

    面向切面编程可以实现在不修改原来代码的情况下,增加我们所需的业务处理逻辑,比如:添加日志.本文AOP实例是基于Aspect Around注解实现的,我们需要在调用API函数的时候,统计函数调用的具体信 ...

  9. Struts2、Spring MVC4 框架下的ajax统一异常处理

    本文算是struts2 异常处理3板斧.spring mvc4:异常处理 后续篇章,普通页面出错后可以跳到统一的错误处理页面,但是ajax就不行了,ajax的本意就是不让当前页面发生跳转,仅局部刷新, ...

  10. 【五子棋AI循序渐进】——开局库

    首先,对前面几篇当中未修复的BUG致歉,在使用代码时请万分小心…………尤其是前面关于VCF\VCT的一些代码和思考,有一些错误.虽然现在基本都修正了,但是我的程序还没有经过非常大量的对局,在这之前,不 ...

随机推荐

  1. SpringCloud入门(二)服务间调用和案例

    一.微服务拆分注意事项微服务拆分注意事项:1.单一职责:不同微服务,不要重复开发相同业务2.数据独立:不要访问其它微服务的数据库3.面向服务:将自己的业务暴露为接口,供其它微服务调用 1.微服务需要根 ...

  2. Angular 18+ 高级教程 – NgModule

    前言 NgModule 在 Angular v14 以前是一门必修课.然而,自 Angular v14 推出 Standalone Component 以后,它的地位变得越来越边缘化了. 本教程从开篇 ...

  3. PTA甲级—图

    1.图的遍历 1013 Battle Over Cities (25 分) 一种方法使用dfs求连通块的个数 #include <cstdio> #include <cstring& ...

  4. SpringBoot——简介&&入门

    SpringBoot 简介 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程 起步依赖 starter:SpringBoot中常见的 ...

  5. QT原理与源码分析之对象级QT事件过滤器

    本文简略介绍了QT原理与源码分析中的QT对象级事件过滤器的自定义过滤函数.对象级事件过滤器的安装过程,以及安装函数的源码实现. 自定义QT事件过滤器的过滤函数的实现: 事件过滤器被调用时执行的函数代码 ...

  6. manim边学边做--空心多边形

    空心的多边形Cutout是一种比较特殊的多边形,主要用于解决与形状.大小.位置等相关的数学问题. Cutout多边形可以定义物体表面的空洞或凹陷部分,从而更准确地模拟现实世界中的复杂形状. 比如,在P ...

  7. v-show、v-if、v-for的使用

    v-if vs v-show v-if 是"真正"的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建. v-if 也是惰性的:如果在初始渲染时条件为 ...

  8. 深入理解 Nuxt.js 中的 app:error 钩子

    title: 深入理解 Nuxt.js 中的 app:error 钩子 date: 2024/9/27 updated: 2024/9/27 author: cmdragon excerpt: 摘要: ...

  9. Spark集群的安装及高可用配置

    spark官网学习文档 Spark集群的安装及高可用配置 前期需求:Hadoop和Scala必须已经安装完成 步骤: ①进入spark下载网站中https://spark.apache.org/dow ...

  10. 【赵渝强老师】Kafka的体系架构

    一.什么是Kafka? 数据工程中最具挑战性的部分之一是如何从不同点收集和传输大量数据到分布式系统进行处理和分析.需要通过消息队列正确地分离大量数据,因为如果一部分数据无法传送,则可以在系统恢复时传输 ...