【AI】AIService(基本使用與指令定制)

【AI】AIService(基本使用與指令定制)

文章目錄

  • 【AI】AIService(基本使用與指令定制)
    • 1. 簡介
    • 2. @AIService
      • 2.1 引入依賴
      • 2.2 編寫AIService接口
      • 2.3 測試代碼
    • 3. 指令定制
      • 3.1 系統提示詞
      • 3.2 用戶提示詞

1. 簡介

AIService可以被視為應用程序服務層的一個組件,提供對應的ai服務,所以被稱為AIService,它能夠幫助我們完成一些復雜的ai操作:

  • 為模型格式化輸入內容
  • 解析模型的輸出結果
  • 聊天記憶Chat Memory
  • 工具 Tools
  • 檢索增強生成RAG

同時AIService有兩種使用方式,一種需要手動裝配,另一種通過 @AIService 注解即可調用,后面的文章我們都使用 @AIService 來進行講解。

2. @AIService

@AIService可以添加在服務類上,然后實現組件在AI服務中的自動裝配,支持以下常用組件:

  • ChatModel:指定聊天模型
  • StreamingChatModel:流式響應聊天模型
  • ChatMemory:聊天記憶(內存存儲)
  • ChatMemoryProvider:分離記憶聊天(可指定存儲位置)
  • Tools:可自定義接口服務然后進行調用

以上不同的組件會在后續的文章中講解,接下來完成對AIService的初步使用:

2.1 引入依賴

<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-spring-boot-starter</artifactId>
</dependency>

2.2 編寫AIService接口

import dev.langchain4j.service.spring.AiService;
import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
public interface Assistant {String chat(String userMessage);
}

其中AIService帶了兩個參數,wiringMode默認為AiServiceWiringMode.EXPLICIT,即自動裝配chatModel,框架會自己去自動裝配IOC容器中已有的chatModel,而chatModel參數代表這里我們指定了模型qwenChatModel

2.3 測試代碼

可以注解將Assistant注入進測試代碼進行調用:

@Autowired
private Assistant assistant;@Test
public void testAssistant() {String answer = assistant.chat("你是誰");System.out.println(answer);
}

執行結果:

我是Qwen,這是我的英文名,中文名叫通義千問。我是阿里云自主研發的超大規模語言模型,能夠回答問題、創作文字,還能表達觀點、撰寫代碼。如果您有任何問題或需要幫助,請隨時告訴我,我會盡力提供支持。

這樣AIService就引入成功了!

3. 指令定制

在將我們的提示詞交給ai去解析之前,我們可以通過一些特定的注解,來完成對指令提示詞的重新定制

3.1 系統提示詞

@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
public interface Assistant {@SystemMessage("你是我的好朋友小明,請用粵語回答我的問題。 ")String chat(String userMessage);
}

在chat方法上添加@SystemMessage注解,該注解內部內容將會被轉換成SystemMessage對象,并于UserMessage一起發給LLM(大語言模型),且會在用戶提示詞之前提交給模型,相當于給此時的模型回復加上一個角色設定要求定制*,此時再問ai你是誰,回復會有所改變:

在這里插入圖片描述

如果你需要定制的要求內容較多,也可以將其存儲在一個資源文件中讓@SystemMessage去讀取:

@AiService(wiringMode = EXPLICIT, chatModel = "qwenChatModel")
public interface Assistant {@SystemMessage(fromResource = "myPrompt.txt")String chat(String userMessage);
}@Test
public void testAssistant()String answer = assistant.chat("你知道故宮嗎?");System.out.println(answer);
}

文件內容如下:

在這里插入圖片描述

執行結果:
在這里插入圖片描述

@SystemMessage的內容只會在這次記憶中給模型發送一次,但效果會在這次記憶中一直延伸。

3.2 用戶提示詞

@UserMessage能夠將方法參數嵌入到預定義的提示結構中,例如:

@UserMessage("你是誰,猜猜{{it}}") 
String chat(String userMessage);@Test
public void testAssistant()String answer = assistant.chat("我是誰");System.out.println(answer);
}

這里的{{it}}表示這里唯一參數的占位符,使用@UserMessage會將我們的提供給ai的提示詞信息嵌入到對應的占位符中,如上述的“我是誰”將轉變為:

你是誰,猜猜我是誰

執行結果如下:

在這里插入圖片描述

如果用戶提供的參數不止一個,則需要使用@V來結合使用:

@UserMessage("我的名字是{{name}},今年{{age}}歲,請用天津話回答問題。{{it}}")
String chat(@V("age") String age, @V("name") String name, @V("it") String userMessage);@Test
public void testAssistant() {String answer = assistant.chat("18", "李明", "我是誰");System.out.println(answer);
}// 用戶的提問內容會被轉變為:我的名字是李明,今年18歲,請用天津話回答問題。我是誰

執行結果:

在這里插入圖片描述

同時@V也可作用于@SystemMessage

@SystemMessage(fromResource = "myPrompt.txt")
String chat(@V("age") String age, @V("name") String name, @UserMessage String userMessage);@Test
public void testAssistant() {String answer = assistant.chat("20", "天天", "你那里有什么特色美食嗎");System.out.println(answer);
}

文件內容:

在這里插入圖片描述

執行結果:

在這里插入圖片描述

:這里需要做好對@SystemMessage和@UserMessage的區分,最直接的區別就是:@SystemMessage的內容會單獨優先發一條信息給模型,而@UserMessage則是將用戶提供的prompt與@UserMessage的內容結合起來然后一起發給模型,所以二者還是有區別的!

以上便是對AIService(基本使用與指令定制)的介紹與使用了,如果上述內容對大家有幫助的話請給一個三連關注吧💕( ?? ω ?? )??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91720.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91720.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AAAI趕稿后的心得

總結 已經第三次和老師們一起趕稿了&#xff0c;但是還是紕漏重重&#xff0c;每次都被我的垃圾寫作給嚇到。每次都手忙腳亂找不到重點&#xff0c;唉&#xff0c;我大概這輩子都成為不了郭老師&#xff1a; 自己把故事先捋清楚&#xff1a; 所有的東西都要抽象出來&#xff0c…

書籍推薦算法研究

## 項目概述本項目是一個完整的書籍推薦系統第五版(Complete Book Recommendation System V5),采用混合推薦策略,能夠處理6種不同的用戶場景,提供智能化的書籍推薦服務。## 系統架構### 核心設計思路系統采用**混合推薦策略**,結合了以下幾種推薦算法:1. **協同過濾推薦…

工具自動生成Makefile

cmake 基礎 cmake主要是生成Makefile&#xff0c;以便工程管理&#xff0c;只需要編寫CMakeLists.txt安裝camkesudo apt install cmake 安裝cmake camke --version 查看cmake版本 sudo apt upgrade cmake 升級cmake源碼隔離 在工程文件下創建一個build文件&…

Java項目:基于SSM框架實現的校園活動資訊網管理系統【ssm+B/S架構+源碼+數據庫+畢業論文+遠程部署】

摘 要 使用舊方法對校園活動資訊進行系統化管理已經不再讓人們信賴了&#xff0c;把現在的網絡信息技術運用在校園活動資訊的管理上面可以解決許多信息管理上面的難題&#xff0c;比如處理數據時間很長&#xff0c;數據存在錯誤不能及時糾正等問題。 這次開發的校園活動資訊網…

關于echarts的性能優化考慮

作為資深前端工程師&#xff0c;在處理 ECharts 性能問題時&#xff0c;核心思路是減少渲染壓力、優化數據處理、避免不必要的計算&#xff0c;尤其在大數據量&#xff08;萬級以上&#xff09;、高頻交互或多圖表場景下&#xff0c;性能優化尤為關鍵。以下是實戰中驗證過的有效…

汽車EDI:Vitesco EDI 項目案例

Vitesco Technologies&#xff08;緯湃科技&#xff09;脫胎于大陸集團的動力總成部門&#xff0c;是一家于2021年上市的全球領先汽車技術供應商。公司專注于電動出行領域&#xff0c;提供電驅動系統、電池管理系統、功率電子及熱管理等關鍵技術解決方案。同時&#xff0c;其業…

譯|Netflix 技術博客:一個利用視覺-語言模型和主動學習高效構建視頻分類器的框架

本篇介紹了Netflix的視頻標注器&#xff08;VA&#xff09;&#xff0c;一個利用視覺-語言模型和主動學習的交互式框架。其技術亮點在于通過人機協作系統&#xff0c;結合零樣本能力和主動學習&#xff0c;引導領域專家高效標注視頻數據&#xff0c;顯著提升了模型樣本效率和平…

前端應用權限設計面面觀

目錄 1. 權限設計:前端為啥要操這份心? 2. 權限模型的“內功心法”:RBAC 和 ABAC RBAC:簡單粗暴的角色分配 ABAC:靈活但燒腦的屬性控制 3. 權限數據的“物流體系”:從后端到前端的旅程 權限數據從哪兒來? 權限數據咋存? 權限數據咋用? 4. 路由守衛:權限的“第…

Javaweb————Apache Tomcat服務器介紹及Windows,Linux,MAC三種系統搭建Apache Tomcat

&#x1f3cd;?&#x1f3cd;?&#x1f3cd;?第一部分&#xff1a;什么是服務器&#xff1f; 服務器是遠程的一個電腦,里面安裝服務器程序監聽對應的端口對外提供服務&#xff0c;可以根據用戶的請求去獲取對應的數據并返回給調用方。 &#x1f3cd;?&#x1f3cd;?&#…

winsock socket通訊為什么UDP服務器無法獲取客戶端IP?

針對VB6 Winsock開發中UDP服務器無法獲取客戶端IP的問題&#xff0c;以下是系統性排查方案&#xff1a; 一、基礎協議特性確認UDP無連接特性 Winsock的UDP協議本身是無連接的&#xff0c;需通過GetPeerName方法主動獲取對端IP&#xff0c;而非自動存儲。數據接收處理 必須在Dat…

大模型時代,Transformer 架構中的核心注意力機制算法詳解與優化實踐

大模型時代&#xff0c;Transformer 架構中的核心注意力機制算法詳解與優化實踐Transformer 注意力機制深度解析與工業級優化實踐一、注意力機制核心原理1.1 基礎注意力公式1.2 多頭注意力&#xff08;Multi-Head&#xff09;1.3 注意力機制可視化二、工業級優化技術2.1 計算效…

自學嵌入式 day40 51單片機

一、嵌入式&#xff1a;以應用為中心&#xff0c;計算機為基礎&#xff0c;軟硬件可剪裁的專用計算機系統二、MCU&#xff1a;Micro Controcler Unit 微控制單元->單片機1、特點&#xff1a;集成化高&#xff0c;集成到一塊芯片外設&#xff08;GPIO、UART、ADC&#xff09;…

Minimizing Coins(Dynamic Programming)

題目描述Consider a money system consisting of n coins. Each coin has a positive integer value. Your task is to produce a sum of money x using the available coins in such a way that the number of coins is minimal. For example, if the coins are {1,5,7} and t…

Kafka——關于Kafka動態配置

引言在Kafka的運維實踐中&#xff0c;參數配置的調整曾是一件令工程師頭疼的事情。傳統模式下&#xff0c;Broker的所有參數都需要在server.properties中靜態定義&#xff0c;任何修改都必須重啟Broker才能生效。對于承載著核心業務的生產集群而言&#xff0c;頻繁重啟不僅意味…

MSQL-聚簇索引與非聚簇索引的比較

聚簇索引詳解InnoDB 的聚簇索引特性表數據本身就是聚簇索引&#xff1a;數據行實際存儲在聚簇索引的葉子節點中"表就是索引&#xff0c;索引就是表"的結構每個InnoDB表有且只有一個聚簇索引聚簇索引的葉子節點存儲的是&#xff1a;真實數據主鍵作為聚簇索引&#xff…

語音識別數據集

目錄 Voice Activity Detection 自己采集&#xff1a; 1. ASR Resources&#xff08;語音識別資源&#xff09; 2. LM Resources&#xff08;語言模型資源&#xff09; 這是一個數據表&#xff1a; 噪聲數據集&#xff1a; Voice Activity Detection 自己采集&#xff1a…

Linux線程同步與互斥(上)

目錄 前言 1.互斥 1.先來見一種現象&#xff08;數據不一致問題&#xff09; 2.如何解決上述問題 3.理解為什么數據會不一致&&認識加鎖的接口 4.理解鎖 5.鎖的封裝 前言 在前面對線程的概念和控制的學習過程中&#xff0c;我們知道了線程是共享地址空間的&#…

Codeforces Global Round 27

ABC 略D將每個數拆成x*2的整數次冪&#xff0c;一個直接的想法是盡量把2的整數次冪給大的數。那么所有乘上2的整數次冪的數構成的序列單調遞減&#xff0c;反證法&#xff0c;如果序列中存在i j 使得a[i]<a[j]&#xff0c;那么我們不如把給a[i]乘的2的冪給a[j]乘。#include …

深入 Go 底層原理(二):Channel 的實現剖析

1. 引言"Do not communicate by sharing memory; instead, share memory by communicating." (不要通過共享內存來通信&#xff0c;而應通過通信來共享內存。) 這是 Go 語言并發設計的核心哲學。而 channel 正是實現這一哲學的核心工具。Channel 為 Goroutine 之間的…

Golang 語言的編程技巧之類型

1、介紹Golang 語言是一門靜態類型的編程語言&#xff0c;我們在編寫代碼時&#xff0c;為了提升代碼的靈活性&#xff0c;有時會使用空接口類型&#xff0c;對于空接口類型的變量&#xff0c;一般會通過類型斷言判斷變量的類型&#xff0c;而且可能還會遇到遇到類型轉換的場景…