【SpringAI】7. 基于 milvus 的向量檢索

SpringAI 基于 milvus 的向量檢索

向量數據庫可以使用 milvus,redis,Elasticsearch 等,本文以 milvus 為例:

1. 啟動milvus

為了盡可能快速上手springai的vectordb功能,我們推薦使用云上的milvus,注冊就能創建免費的milvus實例,測試完全夠了。從控制臺復制域名和token
在這里插入圖片描述

docker安裝一個attu可視化工具去連接公網的milvus

docker run -p 8000:3000  -e MILVUS_URL=0.0.0.0:19530 zilliz/attu:latest

在這里插入圖片描述

2. pom添加依賴

因為考慮到后期可能隨時更換向量模型,所以不推薦以yml方式讓springboot自動配置VectorStore,這里以手動方式配置

    <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-milvus-store</artifactId></dependency>
3. 注冊Bean
@Configuration
public class SpringAIConfig {@Beanpublic MilvusServiceClient milvusClient() {return new MilvusServiceClient(ConnectParam.newBuilder().withToken("9b06645c438b57b982585fc9b4bd678e6d74d3ae62771exxxxxxxxxxxxxxxxxxxxxxxx").withUri("https://in03-d7f9d7fd8895405.serverless.ali-cn-hangzhou.cloud.zilliz.com.cn").withDatabaseName("db_d7f9d7fxxxxxxx").build());}//如果同時定義多個向量庫這里需要起個名字@Bean("milvusVectorStore")public VectorStore vectorStore(MilvusServiceClient milvusClient, EmbeddingModel embeddingModel) {return MilvusVectorStore.builder(milvusClient, embeddingModel).collectionName("test_vector_store").databaseName("db_d7f9d7fxxxxxxx").indexType(IndexType.IVF_FLAT).metricType(MetricType.COSINE).batchingStrategy(new TokenCountBatchingStrategy()).initializeSchema(true).build();}
}
4. 創建向量數據的創建和檢索方法

保存時在Metadata字段保存知識庫的id,用于過濾向量數據,實現知識庫的知識隔離


@Component
@RequiredArgsConstructor
public class VectorService {@Qualifier("milvusVectorStore")@Autowiredprivate VectorStore milvusVectorStore;public void embedFileToMilvus(MultipartFile file,String knowledgeId) {try {// 讀取上傳文件內容String content = new String(file.getBytes(), StandardCharsets.UTF_8);// 切分為小塊List<Document> docs = splitTextToDocuments(content,knowledgeId); // 每500字符為一塊// 寫入向量庫milvusVectorStore.add(docs);} catch (Exception e) {throw new RuntimeException("文件向量化失敗: " + e.getMessage(), e);}}// 按固定長度分割文本為 Document 列表private List<Document> splitTextToDocuments(String text,String knowledgeId) {List<Document> docs = new ArrayList<>();int length = text.length();for (int i = 0; i < length; i += 500) {int end = Math.min(length, i + 500);String chunk = text.substring(i, end);Document document = new Document(chunk);//指定向量數據的知識庫Iddocument.getMetadata().put("knowledgeId",knowledgeId);docs.add(document);}return docs;}public void store(List<Document> documents) {if (documents == null || documents.isEmpty()) {return;}milvusVectorStore.add(documents);}public List<Document> search(String query,String knowledgeId,Double threshold) {FilterExpressionBuilder b = new FilterExpressionBuilder();return milvusVectorStore.similaritySearch(SearchRequest.builder().query(query).topK(5)   //返回條數.similarityThreshold(threshold)   //相似度,閾值范圍0~1,值越大匹配越嚴格?.filterExpression(b.eq("knowledgeId", knowledgeId).build()).build());}public void delete(Set<String> ids) {milvusVectorStore.delete(new ArrayList<>(ids));}}
5. 測試接口

@Tag(name = "向量檢索", description = "向量檢索")
@RestController
@RequestMapping("/vector")
public class VectorController {@Autowiredprivate VectorService vectorService;@Operation(summary = "文本文件向量化", description = "文本文件向量化")@PostMapping("/uploadFile")public RestVO<Map<String, Object>> uploadFile(@RequestPart MultipartFile file, @RequestParam String knowledgeId) {vectorService.embedFileToMilvus(file, knowledgeId);return RestVO.success(Map.of("success", true, "message", "文件已向量化"));}@Operation(summary = "向量檢索", description = "向量檢索")@GetMapping("/query")public RestVO<List<Document>> uploadFile(@RequestParam String query, @RequestParam Double threshold, @RequestParam(required = false) String knowledgeId) {List<Document> documentList = vectorService.search(query, knowledgeId,threshold);return RestVO.success(documentList);}
}

數據庫插入內容預覽
在這里插入圖片描述
檢索效果
在這里插入圖片描述

6. 將檢索結果作為上下文
  // 系統提示詞private final static String SYSTEM_PROMPT = """你需要使用文檔內容對用戶提出的問題進行回復,同時你需要表現得天生就知道這些內容,不能在回復中體現出你是根據給出的文檔內容進行回復的,這點非常重要。當用戶提出的問題無法根據文檔內容進行回復或者你也不清楚時,回復不知道即可。文檔內容如下:{documents}""";...String systemPrompt;// 判斷是否需要檢索知識庫if (body.getKnowledgeId() != null) {List<Document> documentList = vectorStore.similaritySearch(body.getMessage());System.out.println("檢索結果" + documentList.size());if (documentList != null && !documentList.isEmpty()) {String context = documentList.stream().map(Document::getText).collect(Collectors.joining(""));// 用文檔內容填充SYSTEM_PROMPT模板String filledSystemPrompt = SYSTEM_PROMPT.replace("{documents}", context);// 判斷用戶是否指定自定義系統提示詞if (body.getSystemPrompt() != null && !body.getSystemPrompt().trim().isEmpty()) {systemPrompt = body.getSystemPrompt() + "\n" + filledSystemPrompt;} else {systemPrompt = filledSystemPrompt;}} else {// 沒有檢索到內容,判斷用戶是否指定自定義系統提示詞systemPrompt = (body.getSystemPrompt() != null && !body.getSystemPrompt().trim().isEmpty())? body.getSystemPrompt(): "中文回答";}}...//將系統提示詞添加到提示詞消息中messages.add(new SystemMessage(systemPrompt));Prompt prompt = new Prompt(messages);

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

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

相關文章

如何使用數字化動態水印對教育視頻進行加密?

文章目錄前言一、什么是數字化動態水印二、使用數字化動態水印對教育視頻加密的好處&#xff1f;三、數字化動態水印的實現原理四、如何實現數字化動態水印對教育視頻加密總結前言 教育資源數字化蓬勃發展的今天&#xff0c;優質視頻課程已成為機構的核心知識資產。然而&#…

解決bash終端的路徑名稱亂碼問題

解決bash終端的路徑名稱亂碼 默認打開了zsh&#xff0c;當我輸入bash后&#xff0c;就出現了亂碼 (context_rag) [23fanyaohead1]~/mycode-thesis% bash (context_rag) [%n%m]%~%#亂碼原因排查 我遇到了終端亂碼問題&#xff0c;需要檢查當前的終端環境和編碼設置&#xff0c;下…

【深度學習】【入門】Sequential的使用和簡單神經網絡搭建

1.Sequential的概念它是一種按順序封裝神經網絡層的容器&#xff0c;能讓層按照添加順序依次執行計算&#xff0c;簡化網絡搭建流程2.Sequential的作用1.代碼簡潔化對比不用 Sequential 時手動搭建層的繁瑣代碼&#xff08;如每層需手動定義并連接&#xff09;&#xff0c;展示…

前端開發中的資源緩存詳解

資源緩存用于緩存靜態資源,良好的緩存策略可以減少資源重復加載進而提高網頁的整體加載速度。 通常瀏覽器緩存策略分為兩種:強緩存和協商緩存,當然還包括 service worker。 瀏覽器在資源加載時,根據請求頭中的 expires 和 cache-control 值來判斷是否命中強緩存,命中則直…

零基礎入門指南:華為數通認證體系詳解

一、華為數通認證的定位與行業價值華為數通認證&#xff08;Datacom&#xff09;是ICT領域核心方向&#xff0c;覆蓋路由器、交換機等網絡基礎設備技術&#xff0c;被譽為“網絡行業的骨骼”。2020年升級為Datacom認證體系&#xff0c;新增SDN、VXLAN、網絡自動化等前沿技術&am…

超低功耗CC2340R SimpleLink? 系列 2.4GHz 無線 MCU支持BLE5.3/Zigbee/Thread/專有協議

CC2340R SimpleLink? 系列 2.4GHz 無線 MCU支持BLE5.3/Zigbee/Thread/專有協議優勢簡介性能介紹應用場景優勢簡介 CC2340R SimpleLink? 系列器件為 2.4GHz 無線微控制器 (MCU)&#xff0c;面向低功耗 Bluetooth5.3、Zigbee、Thread 和專有 2.4GHz 應用。這些器件針對低功耗無…

若依前后端分離Vue3版本接入阿里云OSS

一、引入依賴首先在commom 模塊的pom 下面引入 阿里云OSS 的 依賴<!-- 阿里云oss --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version></depende…

2025年微軟mos備考攻略-窮鬼版

說實話&#xff0c;微軟MOS認證是微軟官芳推出的辦公軟件方面的認證&#xff0c;考試難度真的不大&#xff0c;完全沒必要報班&#xff0c;自學完全OK&#xff01;一、25 年報考MOS認證詳情報名時間&#xff1a;隨時可以在官網或ji構報名&#xff08;ji構報名會送備考資料&…

數據庫版本自動管理

FlywayDB 是一款 開源數據庫版本管理工具&#xff0c;開發中將表結構的變更或數據初始化腳本維護好&#xff0c;更新到測試環境或線上發版啟動服務的時候&#xff0c;會檢測版本號自動執行數據庫變更&#xff0c;可以減少每次發版到其他環境的人工執行操作。 工作流程初始化階段…

解決Linux綁定失敗地址已使用(端口被占用)的問題

文章目錄解決 bind failed: Address already in use 問題一、問題原因1. **端口已經被其他程序占用**2. **端口處于 TIME_WAIT 狀態**3. **未正確關閉套接字**二、如何排查和解決問題1. **確認端口是否被占用**2. **查找并殺掉占用端口的進程**3. **等待端口釋放&#xff08;TI…

Ragas的Prompt Object

Prompt在Ragas中被用在各種指標、合成數據生成任務中。同時也為提供了替換各種自動以提示詞的方式。Ragas提供了如下幾種Prompt Objects。 instruction:prompt的基礎組成,通過自然語言清晰的描述LLM需要完成的任務。在prompt object中用instruction變量定義。few-shot exampl…

PHP語法高級篇(一):日期時間處理和包含文件

從本篇文章開始&#xff0c;將學習PHP的高級特性內容。本篇文章將記錄在PHP中如何進行日期時間處理和包含文件的學習過程。 一、日期和時間 在PHP中&#xff0c;date() 函數用于格式化日期或時間。 說明 date(string $format, ?int $timestamp null): string 使用指定整數…

請求服務端獲取broker的機房歸屬信息異常

該錯誤表明服務在嘗試獲取 broker 的 ?機房歸屬信息? 時遇到異常。以下是詳細分析和解決方案建議&#xff1a;?問題定位與常見原因??網絡問題?客戶端無法連接存儲機房信息的元數據服務?&#xff08;如配置中心、注冊中心&#xff09;。防火墻或安全組阻斷了相關端口&…

Android 中的多線程編程全面解析

Android 中的多線程編程全面解析 一、Android 線程模型基礎 主線程&#xff08;UI 線程&#xff09;特性 唯一性&#xff1a;每個應用只有一個主線程職責&#xff1a;處理 UI 操作和用戶交互限制&#xff1a;禁止在主線程執行耗時操作&#xff08;超過5秒會導致 ANR&#xff09…

golang -gorm 增刪改查操作,事務操作

增刪改查 1. 插入數據// api func SaveUser(ctx *gin.Context) {result : &common.Result{}user : &dao.User{}err : ctx.ShouldBindJSON(&user)if err ! nil {ctx.JSON(http.StatusOK, result.Fail(400, "請使用json數據格式傳值"))return}// 調用驗證函…

大數據時代UI前端的智能化服務升級:基于用戶情境的主動服務設計

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;從 “被動響應” 到 “主動預判” 的 UI 服務革命當用戶在暴雨天打開外賣…

CUDA性能優化實戰:7個步驟讓并行歸約算法提升10倍效率

本文深入探討了一個經典的并行計算算法——并行歸約&#xff08;Parallel Reduction&#xff09;的性能優化過程&#xff0c;通過七個漸進式的優化步驟&#xff0c;展示了如何將算法性能提升至極致。這項研究基于Mark Harris在NVIDIA網絡研討會中提出的優化方法&#xff0c;在重…

詳解梯度消失和梯度爆炸(反向傳播)?

什么是梯度消失&#xff1f;梯度消失&#xff08;Gradient Vanishing&#xff09; 是指在訓練神經網絡時&#xff0c;反向傳播過程中計算得到的梯度&#xff08;用于更新參數的重要信息&#xff09;隨著網絡層數的增加而急劇減小&#xff0c;甚至趨近于零的現象。這會導致深層網…

端到端自動駕駛:挑戰與前沿

端到端自動駕駛&#xff1a;挑戰與前沿 End-to-End Autonomous Driving: Challenges and Frontiers 自動駕駛研究社區已見證了越來越多采用端到端算法框架的方法的快速增長&#xff0c;這些方法利用原始傳感器輸入生成車輛的運動規劃&#xff0c;而不是專注于諸如檢測和運動預測…

rust cargo 編譯雙架構的庫

這個錯誤表明你的 Rust 工具鏈沒有安裝 aarch64-apple-darwin 目標平臺。以下是完整的解決方案&#xff1a; 解決方案 ??安裝目標平臺?? (必須步驟) rustup target add aarch64-apple-darwin??驗證安裝?? (可選但推薦) rustup target list --installed # 應該能看到 aa…