成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

王炸!Spring AI+Tools 一分鐘實(shí)現(xiàn)CRUD智能助手

開發(fā) 前端
Tools賦予大語言模型與外部工具或API交互能力,使其能動態(tài)調(diào)用函數(shù)執(zhí)行復(fù)雜任務(wù)。其核心作用包括:突破模型文本生成局限,實(shí)現(xiàn)查詢天氣、調(diào)用數(shù)據(jù)庫等實(shí)時(shí)操作等。

環(huán)境:SpringBoot3.4.2

1. 簡介

Tools賦予大語言模型與外部工具或API交互能力,使其能動態(tài)調(diào)用函數(shù)執(zhí)行復(fù)雜任務(wù)。其核心作用包括:

  • 突破模型文本生成局限,實(shí)現(xiàn)查詢天氣、調(diào)用數(shù)據(jù)庫等實(shí)時(shí)操作
  • 構(gòu)建多步驟智能體,支持旅行規(guī)劃、電商下單等跨工具協(xié)同場景
  • 與企業(yè)系統(tǒng)深度集成,自動調(diào)用CRM、ERP等業(yè)務(wù)接口處理客戶訂單、庫存查詢等需求,推動AI從對話助手向業(yè)務(wù)執(zhí)行者躍遷。 

關(guān)于Tools更多的內(nèi)容,請查看下面這篇文章:

太強(qiáng)了!Spring AI調(diào)用本地函數(shù),實(shí)時(shí)獲取最新數(shù)據(jù)

本文將基于Spring AI+Tools 實(shí)現(xiàn)會議預(yù)約模塊的全鏈路CRUD操作。如下是一個查詢所有會議的小示例:

圖片

接下來,我們將實(shí)現(xiàn)上面的查詢功能及其它操作(新增,刪除等)。

2. 實(shí)戰(zhàn)案例

首先,準(zhǔn)備環(huán)境,引入如下依賴及配置

<dependency>
  <groupId>com.alibaba.cloud.ai</groupId>
  <artifactId>spring-ai-alibaba-starter</artifactId>
  <version>1.0.0-M6.1</version>
</dependency>

配置文件application.yml

spring:
  ai:
    dashscope:
      api-key: sk-xxxooo
      base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
      chat:
        options:
          model: qwen-turbo
---
# 數(shù)據(jù)庫相關(guān)配置
spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ds
    username: root
    password: xxxooo

2.1 基本增刪改查

實(shí)體對象

@Entity
@Table(name = "t_meeting")
public class Meeting {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id ;
  private String title ;
  private String description ;
  private LocalDateTime startTime ;
  private Integer duration ;
  @Enumerated(EnumType.STRING)
  private Urgency urgency ;
  private String creator ;
  @OneToMany(mappedBy = "meeting", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
  private Set<Participant> participants = new HashSet<>() ;
}
@Entity
@Table(name = "t_participant")
public class Participant {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String name;
  @ManyToOne(optional = false)
  @JoinColumn(name = "mid")
  @JsonIgnore
  private Meeting meeting ;
}

Repository定義

public interface MeetingRepository extends JpaRepository<Meeting, Long> {
}

Service增刪改查操作

@Service
public class MeetingService {


  private final MeetingRepository meetingRepository ;
  public MeetingService(MeetingRepository meetingRepository) {
    this.meetingRepository = meetingRepository;
  }
  @Transactional
  public Meeting createMeeting(Meeting meeting) {
    return meetingRepository.save(meeting);
  }
  public Meeting getMeetingById(Long id) {
    return meetingRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("會議不存在"));
  }
  @Transactional
  public void deleteMeeting(Long id) {
    meetingRepository.deleteById(id);
  }
  @Transactional(readOnly = true)
  public List<Meeting> getAllMeetings() {
    return meetingRepository.findAll();
  }
}

2.2 Tools定義

首先,我們定義一個VO對象,用來接收解析后的用戶輸入內(nèi)容。

public class MeetingVO {
  @ToolParam(description = "會議主題,也可以是會議標(biāo)題")
  private String title ;
  @ToolParam(description = "會議描述,備注信息")
  private String description ;
  @ToolParam(description = "會議時(shí)間")
  private LocalDateTime startTime ;
  @ToolParam(description = "會議大概持續(xù)時(shí)間,單位分鐘")
  private Integer duration ;
  @ToolParam(description = "會議緊急程度,分為3個等級: LOW(低), MEDIUM(一般), HIGH(高)")
  @Enumerated(EnumType.STRING)
  private Urgency urgency ;
  @ToolParam(description = "預(yù)約會議人")
  private String creator ;
  @ToolParam(description = "會議參與者,用逗號','分割")
  private Set<String> participants = new HashSet<>() ;
  // getters, setters
}

@ToolParam描述了每一個屬性的作用。接下來,是具體工具定義:

@Component
public class MeetingTools {
  private final MeetingService meetingService ;
  public MeetingTools(MeetingService meetingService) {
    this.meetingService = meetingService;
  }


  @Tool(description = "添加預(yù)約會議")
  public R<Meeting> addMeeting(MeetingVO meetingVO) {
    Meeting meeting = new Meeting() ;
    BeanUtils.copyProperties(meetingVO, meeting) ;
    Set<Participant> participants = meetingVO.getParticipants()
        .stream()
        .map(p -> new Participant(p, meeting))
        .collect(Collectors.toSet()) ;
    meeting.setParticipants(participants) ;
    this.meetingService.createMeeting(meeting) ;
    return R.success(meeting) ;
  }


  @Tool(description = "刪除預(yù)約會議")
  public R<String> deleteMeeting(@ToolParam(description = "會議編號") Long id) {
    this.meetingService.deleteMeeting(id) ;
    return R.success("刪除會議【" + id + "】成功") ;
  }


  @Tool(description = "查詢指定編號的會議")
  public R<Meeting> queryMeeting(@ToolParam(description = "會議編號") Long id) {
    return R.success(this.meetingService.getMeetingById(id)) ;
  }
  @Tool(description = "查詢所有會議")
  public R<List<Meeting>> queryMeetings() {
    return R.success(this.meetingService.getAllMeetings()) ;
  }
}

2.3 配置ChatClient

@Configuration
public class ChatConfig {
  @Bean
  ChatClient meetingChat(ChatClient.Builder chatClientBuilder) {
    String systemMessage = """
        當(dāng)前時(shí)間:{date}。輸出結(jié)果使用HTML table表格展示。需要自適應(yīng)頁面大小(寬度),字體大小為12px。除HTML相關(guān)的內(nèi)容,不要有任何其它內(nèi)容。
      """ ;
    ChatClient chatClient = chatClientBuilder
        .defaultSystem(systemMessage)
        .build();
    return chatClient ;
  }
}

該配置中我們配置了系統(tǒng)文本內(nèi)容,告知了當(dāng)前的時(shí)間,如果不這樣做最終得到的時(shí)間是錯誤的。

2.4 測試

@RestController
@RequestMapping("/meeting/chat")
public class MeetingChatController {
  private final MeetingTools meetingTools ;
  private final ChatClient chatClient ;
  public MeetingChatController(ChatClient chatClient) {
    this.meetingTools = meetingTools ;
    this.chatClient = chatClient ;
  }


  @GetMapping
  public ResponseEntity<?> chat(String message) {
    Prompt prompt = new Prompt(message) ;
    String content = this.chatClient
        .prompt(prompt)
        // 設(shè)置系統(tǒng)文本中的占位符參數(shù)
        .system(p -> p.param("date", new Date()))
        .tools(meetingTools)
        .call()
        .content() ;
    return ResponseEntity.ok(content) ;
  }
}

創(chuàng)建會議

http://localhost:8080/meeting/chat?message=給我預(yù)約今天12:30點(diǎn)的會議,預(yù)約人是趙宏,會議緊急程度為緊急;大概需要20分鐘,會議主題線上P1事故的處理結(jié)果,備注無。參會人員:田七,趙六,Pack

圖片圖片

查詢指定會議詳細(xì)

圖片圖片

查詢所有會議

圖片圖片

刪除會議

圖片圖片

責(zé)任編輯:武曉燕 來源: Springboot全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2017-03-30 19:28:26

HBase分布式數(shù)據(jù)

2016-12-16 11:05:00

分布式互斥線程

2017-02-21 13:00:27

LoadAverage負(fù)載Load

2018-07-31 16:10:51

Redo Undo數(shù)據(jù)庫數(shù)據(jù)

2017-07-06 08:12:02

索引查詢SQL

2020-05-21 19:46:19

區(qū)塊鏈數(shù)字貨幣比特幣

2018-06-26 05:23:19

線程安全函數(shù)代碼

2022-07-18 06:16:07

單點(diǎn)登錄系統(tǒng)

2018-12-12 22:51:24

Java包裝語言

2020-07-17 07:44:25

云計(jì)算邊緣計(jì)算IT

2016-09-12 17:28:45

云存儲應(yīng)用軟件存儲設(shè)備

2020-07-09 07:37:06

數(shù)據(jù)庫Redis工具

2011-02-21 17:48:35

vsFTPd

2017-12-26 16:24:36

接口代碼數(shù)據(jù)

2021-08-06 08:50:45

加密貨幣比特幣區(qū)塊鏈

2018-03-27 09:28:33

緩存策略系統(tǒng)

2015-11-12 10:32:40

GitHub控制系統(tǒng)分布式

2020-06-11 08:04:12

WDMDWDMMWDM

2013-11-15 07:24:50

4G LTE圖解

2011-04-19 09:27:25

Spring
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 免费一区二区 | 国产综合久久久久久鬼色 | aaaaaa大片免费看最大的 | 中文字幕二区 | 日韩精品成人免费观看视频 | 免费在线观看一区二区 | 在线成人| 国产亚洲欧美日韩精品一区二区三区 | 特黄视频| 欧美韩一区二区三区 | 精品久久久久香蕉网 | 91精品国产色综合久久不卡98口 | av性色全交蜜桃成熟时 | 中文字幕成人av | 久久久国产一区 | 国产一区二区三区四区三区四 | 北条麻妃av一区二区三区 | 岛国毛片在线观看 | 日韩中文在线视频 | 成年人视频在线免费观看 | 精品真实国产乱文在线 | 日本一区二区三区四区 | 久久新| 国产成人精品高清久久 | 国产精品视频一区二区三区, | 国产成人精品久久二区二区91 | 免费a级毛片在线播放 | 一区二区国产精品 | 欧美一级久久精品 | 91看片网址 | 国产成人在线免费 | 欧美福利在线 | 亚洲一区二区三区视频免费观看 | 爱爱综合网 | 亚洲欧美国产毛片在线 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 国产一区中文 | 亚洲精品九九 | 日韩免费高清视频 | 成人美女免费网站视频 | 日韩在线欧美 |