文章目錄
- 1.自定義攔截器
- 1.2自定義Advisor
- 1.2打斷點調試過程
- 1.3Re-reading Advisor自定義實現
- 2.戀愛報告開發--json結構化輸出
- 2.1原理介紹
- 2.1代碼實現
- 2.3編寫測試用例
- 2.4結構化輸出效果
1.自定義攔截器
1.2自定義Advisor
spring里面的這個默認的是SimpleloggerAdvisor,但是這個默認的但因的日志級別是debug級別的,正常情況下,我們是看不到的,我們可以在源碼里面去看一下:
為了方便我們快速地定位這個源碼里面去:我們可以使用這個new的方法,然后右鍵選擇goto這樣的方法進行跳轉
可以看到這個攔截器默認的日志級別就是debug級別的,也就是我們默認情況下是無法輸出的:
如果你想要改變這個默認輸出級別,這個也是有方法的,在這個配置文件里面進行指定就可以了:
如果你想要看到這個.java文件,因為我們自己去實現的時候需要在這個原來的官方實現的基礎上面去進行修改,因此這個時候我們需要找到原來的這個java文件,我自己點擊去之后發現是class文件,顯然不是我們想要的:
這個時候的做法就是選擇上面的藍色框里面的download resource這個選項,就可以把這個對應的java文件進行下載了;
下載之后的這個文件就是我們的官方是如何實現這個simpleadvisor的相關的方法的,這個時候我們直接把這個里面的所有的代碼復制到我們的包包下面,然后再官方的基礎上面進行整合和修改即可:
首先我們需要不同的方法之間的調用關系,before就是我們上面說的這個攔截器,對于這個用戶的輸入進行處理after就是對于響應的處理,因此這個方法需要保留,原來的這個log事debug模式的,現在我們自定義他成為info格式的,方便我們的后續的輸出查看效果;
其次就是這個里面的兩個方法了:流式調用和非流式調用的兩個方法:非流式調用就是下面的這個aroundcall這個方法,流式調用就是下面的這個stream方法,stream在英文里面的解釋就是小溪,小河的意思,這個也是很容易理解的;
每一個方法里面的都有這個next方法,也就是繼續往這個下面去走,flux就是對于相應進行聚合處理,方便我們對于整個響應進行觀察和處理;
這個時候,大家就可以看到這個打印的日志和我們自定義的advisor輸出的這個內容了,都是使用的這個requst和response這個樣子的格式書寫的;
1.2打斷點調試過程
為什么要額外的去做一下這個部分,因為對于初學者而言,通過調試能夠讓我們更好的理解這個調用的過程,以及我們的輸入是如何被大模型進行處理的,以及這個輸出是如何被得到的;
這個時候我們可以發現:系統得到了我們的用戶輸入的內容usertext,而這個systemytext就是我們的系統默認的預設,這個也是我們的代碼里面就有設計的;
在這個調試的信息里面,我們可以看到我們的個人的調用大模型的設置:
以及我們可以看到這個messageChatMemory對應的這個優先級的信息,這個order是一個負數,這個數字越小,證明這個對應的優先級就是越高的;
在接下來繼續執行的過程中:我們也是可以看到這個輸出的內容的,也就是我們的response相關的內容,在這個調試的過程里面我們也是可以看到的;
1.3Re-reading Advisor自定義實現
英語學的不錯的小伙伴這個時候大概也是可以猜到的,就是這個re-reading表示的就是重讀,也就是把我們給的這個提示詞重新復述一下,這個時候AI的回答就有可能產生不一樣的這個效果;
下面的這個使用的其實是模版字符串,也就是下面的這個re2_input_query實際上是把我們的用戶的輸入整成一個模版,放到我們的文本信息里面去;
下面的這個代碼來自于官方文檔,主要是了解這個特性,實際上我們不會經常使用,因為這個重述的操作是消耗了2倍的這個token的,因此我們只會在特定的場景下面進行使用;
這個是重讀,所以這個代碼里面的aroundcall和aroundstream沒有進行其他的處理,直接返回即可;
2.戀愛報告開發–json結構化輸出
2.1原理介紹
這個事我們的戀愛報告開發里面的很重要的一個步驟,就是理解什么是結構化輸出??
通過下面的這個圖片,希望可以幫助大家去更好的理解什么是結構化輸出:實際上就是交給大模型處理之前進行相關的設置,例如,告訴這個大模型我們需要以json格式進行格式化輸出,輸出的結果啥的最后經過機構化轉換器的處理,把原始的文本處理成為結構化的輸出內容,這個過程里面結構化轉換器發揮了一個非常重要的作用;
2.1代碼實現
接下來,我們需要去實現一下這個結構化輸出的特性:
首先,我們在原來的這個基礎上面去cv代碼,大部分框架都是不變的,我們把這個名字修改一下,可以看到這個prompy每次用戶的輸入之后都會加上圖示里面的“內容建議為列表”,這個實際上就是結構化輸出的prompt,相當于針對用戶輸入,進行額外的處理,然后在發送到這個大模型那邊去;
其中這個結構化輸出的方法里面添加了這個entity,里面的參數是我們的record,實際上這個就是我們的title和suggestions,這個實際上是我們的結構化輸出里面的標題和json內容,在下面的調試過程里面你就會看到;
2.3編寫測試用例
測試里面就是調用上面寫的這個方法,看看這個結構化輸出的結果,其他的都是保持不變的,我們的這個message直接使用上面的提示詞也是沒有問題的;
2.4結構化輸出效果
如何看到這個結構化輸出的結果,我們可以使用斷點調試的方式對于這個過程進行監控和處理:然后就可以在斷點里面看到這個過程里面的非常詳細的這個數據了;可以看到這個就是使用json的格式進行輸出的;
為什么要達到這個結構化輸出的目的,這個實際上是為了下面的持久化保存進行鋪墊的,因為結構化輸出的這個數據方便我們進行這個保存之類的,諸如放到這個數據庫里面,非常的方便,普通的原始文本不具備這樣的特性,當然,這都是后話了;
數據方便我們進行這個保存之類的,諸如放到這個數據庫里面,非常的方便,普通的原始文本不具備這樣的特性,當然,這都是后話了;
[外鏈圖片轉存中…(img-cqkgzaVB-1746270376115)]