iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
生成式 AI

使用 Spring AI 打造企業 RAG 知識庫系列 第 17

Day17 - 讓 AI 記住對話

  • 分享至 

  • xImage
  •  

土炮記憶

https://ithelp.ithome.com.tw/upload/images/20240817/20161290GI4axNwalT.png
要讓 AI 記住對話,可以建立一個 List,並將對話紀錄加進 List 中,就如昨天所說 AI 就能根據歷史訊息回答相關問題

程式碼實作

程式碼中只需在發問前將訊息加入 List,之後將整串 List 發送給 AI

@RestController
@RequiredArgsConstructor
public class AiClientController {
	private final ChatClient chatClient;
	private List<Message> memMessage = new ArrayList<>();
	
	@GetMapping("/memchat")
	public String chat(@RequestParam String prompt) {
		memMessage.add(new UserMessage(prompt));
		ChatResponse chatResponse = chatClient.prompt()
				.messages(memMessage)
				.call()
				.chatResponse();
		return chatResponse.getResult().getOutput().getContent();
	}
}

可以看出 API 早就設計好了,.messages() 可以直接傳入 List,AI 會自動將最後一筆 UserMessage 當成提問,之前的 UserMessage 則會當成歷史對話

測試成果

來看看測試結果
1.發問: 我是凱文大叔,之後回答問題請都先叫我的名字
https://ithelp.ithome.com.tw/upload/images/20240817/20161290RoTAQ8UDFr.png

2.發問: 目前的模型是甚麼版本
https://ithelp.ithome.com.tw/upload/images/20240817/20161290SqWbhqAO1X.png

AI 不只能記住之前的對話,還能依要求每次都先稱呼我
如果要有更好的記憶效果,還能把 AI 回答的 Message 也加入 List

memMessage.add(chatResponse.getResult().getOutput());
//返回結果前先將 AssistantMessage 加入List

思考問題點

這樣我們就完成一個有超強記憶的聊天機器人了,不過思考一下這程式有甚麼問題?

  1. 每個進來聊天的訊息都會被加入 List,造成記憶混亂
    解決方式: 如同 ChatGPT,每開啟一個對話都有獨立的 Chat ID.List 需要加入 Chat ID 作為區分
  2. 每次聊天都會附加一堆歷史訊息,造成 Token 數量大增
    解決方式: 設定 List 紀錄上限,超過上限就清除之前的內容
  3. 重新啟動就喪失記憶
    解決方式: 將歷史訊息存入資料庫,發問時只擷取一定的數量的對話

要做到這些功能雖不難,但還挺繁瑣的,好在 Spring AI 在 1.0.0-SNAPSHOT 增加了 ChatMemory ,繁瑣的操作就交給 Spring AI 來處理,明天就來看看如何使用 Spring AI 提供的記憶類別

回顧

今天學到甚麼?

  1. 將歷史對話放入 List 即可作為 AI 的記憶
  2. 使用 List 儲存記憶會有甚麼問題?又該如何解決

Source Code

今日程式碼: https://github.com/kevintsai1202/SpringBoot-AI-Day17.git


認識凱文大叔

凱文大叔使用 Java 開發程式超過 20 年,對於 Java 生態非常熟悉,曾使用反射機制開發 ETL 框架,對 Spring 背後的原理非常清楚,目前以 Spring Boot 作為後端開發框架,前端使用 React 搭配 Ant Design
下班之餘在 Amazing Talker 擔任程式語言講師,並獲得學員的一致好評

最近剛成立一個粉絲專頁-凱文大叔教你寫程式 歡迎大家多追蹤,我會不定期分享實用的知識以及程式開發技巧

想討論 Spring 的 Java 開發人員可以加入 FB 討論區 Spring Boot Developer Taiwan

我是凱文大叔,歡迎一起加入學習程式的行列


上一篇
Day16 - 魔鏡~誰是Spring AI的專家?
下一篇
Day18 - Spring AI 官方記憶
系列文
使用 Spring AI 打造企業 RAG 知識庫21
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言