在之前的文章\(^{[ 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 快速上手