SpirngAI框架 Advisor API詳解

SpringAI提供了Advisors API來實現請求和響應的攔截,修改,增強Spring應用程序和AI模型的互動。

可以使用ChatClient API來配置現有的advisor,例如:

var chatClient = ChatClient.builder(chatModel)

??? .defaultAdvisors(

??????? new MessageChatMemoryAdvisor(chatMemory), // chat-memory advisor

??????? new QuestionAnswerAdvisor(vectorStore)??? // RAG advisor

??? )

??? .build();

String response = this.chatClient.prompt()

??? // Set advisor parameters at runtime

??? .advisors(advisor -> advisor.param("chat_memory_conversation_id", "678")

??????????? .param("chat_memory_response_size", 100))

??? .user(userText)

??? .call()

.content();

Advisor中的核心組件:

包括非流式場景中的CallAroundAdvisor和CallAroundAdvisorChain構成,其中CallAroundAdvisorChain是由一系列CallAroundAdvisor構成的鏈。非流式場景中的StreamAroundAdvisor和StreamAroundAdvisorChain構成。

還有AdvisorRequest用于表示沒有密封的Prompt請求,AdvisorResponse表示聊天完成的響應,還有上下文AdviseContext,這個上下文用于保存

AdvisorRequest和AdvisorResponse在鏈中的共享狀態。

callAroundNext()和streamAroundNext()是關鍵的方法,在這個方法中對請求和響應進行響應的操作,并且可以決定是否調用下一個advisor進行后續的操作。

getOrder()提供鏈中advisor的訪問順序,返回值越小的在鏈中的位置越靠前,還有getName()方法返回advisor的名稱。最后一個advisor由SpringAI框架自動添加,并把請求發送到AI模型。

在鏈條中越靠前的advisor先執行對AdvisorRequest的操作,越后執行對AdvisorResponse的操作。注意:如果有多個advisor的getOrder()的返回值相同,可能無法保證順序執行,因此要避免多個相同的order值。

SpringAI框架中的Advisor接口關系:

接下來自定義實現一個advisor:

上述實現了一個問題重讀的advisor,就是讓AI模型把問題讀兩遍。

SpringAI框架也提供了一些內置的advisor,比如:

1.MessageChatMemoryAdvisor:添加歷史對話為消息列表,以.message(…)的形式插入到prompt,維護完整的對話結構,適用于完整對話上下文,高級模型(部分模型不支持該advisor)

2.PromptChatMemoryAdvisor:添加歷史對話為系統提示,拼接成一個字符串插入到系統提示中。適用于簡單記憶,對所有模型兼容。

3.VectorStoreChatMemoryAdvisor:從vectorStore中檢索相關信息添加到系統提示中,通常用于提供背景信息。

4.QuestionAnswerAdvisor:用戶提問時,自動從vectorStore中檢索最相關的文檔,添加到用戶提示中,常用于RAG的精準回答。

SafeGardAdvisor:用于防止模型生成有害或不適信息

要更新 context,需要使用 .updateContext(...) 方法,它會創建一個新的不可變 map,并包含更新后的內容,例如:

@Override

public AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {

??? this.advisedRequest = advisedRequest.updateContext(context -> {

??????? context.put("aroundCallBefore" + getName(), "AROUND_CALL_BEFORE " + getName());

??????? context.put("lastBefore", getName());

??????? return context;

??? });

??? // 后續邏輯...

}

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

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

相關文章

用go從零構建寫一個RPC(仿gRPC,tRPC)--- 版本1(Client端)

這里我們來實現這個RPC的client端 為了實現RPC的效果,我們調用的Hello方法,即server端的方法,應該是由代理來調用,讓proxy里面封裝網絡請求,消息的發送和接受處理。而上一篇文章提到的服務端的代理已經在.rpc.go文件中…

bpftrace 中使用 bpf_trace_printk

bpf_trace_printk bcc 中可以通過 bpf_trace_printk 來打印輸出 , 同時有個非常有用的功能, 同時輸出到 /sys/kernel/tracing/trace 文件中 比如bcc代碼 // read_trace.c&#xff08;eBPF 內核態代碼&#xff09; #include <vmlinux.h> #include <bpf/bpf_helpers.h…

解決 Chrome 與 Chromedriver 版本不一致問題的方法

目錄 常見錯誤處理 處理方案&#xff1a; 1. 自動版本匹配方法 使用 webdriver-manager 庫&#xff08;推薦&#xff09; 2. 手動版本管理方法 檢查并匹配版本 3. 版本兼容性解決方案 使用兼容性表 4. 自動更新策略 定期檢查更新腳本 5. Docker 容器化方案 最佳實踐建…

【強化學習】強化學習算法 - 多臂老虎機問題

1、環境/問題介紹 概述&#xff1a;多臂老虎機問題是指&#xff1a;智能體在有限的試驗回合 &#x1d447; 內&#xff0c;從 &#x1d43e; 臺具有未知獎賞分布的“老虎機”中反復選擇一個臂&#xff08;即拉桿&#xff09;&#xff0c;每次拉桿后獲得隨機獎勵&#xff0c;目…

pcie協議復位

pcie協議復位共有4中情況&#xff1b;cold reset&#xff1b;warm reset&#xff1b;hot reset&#xff1b;function level reset&#xff1b; 分類&#xff1a; 依據spec 6.6&#xff1a; Conventional reset&#xff08;傳統復位&#xff09;&#xff1a;cold&#xff0c;…

Redis--哈希類型

目錄 一、Hash 哈希 1.2 常用命令 1.2.1 HSET 1.2.2 HGET 1.2.3 HEXISTS 1.2.4 HDEL 1.2.5 HKEYS 1.2.6 HVALS 1.2.7 HGETALL 1.2.8 HMGET 1.2.9 HLEN 1.2.10 HSETNX 1.2.11 HINCRBY 1.2.12 HINCRBYFLOAT 1.3 內部編碼 一、Hash 哈希 幾乎所有的主流編程語言都提…

華為安全認證好還是數通認證好?

在華為認證體系中&#xff0c;安全認證 與數通認證 &#xff08;數據通信&#xff09;是兩個熱門方向&#xff0c;分別面向網絡安全與網絡架構領域。 安全和數通的技術難度對比 市場需求 安全認證&#xff1a;隨著網絡安全形勢日益嚴峻&#xff0c;企業對網絡安全的重視程度不…

Nacos源碼—5.Nacos配置中心實現分析二

大綱 1.關于Nacos配置中心的幾個問題 2.Nacos如何整合SpringBoot讀取遠程配置 3.Nacos加載讀取遠程配置數據的源碼分析 4.客戶端如何感知遠程配置數據的變更 5.集群架構下節點間如何同步配置數據 4.客戶端如何感知遠程配置數據的變更 (1)ConfigService對象使用介紹 (2)客…

電力MOSFET的專用集成驅動電路IR2233

IR2233是IR2133/IR2233/IR2235 系列驅動芯片中的一種,是專為高電壓、高速度的電力MOSFET和IGBT驅動而設計的。該系列驅動芯片內部集成了互相獨立的三組板橋驅動電路,可對上下橋臂提供死區時間,特別適合于三相電源變換等方面的應用。其內部集成了獨立的運算放大器可通過外部橋…

六級閱讀———2024.12卷一 仔細閱讀2

文章 An awakening has been taking place in the physical world against the beauty model that has been dictated to us for years.But in the digital arena,social media determines what is considered beautiful.(51) The two opposing struggles are taking place i…

【C/C++】errno/strerror 和 GetLastError()/FormatMessage 的區別

strerror 和 errno 詳解 printf("Error: %s\n", strerror(errno));這行代碼用于在 C 語言中輸出系統錯誤信息&#xff0c;但它與 Windows 的 GetLastError() 有重要區別。下面我將詳細解釋每個部分及其工作原理。 1. 組件解析 errno 定義&#xff1a;errno 是一個…

Unicode和UTF - 8主要有以下區別

Unicode和UTF - 8主要有以下區別 概念范疇 Unicode:是字符集 。它為世界上幾乎所有的字符(包括各國文字、標點符號、特殊符號等)分配了唯一的編號,這個編號也叫碼位、碼點,比如“中”字的Unicode碼點是U+4E2D 。它規定了字符的抽象表示,只關注字符與數字編號的對應關系,…

企業數字化轉型第二課:接受不完美(1/2)

一.引言 先看一組中國企業數字化轉型相關的數據&#xff1a; 戰略認知層面&#xff1a;92%中國企業將數字化納入戰略核心&#xff08;麥肯錫2023&#xff09;執行困境層面&#xff1a;63%企業轉型首年遭遇重大挫折&#xff08;BCG 2024追蹤&#xff09;價值釋放周期&#xff1…

OSCP - Proving Grounds - Sumo

主要知識點 ShellShock漏洞dirtycow提權 具體步驟 執行nmap掃描,比較直觀&#xff0c;22和80端口開放&#xff0c;但是80端口沒有什么內容 Nmap scan report for 192.168.210.87 Host is up (0.44s latency). Not shown: 65533 closed tcp ports (reset) PORT STATE SERV…

pyqt寫一個TCP(UDP)檢測工具

先用電腦連接到目標WIFI&#xff0c;再運行以下代碼。 import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtNetwork import *class NetTestTool(QWidget):def __init__(self):super().__init__()self.init_ui()self.tcp_socket QTcpSocket()…

趣味編程:夢幻萬花筒

目錄 1.效果展示 2.源碼展示 3.代碼邏輯詳解 3.1 頭文件與宏定義 3.2 HSV函數轉RGB顏色函數 3.3 主函數 初始化部分 循環部分 線條繪制部分 刷新和延時部分 結束部分 4.小結 本篇博客主要介紹趣味編程用C語言實現萬花筒小程序。 1.效果展示 2.源碼展示 #define…

軟件開發各階段的自動化測試技術詳解

引言 在當今快速迭代的軟件開發環境中&#xff0c;自動化測試已成為保證軟件質量、提高測試效率的重要手段。本文將深入探討軟件開發生命周期各個階段的自動化測試技術&#xff0c;包括單元測試、代碼級集成測試、Web Service測試和GUI測試的自動化實現方法。 單元測試的自動…

Elasticsearch:我們如何在全球范圍內實現支付基礎設施的現代化?

作者&#xff1a;來自 Elastic Kelly Manrique SWIFT 和 Elastic 如何應對基礎設施復雜性、誤報問題以及日益增長的合規要求。 金融服務公司在全球范圍內管理實時支付方面面臨前所未有的挑戰。SWIFT&#xff08;Society for Worldwide Interbank Financial Telecommunication -…

day009-用戶管理專題

文章目錄 1. 創建包含時間的文件2. 與用戶相關的文件3. 用戶分類4. 與用戶相關的命令4.1 添加用戶4.2 刪除用戶4.3 查看用戶4.4 修改用戶密碼 5. sudo6. 思維導圖7. 老男孩思想-學習方法 1. 創建包含時間的文件 或$()是替換符號&#xff0c;可以將命令的結果作為字符串或變量的…

shell腳本實現遠程重啟多個服務器

直接deepseek幫寫腳本 remoteReboot.sh #!/bin/bash # 配置文件路徑&#xff08;格式&#xff1a;每行一個服務器地址&#xff09; SERVER_FILE"servers.list" # 讀取服務器列表 mapfile -t SERVERS < "$SERVER_FILE" for server in "${SERVER…