【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(基本使用與指令定制)的介紹與使用了,如果上述內容對大家有幫助的話請給一個三連關注吧💕( ?? ω ?? )??