在之前的文章\(^{[ 1 ]}\)中,原方案的設計,是基于功能實作的角度去設計的,對于功能性的拓展,考慮不全面,結合收到的反饋意見,對專案進行了拓展優化,完成的優化拓展有如下幾個方面
固定會話
原實作方案中預留了chatId這個欄位,原chatId并未起到實際作用,是為后續功能拓展所預留的欄位,在原實作方案的網頁聊天中,該chatId為隨機生成的UUID,
網頁會話
| 訪問地址 | 特點 | 介紹 |
|---|---|---|
chat/web |
每次進入網頁,生成的會話ID都是隨機的,保證不同用戶的會話背景關系不會產生干擾 | 原實作方案 |
chat/{chatId} |
現進入網頁,chatId由業務系統指定,可以用于記錄訊息歷史記錄,背景關系由該chatId關聯查詢 |
新增方案 |
固定會話的意義由幾個功能來體現
-
支持歷史訊息
-
支持用戶與會話映射(由業務系統自行實作)
類似
ChatGPT官網,一個用戶關聯多個chatId,根據選擇的會話可以查詢到之前詢問的歷史訊息和繼續聯系背景關系進行提問,
歷史訊息
當前實作方案提供的歷史訊息功能是基于本地快取構建的,歷史訊息被存盤在記憶體中,不是持久化存盤,當專案重啟或者垃圾回收,存盤的歷史訊息記錄就會丟失,為了方便業務系統更好的集成,持久化資料存盤,提供了如下介面,
對如下介面進行拓展實作,覆寫默認的系統方案,即可完成持久化歷史訊息存盤,
public interface ChatCacheService {
/**
* 根據會話記錄查詢歷史記錄
* @param chatId
* @return
*/
List<ChatMessage> history(String chatId);
/**
* 查詢歷史記錄
* @param chatId 會話ID
* @param limit 限制條數
* @return
*/
List<ChatMessage> history(String chatId,Integer limit);
/**
* 訊息寫入
* @param message
*/
void write(String chatId, ChatMessage message);
}

鑒權拓展
lucy-chat提供了自定義注解@ChatAuth,并且將該注解添加到了所有的API上,第三方系統集成后,可以通過構建@Aspect對該注解進行攔截處理,以判斷當前用戶是否有權訪問對應介面,
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ChatAuth {
// it is anything
String value() default "";
}
由業務系統自行實作切面,完成對介面的鑒權,該鑒權模式的優點是具有更大的自由度,可以拋出自定義例外,可以結合其他業務邏輯(如呼叫請求次數、頻率)等進行鑒權處理,
如何構建切面鑒權,請查看 切面實作
開源地址
專案采用MIT協議
https://gitee.com/Kindear/lucy-chat
安裝
請參考文章\(^{[1]}\)
檔案
更多檔案請參閱 Lucy-Chat 快速上手\(^{[2]}\)
參考
[1] Kindear.Springboot 接入 ChatGPT [EB/OL] 博客園
[2] Lucy-Chat 快速上手
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/550004.html
標籤:其他
上一篇:手把手教你如何免費Midjourney Adobe FireFly AI繪圖—Window本地快速部署stable diffusion AI繪圖及使用指南(小白也能學會)
