geo-ip本外掛程式實現了通過使用者IP查詢出地理位置資訊,然後通過請求屬性和新添加的要求標頭把地理位置資訊傳遞給後續外掛程式。
運行屬性
外掛程式執行階段:認證階段 外掛程式執行優先順序:440
配置欄位
名稱 | 資料類型 | 填寫要求 | 預設值 | 描述 |
ip_protocol | string | 否 | ipv4 | 可選值:1. ipv4:只對ipv4使用者請求尋找地理位置資訊,傳遞給後續外掛程式。而ipv6使用者的請求會跳過該外掛程式,繼續由後續外掛程式處理。 2. ipv6:(未來實現後)只對ipv6使用者尋找地理位置資訊,傳遞給後續外掛程式。而ipv4使用者的請求會跳過該外掛程式,繼續由後續外掛程式處理。(目前是跳過外掛程式,請求由後續外掛程式處理。) |
ip_source_type | string | 否 | origin-source | 可選值:1. 對端socket ip: |
ip_header_name | string | 否 | x-forwarded-for | 當 |
配置樣本
ip_protocol: ipv4
ip_source_type: header
ip_header_name: X-Real-Ip產生geoCidr.txt的說明
在generateCidr目錄裡包含的ip.merge.txt檔案是gitHub上ip2region專案的全世界的IP網段庫。 ipRange2Cidr.go 是把IP網段轉換成多個CIDR的程式。轉換出的CIDR和地理位置資訊存在 /data/geoCidr.txt檔案裡。geo-ip外掛程式會在Higress啟動讀設定階段讀取geoCidr.txt檔案並且解析到radixtree資料結構的記憶體裡,以便以後查詢使用者IP對應的地理位置資訊。轉換程式運行命令如下:
go run generateCidr/ipRange2Cidr.goproperty 的使用方式
在geo-ip外掛程式裡調用proxywasm.SetProperty(),分別把country、city、province、isp設定進請求屬性裡,以便後續外掛程式可以調用proxywasm.GetProperty()擷取該請求的使用者IP對應的地理資訊。
基於geo-ip外掛程式的能力,擴充AI提示詞裝飾器外掛程式攜帶使用者地理位置資訊
如果需要在LLM的請求前後加入使用者地理位置資訊,請確保同時開啟geo-ip外掛程式和AI提示詞裝飾器外掛程式。並且在相同的請求處理階段裡,geo-ip外掛程式的優先順序必須高於AI提示詞裝飾器外掛程式。首先geo-ip外掛程式會根據使用者IP計算出使用者的地理位置資訊,然後通過請求屬性傳遞給後續外掛程式。比如在預設階段裡,geo-ip外掛程式的priority配置1000,ai-prompt-decorator外掛程式的priority配置500。
geo-ip外掛程式配置樣本:
ipProtocal: "ipv4"AI提示詞外掛程式的配置樣本如下:
prepend:
- role: system
content: "提問使用者當前的地理位置資訊是,國家:${geo-country},省份:${geo-province}, 城市:${geo-city}"
append:
- role: user
content: "每次回答完問題,嘗試進行反問"使用以上配置發起請求:
curl http://localhost/test \
-H "content-type: application/json" \
-H "x-forwarded-for: 87.254.207.100,4.5.6.7" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "今天天氣怎麼樣?"
}
]
}'經過外掛程式處理後,實際請求為:
curl http://localhost/test \
-H "content-type: application/json" \
-H "x-forwarded-for: 87.254.207.100,4.5.6.7" \
-d '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "system",
"content": "提問使用者當前的地理位置資訊是,國家:中國,省份:北京, 城市:北京"
},
{
"role": "user",
"content": "今天天氣怎麼樣?"
},
{
"role": "user",
"content": "每次回答完問題,嘗試進行反問"
}
]
}'