Spring AI調用Embedding模型返回HTTP 400:Invalid HTTP request received分析處理

調用Embedding模型失敗

Spring AI項目使用的Embedding模型是公司平臺部署的,請求模型服務的時候報錯,返回了HTTP 400 - Invalid HTTP request received錯誤。然后換成云廠商在線Embedding模型地址,正常調通。我用Apifox直接調用公司的模型服務,能正常調通。當時真的百思不得其解。
在這里插入圖片描述

Spring AI客戶端排查

Spring AI項目中我用的Http客戶端是apachehttpclient5(后面切成netty的也報同樣的錯誤),代碼調試沒發現有什么異常的地方,然后把httpclient5的日志級別調成debugorg.apache.hc: debug),再次發送請求,有個請求頭引起來我的注意。

org.apache.hc.client5.http.wire          : http-outgoing-0 >> "Transfer-Encoding: chunked[\r][\n]"

問了一下AI,這個請求頭的意思

Transfer-Encoding: chunked 是一種HTTP分塊傳輸編碼。當發送方無法預先知道消息體總長度時(如動態生成內容),可將其分割為多個帶大小標記的“塊”流式發送。每個塊先發十六進制長度,再發數據,以長度為0的塊結束。它與Content-Length互斥,不能共存

于是我在Apifox那邊也加上這個請求頭,調用直接返回同樣的錯誤,去掉就能正常返回向量信息。直接通過Apifox調用在線的Embedding模型地址,并且加上這個請求頭,也能成功調通。所以問題大概率出現在公司部署的服務上。因為我找了一圈,也沒找到Spring AI有配置相關請求頭的地方,所以這種請求方式無法改變(有可能有設置不分塊傳輸的,只是我沒發現,我感覺概率應該很低)。

部署的模型服務排查

由于模型是其他部門部署的,所以就去要了一個項目代碼,這里稱為ProxyA,當時同事告訴我說,這個ProxyA主要是做的代理服務,適配了一下OpenAI的接口格式,項目調用的都是這個服務(說langchain4j是能正常調通的,排除這個服務的問題),再由此服務轉發至對應的模型服務(過了兩天又拿到了這個服務的代碼),模型服務這里稱為ModelB

調用過程就是項目—>ProxyA—>ModelB

ProxyA排查

ProxyA使用的是Flask框架,處理/embeddings地址的方法是emb()

@api_blueprint.route('/embeddings', methods=['POST'])
def emb():

拿到ProxyA代碼之后,項目請求我本地的ProxyA地址,再次發送請求,成功的進入到了emb()里面。也就是說,調用ProxyA是沒有問題的,是ProxyA調用ModelB出了問題。
后面debug到了一段關鍵的代碼,這個代碼就是把項目的請求轉發到ModelB服務,關鍵是這個請求頭,沒做什么處理,就直接轉發給了ModelB服務

def emb():# 省略......# 調用具體的模型服務地址,并且把接收到的請求頭放進去resp = requests.post(ModelB_url, headers=headers, json=data, timeout=10)return .....

后面在轉發請求代碼之前處理了一下,代碼如下:

def emb():# 省略......# 如果存在Transfer-Encoding: chunked,就去掉,然后加上Content-Length頭if 'Transfer-Encoding' in headers and headers['Transfer-Encoding'] == 'chunked':# 移除Transfer-Encoding頭部del headers['Transfer-Encoding']# 添加Content-Length頭部import json as json_modulecontent_length = len(json_module.dumps(data).encode('utf-8'))headers['Content-Length'] = str(content_length)# 調用具體的模型服務地址,并且把接收到的請求頭放進去resp = requests.post(ModelB_url, headers=headers, json=data, timeout=10)return .....

處理之后,再次調用,發現Spring AI項目可以正常調用公司部署的Embedding模型了

ModelB排查

后面要到ModelB服務的git權限之后,拉取代碼本地試了一下,項目可以直接調通ModelB服務,不再報HTTP 400 - Invalid HTTP request received錯誤,只是因為格式不對,報了其他的錯誤。所以ModelB服務也是沒有問題的。就是ProxyA服務請求轉發的時候出了問題。
沒拿到ModelB代碼之前,還一頓懷疑是ModelB出了問題,糾結要不要去掉ProxyA里面的那段處理代碼(畢竟不是專業Python開發😂)。

總結

ProxyA接收到分塊傳輸請求之后,通過requests.post轉發請求的時候,由于沒有對請求頭進行過濾,導致轉發的請求頭中存在Transfer-Encoding: chunked,所以調用ModelB的時候出現無效Http請求的異常。
進到emb()方法中,實際項目對ProxyA的請求已經被完整接收了,也就是數據都傳輸過來了,但是requests.post轉發的時候,json是一個確定的對象,可以明確大小的,也就是轉發的時候壓根不是分塊請求,頭部又設置成了分塊傳輸,自然就有問題了。由于我不是python開發,這段話有說的不對的,還望大佬們指正。

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

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

相關文章

Pytorch-02數據集和數據加載器的基本原理和基本操作

1. 為什么要有數據集類和數據加載器類? 一萬個人會有一萬種獲取并處理原始數據樣本的代碼,這會導致對數據的操作代碼標準不一,并且很難復用。為了解決這個問題,Pytorch提供了兩種最基本的數據相關類: torch.utils.data…

無圖形界面的CentOS 7網絡如何配置

進入虛擬機輸入ip addr命令:從 ip addr命令的輸出可以明確看出 ??lo和 ens33是兩個不同的網絡接口(網卡)lo(回環接口)????作用??:虛擬的本地回環網卡,用于本機內部通信(如 1…

機器學習之線性回歸的入門學習

線性回歸是一種監督學習算法,用于解決回歸問題。它的目標是找到一個線性關系(一條直線或一個超平面),能夠最好地描述一個或多個自變量(特征)與一個因變量(目標)之間的關系。利用回歸…

2-5 Dify案例實踐—利用RAG技術構建企業私有知識庫

目錄 一、RAG技術的定義與作用 二、RAG技術的關鍵組件 三、RAG技術解決的問題 四、RAG技術的核心價值與應用場景 五、如何實現利用RAG技術構建企業私有知識庫 六、Dify知識庫實現詳解 七、創建知識庫 1、創建知識庫 2、上傳文檔 3、文本分段與清洗 4、索引方式 5、…

斷路器瞬時跳閘曲線數據獲取方式

斷路器瞬時短路電流時,時間是在60ms內的,仿真器去直接捕獲電流有效值很難。按照電流互感器的電流曲線特性,電流越大,由于互感器飽和,到達一定電流值的時候,電流會趨于平穩不再上升,ADC-I曲線由線…

技巧|SwanLab記錄混淆矩陣攻略

繪制混淆矩陣(Confusion Matrix),用于評估分類模型的性能。混淆矩陣展示了模型預測結果與真實標簽之間的對應關系,能夠直觀地顯示各類別的預測準確性和錯誤類型。 混淆矩陣是評估分類模型性能的基礎工具,特別適用于多…

HTTPS的工作原理

文章目錄HTTP有什么問題?1. 明文傳輸,容易被竊聽2. 無法驗證通信方身份3. 數據完整性無法保證HTTPS是如何解決這些問題的?HTTPS的工作原理1. SSL/TLS握手2. 數據加密傳輸3. 完整性保護4. 連接關閉總結HTTP有什么問題? 1. 明文傳輸…

ECMAScript2020(ES11)新特性

概述 ECMAScript2020于2020年6月正式發布, 本文會介紹ECMAScript2020(ES11),即ECMAScript的第11個版本的新特性。 以下摘自官網:ecma-262 ECMAScript 2020, the 11th edition, introduced the matchAll method for Strings, to produce an …

機器視覺引導機器人修磨加工系統助力芯片封裝

芯片制造中,劈刀同軸度精度對封裝質量至關重要。傳統加工在精度、效率、穩定性、良率及操作便捷性上存在不足:精度不足:劈刀同軸度需控在 0.003mm 內,傳統手段難達標,致芯片封裝良率低;效率良率低 &#xf…

Python編程基礎與實踐:Python模塊與包入門實踐

Python模塊與包的深度探索 學習目標 通過本課程的學習,學員將掌握Python中模塊和包的基本概念,了解如何導入和使用標準庫中的模塊,以及如何創建和組織自己的模塊和包。本課程將通過實際操作,幫助學員加深對Python模塊化編程的理解…

【Django】-4- 數據庫存儲和管理

一、關于ORM ORM 是啥呀ORM 就是用 面向對象 的方式,把數據庫里的數據還有它們之間的關系映射起來~就好像給數據庫和面向對象之間搭了一座小橋梁🎀對應關系大揭秘面向對象和數據庫里的東西,有超有趣的對應呢👇類 → 數…

深入 Go 底層原理(四):GMP 模型深度解析

1. 引言在上一篇文章中,我們宏觀地了解了 Go 的調度策略。現在,我們將深入到構成這個調度系統的三大核心組件:G、M、P。理解 GMP 模型是徹底搞懂 Go 并發調度原理的關鍵。本文將詳細解析 G、M、P 各自的職責以及它們之間是如何協同工作的。2.…

AI賦能測試:技術變革與應用展望

AI 在測試中的應用:技術賦能與未來展望 目錄 AI 在測試中的應用:技術賦能與未來展望 1. 引言 1.1 測試在軟件開發中的重要性 1.2 AI 技術如何改變傳統測試模式 1.3 文章結構概述 2. AI 在測試中的核心應用場景 2.1 自動化測試優化 2.1.1 智能測…

Mujoco(MuJoCo,全稱Multi - Joint dynamics with Contact)一種高性能的物理引擎

Mujoco(MuJoCo,全稱Multi - Joint dynamics with Contact)是一種高性能的物理引擎,主要用于模擬多體動力學系統,廣泛應用于機器人仿真、運動學研究、人工智能等領域。以下是關于Mujoco仿真的一些詳細介紹: …

winform-窗體應用的功能介紹(部分)

1--Point實現在窗口(Form)中一個按鈕(控件)的固定位置(所在位置)一個按鈕(控件)的位置一般是固定的,另一個按鈕在窗口中位置是隨機產生的Location屬性:Location new Point(X,Y);在C#的Winform應用程序里,Button控件的鼠標懸標懸浮事件是不存在內置延遲時間的。當鼠標指針進入按…

最新Windows11系統鏡像,23H2 64位ISO鏡像

Windows 11 主要分為 Consumer Editions(消費者版)和 Business Editions(商業版)兩大類別 。消費者版主要面向家庭和個人用戶,商業版則側重于企業和商業用戶。這兩大類別中存在部分重疊的版本,比如專業版和…

linux基本系統服務——DNS服務

一、DNS域名解析原理DNS&#xff0c;Domain Name System&#xff0c;域名系統&#xff1a;在互聯網中由大量域名解析服務器共同提供的一整套關于“域名 <--> IP地址”信息查詢的數據系統!!!! C/S架構&#xff1a;DNS服務端監聽UDP 53端口&#xff08;處理客戶端查詢&…

數據處理和統計分析——08 apply自定義函數

1 apply()函數 1.1 apply()函數簡介 Pandas提供了很多數據處理的API&#xff0c;但當提供的API不能滿足需求的時候&#xff0c;需要自己編寫數據處理函數, 這個時候可以使用apply()函數&#xff1b;apply()函數可以接收一個自定義函數&#xff0c;可以將DataFrame的行或列數據傳…

C++冰箱管理實戰代碼

基于C++的冰箱管理實例 以下是一些基于C++的冰箱管理實例示例,涵蓋不同功能場景,每個示例聚焦特定實現點,代碼可直接擴展或整合到項目中。 示例1:基礎冰箱類定義 class Refrigerator { private:int capacity;std::vector<std::string> items; public:Refrigerator(…

【Python】【數據分析】Python 數據分析與可視化:全面指南

目錄1. 環境準備2. 數據處理與清洗2.1 導入數據2.2 數據清洗示例&#xff1a;處理缺失值示例&#xff1a;處理異常值2.3 數據轉換3. 數據分析3.1 描述性統計3.2 分組分析示例&#xff1a;按年齡分組計算工資的平均值3.3 時間序列分析4. 數據可視化4.1 基本繪圖示例&#xff1a;…