99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

LangChain與Milvus向量數(shù)據(jù)庫(kù)DML實(shí)戰(zhàn):構(gòu)建動(dòng)態(tài)可維護(hù)的RAG應(yīng)用

LangChain與Milvus向量數(shù)據(jù)庫(kù)DML實(shí)戰(zhàn):構(gòu)建動(dòng)態(tài)可維護(hù)的RAG應(yīng)用 如果你正在構(gòu)建一個(gè)基于大語(yǔ)言模型LLM的智能應(yīng)用比如一個(gè)能回答專業(yè)問(wèn)題的知識(shí)庫(kù)助手你很可能遇到過(guò)這個(gè)核心難題如何讓模型“記住”并快速“找到”海量的私有文檔信息直接讓模型去“閱讀”成千上萬(wàn)份PDF、Word文檔是不現(xiàn)實(shí)的這會(huì)導(dǎo)致響應(yīng)極慢、成本高昂且容易超出模型的上下文長(zhǎng)度限制。主流的解決方案是“檢索增強(qiáng)生成”RAG其核心在于一個(gè)高效的向量數(shù)據(jù)庫(kù)。而 Milvus正是這個(gè)領(lǐng)域備受矚目的開(kāi)源明星。但很多開(kāi)發(fā)者止步于“Hello World”式的示例把文檔灌進(jìn)去問(wèn)個(gè)簡(jiǎn)單問(wèn)題得到答案就覺(jué)得大功告成。然而真實(shí)的生產(chǎn)環(huán)境是動(dòng)態(tài)的知識(shí)需要更新錯(cuò)誤的文檔需要?jiǎng)h除過(guò)時(shí)的信息需要修正。這時(shí)你就會(huì)遇到本文要解決的核心問(wèn)題如何對(duì) Milvus 向量數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行可靠的增、刪、改DML操作并確保你的 LangChain RAG 應(yīng)用能隨之動(dòng)態(tài)、準(zhǔn)確地響應(yīng)本文將帶你超越基礎(chǔ)教程深入langchain-milvus集成的 DML 實(shí)戰(zhàn)。我們不僅會(huì)演示如何插入、刪除和更新數(shù)據(jù)更會(huì)剖析這些操作背后的原理、在 LangChain 鏈中的最佳集成位置以及你必須避開(kāi)的那些“坑”——比如刪除操作的實(shí)際行為、元數(shù)據(jù)過(guò)濾的陷阱以及如何保證數(shù)據(jù)變更后檢索的實(shí)時(shí)性。讀完本文你將能構(gòu)建一個(gè)真正可維護(hù)、可演化的 RAG 應(yīng)用而不僅僅是一個(gè)靜態(tài)的演示原型。1. 為什么 Milvus 的 DML 操作是 RAG 應(yīng)用的“生命線”在原型階段我們往往只關(guān)心“寫入”和“查詢”。但一旦應(yīng)用上線數(shù)據(jù)就活了。想象以下幾個(gè)場(chǎng)景知識(shí)更新公司發(fā)布了新的產(chǎn)品手冊(cè)你需要將新文檔的向量添加到數(shù)據(jù)庫(kù)中而不是重建整個(gè)庫(kù)。錯(cuò)誤修正發(fā)現(xiàn)之前導(dǎo)入的一份技術(shù)規(guī)格表有錯(cuò)誤你需要定位并刪除或更新對(duì)應(yīng)的錯(cuò)誤信息片段。數(shù)據(jù)隔離你的系統(tǒng)服務(wù)于多個(gè)客戶多租戶需要能安全地刪除某個(gè)客戶的全部數(shù)據(jù)。合規(guī)要求根據(jù)用戶請(qǐng)求需要從知識(shí)庫(kù)中徹底抹去某些敏感信息。如果缺乏可靠的 DML數(shù)據(jù)操作語(yǔ)言支持上述每一個(gè)場(chǎng)景都會(huì)讓你陷入困境要么全量重建向量庫(kù)耗時(shí)耗力要么容忍數(shù)據(jù)的不一致和錯(cuò)誤。Milvus 的核心價(jià)值之一就是它提供了完整、高效的 DML 接口insert,delete,upsert并且與 LangChain 的VectorStore抽象層進(jìn)行了深度集成。這使得在 LangChain 應(yīng)用中進(jìn)行數(shù)據(jù)維護(hù)變得像操作傳統(tǒng)數(shù)據(jù)庫(kù)一樣直觀但背后卻涉及向量索引的復(fù)雜管理。本文將聚焦于langchain-milvus這個(gè)官方集成包通過(guò)實(shí)戰(zhàn)代碼讓你掌握這條“生命線”的操控方法。2. 核心概念與工具準(zhǔn)備在開(kāi)始實(shí)戰(zhàn)前我們需要統(tǒng)一幾個(gè)關(guān)鍵概念并準(zhǔn)備好戰(zhàn)場(chǎng)。2.1 關(guān)鍵概念澄清Milvus一個(gè)高性能、云原生的開(kāi)源向量數(shù)據(jù)庫(kù)專為海量向量數(shù)據(jù)的存儲(chǔ)、索引和檢索而設(shè)計(jì)。它支持標(biāo)量過(guò)濾、動(dòng)態(tài) Schema、數(shù)據(jù)分片等高級(jí)特性。LangChain一個(gè)用于構(gòu)建由 LLM 驅(qū)動(dòng)的應(yīng)用程序的框架。它通過(guò)“鏈”Chain將模型、提示、記憶、檢索器等組件連接起來(lái)。其VectorStore模塊提供了與各種向量數(shù)據(jù)庫(kù)交互的統(tǒng)一接口。langchain-milvus這是 LangChain 官方維護(hù)的 Milvus 集成包。它實(shí)現(xiàn)了VectorStore接口封裝了 Milvus Python SDK 的復(fù)雜調(diào)用讓我們可以用更 LangChain 風(fēng)格的方式操作 Milvus。DML in Vector DB與傳統(tǒng)數(shù)據(jù)庫(kù)的增刪改查類似但在向量數(shù)據(jù)庫(kù)中插入Insert將文本經(jīng)過(guò)嵌入模型Embedding Model轉(zhuǎn)化為向量后連同元數(shù)據(jù)metadata一起存入集合Collection。刪除Delete通過(guò)指定主鍵如id或復(fù)雜的元數(shù)據(jù)過(guò)濾條件刪除對(duì)應(yīng)的向量實(shí)體。特別注意Milvus 的刪除是邏輯刪除軟刪除數(shù)據(jù)不會(huì)立即從磁盤物理清除而是在后續(xù)的壓縮Compaction過(guò)程中清理。刪除的實(shí)體在之后的檢索中不可見(jiàn)。更新UpsertMilvus 沒(méi)有直接的update操作。upsert是“更新或插入”的合并操作。如果提供的主鍵已存在則用新數(shù)據(jù)覆蓋舊數(shù)據(jù)先刪除舊再插入新如果不存在則執(zhí)行插入。這是實(shí)現(xiàn)“修改”功能的主要方式。集合Collection與分區(qū)PartitionMilvus 中Collection類似于數(shù)據(jù)庫(kù)的表Partition是表內(nèi)的數(shù)據(jù)分區(qū)常用于數(shù)據(jù)隔離如按租戶、按類別分區(qū)。在 LangChain 中我們通常在一個(gè)Collection內(nèi)操作partition_key可作為元數(shù)據(jù)的一部分用于高效過(guò)濾。2.2 環(huán)境與工具準(zhǔn)備我們將在一個(gè)干凈的 Python 環(huán)境中進(jìn)行。請(qǐng)確保已安裝以下依賴# 創(chuàng)建并激活虛擬環(huán)境 (可選但推薦) python -m venv venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate # Windows # 安裝核心依賴 pip install langchain langchain-milvus langchain-openai pymilvus # 如果你使用其他嵌入模型如 sentence-transformers # pip install sentence-transformers版本說(shuō)明本文基于langchain-milvus0.2.0它提供了更完善的 DML 方法封裝。請(qǐng)確保你的版本足夠新。Milvus 服務(wù)你需要一個(gè)運(yùn)行中的 Milvus 實(shí)例。有以下幾種方式Docker推薦用于本地開(kāi)發(fā)# 拉取并運(yùn)行 Milvus 單機(jī)版 docker run -d --name milvus-standalone \ -p 19530:19530 -p 9091:9091 \ milvusdb/milvus:latest-standalone安裝包從 Milvus 官網(wǎng) 下載對(duì)應(yīng)系統(tǒng)的安裝包。云服務(wù)使用 Zilliz Cloud 等托管服務(wù)。本文假設(shè)你使用本地 Docker 運(yùn)行的 Milvus連接地址為localhost:19530。3. 初始化連接 Milvus 與創(chuàng)建集合一切操作始于一個(gè)穩(wěn)定的連接和一張定義好的“表”Collection。3.1 建立連接與 VectorStore 對(duì)象我們使用Milvus類來(lái)連接數(shù)據(jù)庫(kù)并創(chuàng)建一個(gè) VectorStore 對(duì)象。這里我們使用 OpenAI 的嵌入模型你需要準(zhǔn)備一個(gè)OPENAI_API_KEY。# 文件init_milvus.py import os from langchain_milvus import Milvus from langchain_openai import OpenAIEmbeddings # 設(shè)置環(huán)境變量請(qǐng)?zhí)鎿Q為你的實(shí)際密鑰 os.environ[OPENAI_API_KEY] your-openai-api-key # 1. 定義嵌入模型 embeddings OpenAIEmbeddings(modeltext-embedding-3-small) # 使用較小、較快的模型 # 2. 連接參數(shù) connection_args { uri: http://localhost:19530, # Milvus 服務(wù)地址 # 如果 Milvus 啟用了認(rèn)證需要添加以下參數(shù) # user: username, # password: password, # token: your-token, } # 3. 初始化 Milvus VectorStore # 如果集合不存在會(huì)自動(dòng)創(chuàng)建。我們指定集合名為 langchain_demo。 vector_store Milvus( embedding_functionembeddings, collection_namelangchain_demo, connection_argsconnection_args, drop_oldFalse, # 重要如果集合已存在不要?jiǎng)h除它。設(shè)為 True 會(huì)清空現(xiàn)有數(shù)據(jù) auto_idTrue, # 讓 Milvus 自動(dòng)生成唯一主鍵 id ) print(fMilvus VectorStore 初始化成功連接到集合: {vector_store.collection_name})關(guān)鍵參數(shù)解釋collection_name: 集合名稱相當(dāng)于表名。drop_old:務(wù)必謹(jǐn)慎設(shè)置為True會(huì)在初始化時(shí)刪除已存在的同名集合并新建一個(gè)空集合導(dǎo)致數(shù)據(jù)丟失。生產(chǎn)環(huán)境通常設(shè)為False。auto_id: 設(shè)置為True時(shí)Milvus 會(huì)為每條數(shù)據(jù)自動(dòng)生成一個(gè)整數(shù)型主鍵。如果你有自己的業(yè)務(wù) ID如字符串類型的文檔ID可以設(shè)為False并在插入數(shù)據(jù)時(shí)通過(guò)ids參數(shù)指定。connection_args: 除了uri還可能包含secure是否使用 TLS、client_key_path等高級(jí)參數(shù)。運(yùn)行此腳本如果沒(méi)有報(bào)錯(cuò)說(shuō)明連接成功。你可以通過(guò) Milvus 的管理工具如 Attu來(lái)查看是否創(chuàng)建了langchain_demo集合。4. 核心 DML 操作實(shí)戰(zhàn)現(xiàn)在進(jìn)入正題。我們將模擬一個(gè)企業(yè)知識(shí)庫(kù)的常見(jiàn)維護(hù)操作。4.1 插入數(shù)據(jù)構(gòu)建初始知識(shí)庫(kù)首先我們向空集合中插入第一批文檔。# 文件insert_data.py from init_milvus import vector_store # 導(dǎo)入上一步初始化的 vector_store # 準(zhǔn)備要插入的文檔 documents [ LangChain 是一個(gè)用于開(kāi)發(fā)由大語(yǔ)言模型驅(qū)動(dòng)的應(yīng)用程序的框架。, Milvus 是一個(gè)高性能、開(kāi)源向量數(shù)據(jù)庫(kù)專為海量向量相似性搜索而設(shè)計(jì)。, 檢索增強(qiáng)生成RAG通過(guò)結(jié)合檢索器和生成模型來(lái)提升回答的準(zhǔn)確性和相關(guān)性。, Python 是一種廣泛使用的高級(jí)編程語(yǔ)言以其簡(jiǎn)潔的語(yǔ)法和強(qiáng)大的庫(kù)生態(tài)系統(tǒng)而聞名。, ] # 準(zhǔn)備對(duì)應(yīng)的元數(shù)據(jù)。元數(shù)據(jù)用于過(guò)濾和精煉檢索結(jié)果。 metadatas [ {source: framework_doc, category: langchain, version: 1.0}, {source: db_doc, category: vector_db, version: 2.0}, {source: technique_doc, category: rag, version: 1.0}, {source: language_doc, category: programming, version: 1.0}, ] # 執(zhí)行插入操作 # add_texts 是 LangChain VectorStore 接口的標(biāo)準(zhǔn)方法內(nèi)部會(huì)調(diào)用 Milvus 的 insert。 inserted_ids vector_store.add_texts(textsdocuments, metadatasmetadatas) print(f成功插入 {len(inserted_ids)} 條文檔。) print(f生成的文檔ID列表前5個(gè): {inserted_ids[:5]})執(zhí)行與驗(yàn)證 運(yùn)行腳本后會(huì)輸出插入的文檔數(shù)量。這些文檔會(huì)被OpenAIEmbeddings模型轉(zhuǎn)換為向量然后連同文本和元數(shù)據(jù)一起存儲(chǔ)到 Milvus 的langchain_demo集合中。你可以立即進(jìn)行一次檢索來(lái)驗(yàn)證# 接在插入腳本后或新建一個(gè)文件 query 什么是向量數(shù)據(jù)庫(kù) results vector_store.similarity_search(query, k2) print(f查詢: {query}) for i, doc in enumerate(results): print(f[結(jié)果 {i1}] {doc.page_content} | 元數(shù)據(jù): {doc.metadata})你應(yīng)該能看到與Milvus相關(guān)的文檔被檢索出來(lái)。4.2 刪除數(shù)據(jù)清理錯(cuò)誤或過(guò)時(shí)信息假設(shè)我們發(fā)現(xiàn)關(guān)于Python的那條文檔描述過(guò)于簡(jiǎn)單想要?jiǎng)h除它。在 Milvus 中刪除需要依據(jù)主鍵id或通過(guò)元數(shù)據(jù)表達(dá)式進(jìn)行過(guò)濾。場(chǎng)景一通過(guò)主鍵 ID 刪除在上一步的插入操作中add_texts返回了插入數(shù)據(jù)的 ID 列表。我們可以用這個(gè) ID 來(lái)刪除。# 文件delete_by_id.py from init_milvus import vector_store # 假設(shè)我們知道要?jiǎng)h除的文檔 ID 是 inserted_ids 列表中的最后一個(gè)。 # 在實(shí)際應(yīng)用中這個(gè)ID可能來(lái)自之前的操作記錄或查詢結(jié)果。 # 這里我們模擬已知ID為 444具體值需根據(jù)你實(shí)際運(yùn)行 insert_data.py 的輸出調(diào)整。 target_id 444 # 請(qǐng)?zhí)鎿Q為實(shí)際ID # 方法一使用 Milvus 提供的 delete 方法更底層更靈活 # 首先需要獲取 collection 對(duì)象 collection vector_store.collection # 構(gòu)建刪除表達(dá)式id in [target_id] expr fid in [{target_id}] # 執(zhí)行刪除 delete_result collection.delete(expr) print(f通過(guò)表達(dá)式刪除結(jié)果: {delete_result}) # 方法二使用 LangChain-Milvus 封裝的 delete 方法更簡(jiǎn)潔但可能依賴版本 # 注意langchain-milvus 的 delete 方法可能直接接收ID列表或表達(dá)式。 # 請(qǐng)查閱你所使用版本的文檔。一個(gè)常見(jiàn)的用法是 try: # 某些版本支持直接傳 ids vector_store.delete(ids[target_id]) print(f已通過(guò)ID刪除文檔: {target_id}) except Exception as e: print(f使用 vector_store.delete 時(shí)出錯(cuò)可能方法簽名不同: {e}) # 驗(yàn)證刪除再次查詢“Python” results vector_store.similarity_search(Python, k5) print(f\n刪除后查詢‘Python’結(jié)果數(shù): {len(results)}) if len(results) 0: for doc in results: print(f - {doc.page_content[:50]}...) else: print( 未找到相關(guān)文檔刪除成功。)場(chǎng)景二通過(guò)元數(shù)據(jù)過(guò)濾條件刪除更常見(jiàn)的場(chǎng)景是批量刪除例如刪除所有category為programming的舊版本文檔。# 文件delete_by_metadata.py from init_milvus import vector_store # 構(gòu)建刪除表達(dá)式。Milvus 的表達(dá)式語(yǔ)法類似于簡(jiǎn)單的 SQL WHERE 子句。 # 注意字段名需要用雙引號(hào)括起來(lái)字符串值用單引號(hào)。 delete_expr category programming and version 1.0 collection vector_store.collection delete_result collection.delete(delete_expr) print(f通過(guò)元數(shù)據(jù)表達(dá)式刪除結(jié)果: {delete_result}) print(f表達(dá)式: {delete_expr}) # 重要提醒刪除操作是異步的 # 執(zhí)行刪除后索引可能不會(huì)立即更新。在緊接著的檢索中被刪除的數(shù)據(jù)可能暫時(shí)還能被查到取決于一致性級(jí)別。 # 對(duì)于強(qiáng)一致性要求可以在刪除后執(zhí)行 flush() 并等待索引重建但這在 LangChain 日常使用中較少見(jiàn)。 # collection.flush()關(guān)于刪除的深度理解邏輯刪除Milvus 的刪除是標(biāo)記刪除并非立即物理擦除。這有利于性能但意味著存儲(chǔ)空間不會(huì)立即釋放。一致性刪除操作對(duì)后續(xù)查詢的可見(jiàn)性取決于集合的一致性級(jí)別Consistency Level。默認(rèn)級(jí)別Bounded下刪除可能不會(huì)立即在所有查詢節(jié)點(diǎn)上生效存在短暫延遲。壓縮后臺(tái)的自動(dòng)壓縮Compaction進(jìn)程會(huì)定期清理被標(biāo)記刪除的數(shù)據(jù)回收存儲(chǔ)空間。4.3 更新數(shù)據(jù)使用 Upsert 修正信息如前所述Milvus 沒(méi)有直接的update。我們需要使用upsert操作。upsert的邏輯是如果存在則替換如果不存在則插入。假設(shè)我們要更新LangChain的文檔將其版本號(hào)從1.0更新到2.0并修正內(nèi)容。# 文件upsert_data.py from init_milvus import vector_store # 1. 首先我們需要找到要更新的文檔的 ID。 # 我們可以通過(guò)元數(shù)據(jù)查詢來(lái)獲取。 search_expr source framework_doc and category langchain # 注意Milvus 的 query 接口用于根據(jù)表達(dá)式查詢數(shù)據(jù)返回完整的實(shí)體包括向量、標(biāo)量字段。 # 但 langchain-milvus 可能沒(méi)有直接暴露 query 方法。我們可以使用 collection.query。 collection vector_store.collection # 加載集合到內(nèi)存對(duì)于查詢是必要的 collection.load() # 執(zhí)行查詢指定要輸出的字段 query_results collection.query( exprsearch_expr, output_fields[id, text, source, category, version] # “text”是存儲(chǔ)原始文本的字段名需確認(rèn) ) # 注意在 langchain-milvus 中文本存儲(chǔ)的字段名默認(rèn)可能是 text 或由 text_field 參數(shù)指定。 print(查詢到的待更新文檔:) for res in query_results: print(res) old_id res[id] # 獲取主鍵ID old_text res.get(text) break # 假設(shè)只更新第一個(gè)匹配的文檔 if not query_results: print(未找到要更新的文檔將執(zhí)行插入操作。) old_id None old_text None # 2. 準(zhǔn)備新的文檔內(nèi)容和元數(shù)據(jù) new_text LangChain 是一個(gè)強(qiáng)大的框架用于構(gòu)建由大語(yǔ)言模型驅(qū)動(dòng)的應(yīng)用程序。它提供了組件化和鏈?zhǔn)秸{(diào)用的能力極大簡(jiǎn)化了LLM應(yīng)用的開(kāi)發(fā)。 new_metadata {source: framework_doc_v2, category: langchain, version: 2.0} # 3. 執(zhí)行 Upsert。 # 在 Milvus 層面upsert 需要提供完整的數(shù)據(jù)行包括主鍵。 # 如果 old_id 存在則用新數(shù)據(jù)覆蓋該ID的記錄如果為 None則插入新記錄。 # 由于 langchain-milvus 的 add_texts 在 auto_idTrue 時(shí)無(wú)法指定ID我們需要用更底層的方式。 # 這里演示使用 pymilvus 直接操作。 from pymilvus import DataType # 假設(shè)我們集合的 Schema 包含id (int64), vector (float vector), text (varchar), source, category, version 等標(biāo)量字段。 # 我們需要構(gòu)造與 Schema 匹配的數(shù)據(jù)。 data [ [old_id if old_id else 0], # ID列。如果更新用舊ID如果插入可以傳0或不傳取決于auto_id但upsert要求提供。這里用0占位實(shí)際由系統(tǒng)處理或覆蓋。 [new_text], # 文本列 [new_metadata[source]], # source列 [new_metadata[category]], # category列 [new_metadata[version]], # version列 # 注意我們?nèi)鄙傧蛄苛衭psert 需要提供完整的向量或者能根據(jù)文本生成向量。 ] # 直接使用 pymilvus 的 upsert 較為復(fù)雜需要精確對(duì)齊 Schema。 # 更實(shí)用的方法在 LangChain 層面我們可以采用“先刪后插”來(lái)模擬更新。 # 這是一個(gè)更通用、更不易出錯(cuò)的方法。 print(\n--- 采用‘先刪后插’策略模擬更新 ---) if old_id: # 步驟A刪除舊文檔 delete_expr fid in [{old_id}] collection.delete(delete_expr) print(f已刪除舊文檔 ID: {old_id}) # 步驟B插入新文檔使用 add_texts它會(huì)自動(dòng)生成向量 new_ids vector_store.add_texts(texts[new_text], metadatas[new_metadata]) print(f已插入新文檔ID: {new_ids[0]}) # 驗(yàn)證更新 print(\n驗(yàn)證更新后的查詢結(jié)果) results vector_store.similarity_search(LangChain 框架, k2) for doc in results: print(f內(nèi)容: {doc.page_content[:80]}... | 版本: {doc.metadata.get(version)})關(guān)鍵點(diǎn)upsert的復(fù)雜性直接使用 Milvus 的upsert需要手動(dòng)處理向量生成和數(shù)據(jù)對(duì)齊在 LangChain 工作流中并不方便?!跋葎h后插”策略對(duì)于 LangChain 應(yīng)用更清晰、更可控的“更新”流程是1) 根據(jù)業(yè)務(wù)邏輯定位要更新的文檔ID2) 刪除這些ID的文檔3) 使用add_texts插入新的文檔含新向量。這雖然涉及兩步操作但邏輯簡(jiǎn)單且能充分利用 LangChain 的嵌入模型自動(dòng)生成向量。版本控制在元數(shù)據(jù)中加入version、update_time等字段是管理文檔演變歷史的良好實(shí)踐。5. 在 LangChain 鏈中集成動(dòng)態(tài)數(shù)據(jù)管理DML 操作不應(yīng)該只是孤立的腳本。在真實(shí)的 RAG 應(yīng)用中它們需要被集成到業(yè)務(wù)邏輯中。以下是一個(gè)模擬的“知識(shí)庫(kù)管理后臺(tái)”的簡(jiǎn)單鏈條設(shè)計(jì)。# 文件rag_with_management.py from langchain.chains import RetrievalQA from langchain_openai import ChatOpenAI from init_milvus import vector_store, embeddings from langchain.text_splitter import RecursiveCharacterTextSplitter class KnowledgeBaseManager: def __init__(self, vector_store): self.vector_store vector_store self.llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) self.qa_chain RetrievalQA.from_chain_type( llmself.llm, chain_typestuff, retrievervector_store.as_retriever(search_kwargs{k: 3}), return_source_documentsTrue ) self.text_splitter RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap50) def add_document(self, full_text, metadata): 向知識(shí)庫(kù)添加新文檔自動(dòng)分塊 print(f正在處理文檔長(zhǎng)度: {len(full_text)} 字符) chunks self.text_splitter.split_text(full_text) metadatas [metadata.copy() for _ in chunks] # 可以為每個(gè)塊添加一個(gè) chunk_id 到元數(shù)據(jù)中便于追蹤 for i, meta in enumerate(metadatas): meta[chunk_index] i ids self.vector_store.add_texts(textschunks, metadatasmetadatas) print(f文檔已分塊并插入共 {len(ids)} 個(gè)塊。) return ids def delete_by_source(self, source_value): 根據(jù)來(lái)源刪除所有相關(guān)文檔塊 expr fsource {source_value} collection self.vector_store.collection # 注意先查詢一下有多少條確認(rèn)范圍 count_expr fcount(*) where {expr} # 這里簡(jiǎn)化處理實(shí)際應(yīng)使用 count 接口 print(f準(zhǔn)備刪除 source 為 {source_value} 的所有文檔...) try: # 執(zhí)行刪除 res collection.delete(expr) print(f刪除請(qǐng)求已提交。) # 在實(shí)際生產(chǎn)環(huán)境中這里可能需要記錄刪除操作日志或觸發(fā)后續(xù)清理任務(wù)。 except Exception as e: print(f刪除操作失敗: {e}) return False return True def query_knowledge_base(self, question): 查詢知識(shí)庫(kù)并獲取答案 result self.qa_chain.invoke({query: question}) answer result[result] sources [doc.metadata.get(source, Unknown) for doc in result[source_documents]] print(f\n問(wèn)題: {question}) print(f答案: {answer}) print(f參考來(lái)源: {list(set(sources))}) # 去重 return answer, result[source_documents] # 使用示例 if __name__ __main__: manager KnowledgeBaseManager(vector_store) # 場(chǎng)景添加一份新政策文檔 new_policy 公司最新差旅政策于2023年10月更新。主要內(nèi)容包括 1. 經(jīng)濟(jì)艙機(jī)票需提前7天預(yù)訂。 2. 住宿標(biāo)準(zhǔn)為一線城市每晚不超過(guò)800元二線城市不超過(guò)600元。 3. 所有報(bào)銷需通過(guò)財(cái)務(wù)系統(tǒng)在行程結(jié)束后30天內(nèi)提交。 manager.add_document(new_policy, {source: travel_policy_202310, doc_type: policy, effective_date: 2023-10-01}) # 場(chǎng)景查詢 manager.query_knowledge_base(公司的差旅住宿標(biāo)準(zhǔn)是多少) # 場(chǎng)景刪除舊的、過(guò)期的政策 # 假設(shè)我們知道舊政策的 source 標(biāo)識(shí)符 # manager.delete_by_source(travel_policy_202301)這個(gè)KnowledgeBaseManager類將 DML 操作封裝成了業(yè)務(wù)方法并與檢索問(wèn)答鏈結(jié)合形成了一個(gè)簡(jiǎn)易但完整的知識(shí)庫(kù)后臺(tái)管理原型。6. 運(yùn)行驗(yàn)證與效果觀察運(yùn)行上述rag_with_management.py腳本你應(yīng)該能看到以下輸出插入過(guò)程顯示文檔被分塊處理并成功插入。查詢過(guò)程LLM 基于從 Milvus 檢索到的政策文檔塊生成關(guān)于差旅標(biāo)準(zhǔn)的答案并列出參考來(lái)源 (travel_policy_202310)。刪除過(guò)程如果取消注釋會(huì)提交刪除舊政策文檔的請(qǐng)求。關(guān)鍵驗(yàn)證點(diǎn)插入后即時(shí)檢索新插入的文檔能否在接下來(lái)的查詢中被立即檢索到是的在默認(rèn)一致性級(jí)別下通??梢?。刪除后檢索被刪除的文檔是否從后續(xù)的檢索結(jié)果中消失是的但可能有短暫延遲。元數(shù)據(jù)過(guò)濾在Retriever中可以通過(guò)search_kwargs設(shè)置filter實(shí)現(xiàn)基于元數(shù)據(jù)的檢索。例如只檢索特定doc_type或特定日期之后的文檔。這本身不是 DML但卻是利用 DML 操作如更新版本號(hào)所維護(hù)的元數(shù)據(jù)進(jìn)行精準(zhǔn)查詢的關(guān)鍵。# 在創(chuàng)建 Retriever 時(shí)添加過(guò)濾器 from langchain.vectorstores import Milvus # 假設(shè)我們只想查詢 policy 類型的文檔 retriever vector_store.as_retriever( search_kwargs{ k: 4, filter: doc_type policy # Milvus 布爾表達(dá)式 } )7. 常見(jiàn)問(wèn)題與排查思路問(wèn)題現(xiàn)象可能原因排查方式解決方案add_texts成功但查詢不到新數(shù)據(jù)1. 集合未加載Load。2. 索引未構(gòu)建或構(gòu)建中。3. 一致性級(jí)別導(dǎo)致延遲可見(jiàn)。1. 檢查collection.load()是否已調(diào)用。2. 通過(guò) Attu 或collection.index()查看索引狀態(tài)。3. 查詢后稍等片刻再試。1. 在查詢前顯式調(diào)用collection.load()。2. 確保索引構(gòu)建完成狀態(tài)為Finished。3. 對(duì)于生產(chǎn)環(huán)境理解并設(shè)置合適的consistency_level。刪除數(shù)據(jù)后仍能被檢索到1. 邏輯刪除未完成壓縮。2. 查詢時(shí)未使用強(qiáng)一致性。3. 表達(dá)式寫錯(cuò)未匹配到目標(biāo)數(shù)據(jù)。1. 檢查刪除操作的返回結(jié)果delete_count。2. 在查詢時(shí)指定consistency_levelStrong性能有損。3. 使用collection.query驗(yàn)證刪除表達(dá)式是否能查出數(shù)據(jù)。1. 理解這是邏輯刪除的正?,F(xiàn)象或手動(dòng)觸發(fā)compaction。2. 對(duì)于需要立即生效的場(chǎng)景使用強(qiáng)一致性查詢。3. 仔細(xì)檢查刪除表達(dá)式語(yǔ)法使用 Attu 工具測(cè)試。upsert或“先刪后插”后出現(xiàn)重復(fù)或數(shù)據(jù)不一致1. 刪除和插入不是原子操作中間可能有并發(fā)查詢。2. 插入時(shí)生成了新的 ID導(dǎo)致舊ID被刪新ID插入但業(yè)務(wù)邏輯上它們代表同一實(shí)體。1. 檢查是否有其他進(jìn)程同時(shí)在讀寫。2. 審查業(yè)務(wù)邏輯確保“更新”語(yǔ)義正確。是否應(yīng)該保留歷史版本1. 考慮引入分布式鎖或更細(xì)粒度的版本控制如增加is_latest標(biāo)志。2. 使用upsert并確保能穩(wěn)定生成業(yè)務(wù)主鍵如doc_id而非依賴自動(dòng)ID。嵌入模型變更導(dǎo)致檢索效果差插入和查詢使用了不同的嵌入模型向量空間不一致。確認(rèn)Milvus初始化時(shí)傳入的embedding_function始終是同一個(gè)模型實(shí)例。確保整個(gè)應(yīng)用生命周期使用相同的嵌入模型。如需切換模型通常需要重建整個(gè)向量庫(kù)。連接失敗 (Cannot connect to Milvus)1. Milvus 服務(wù)未啟動(dòng)。2. 網(wǎng)絡(luò)或端口不通。3. 認(rèn)證信息錯(cuò)誤。1. 運(yùn)行docker ps檢查容器狀態(tài)。2. 使用telnet localhost 19530測(cè)試端口。3. 檢查connection_args中的uri、token等。1. 啟動(dòng) Milvus 服務(wù)。2. 檢查防火墻和網(wǎng)絡(luò)配置。3. 核對(duì)連接參數(shù)。8. 最佳實(shí)踐與工程建議主鍵設(shè)計(jì)如果使用auto_idFalse請(qǐng)使用有業(yè)務(wù)意義的、全局唯一的字符串或數(shù)字作為主鍵如doc_id:uuid。這能極大簡(jiǎn)化后續(xù)的更新和刪除操作。元數(shù)據(jù)規(guī)劃精心設(shè)計(jì)元數(shù)據(jù) Schema。常見(jiàn)的字段包括source文檔來(lái)源、doc_id原文檔ID、chunk_index塊索引、version、created_time、updated_time、owner租戶/用戶ID等。良好的元數(shù)據(jù)是高效過(guò)濾和管理的基石。批量操作無(wú)論是插入還是刪除都應(yīng)盡量批量進(jìn)行以減少網(wǎng)絡(luò)往返和事務(wù)開(kāi)銷。add_texts本身支持批量。刪除時(shí)盡量用id in [id1, id2, ...]表達(dá)式一次性刪除多個(gè)。錯(cuò)誤處理與重試網(wǎng)絡(luò)操作和數(shù)據(jù)庫(kù)操作都可能失敗。在生產(chǎn)代碼中務(wù)必對(duì)add_texts、delete等操作添加重試邏輯和異常捕獲。監(jiān)控與日志記錄重要的 DML 操作尤其是刪除和批量更新的詳細(xì)信息包括操作者、時(shí)間、影響的數(shù)據(jù)ID或條件。這對(duì)于數(shù)據(jù)審計(jì)和問(wèn)題排查至關(guān)重要。測(cè)試環(huán)境先行任何刪除和更新腳本都應(yīng)在測(cè)試環(huán)境充分驗(yàn)證后再上生產(chǎn)??梢钥紤]在刪除前先執(zhí)行一次query預(yù)覽將要影響的數(shù)據(jù)。理解一致性權(quán)衡Milvus 提供了不同的一致性級(jí)別。在追求極高查詢性能的場(chǎng)景可能接受最終一致性在要求數(shù)據(jù)強(qiáng)一致性的金融或合規(guī)場(chǎng)景則需要選擇Strong一致性并承受相應(yīng)的性能損耗。版本化與歷史數(shù)據(jù)對(duì)于重要的知識(shí)文檔單純的“覆蓋式”更新可能不夠。可以考慮版本化方案插入新版本文檔并通過(guò)元數(shù)據(jù)如is_latestTrue標(biāo)記當(dāng)前生效版本而不是物理刪除舊版本。這保留了歷史記錄并支持回滾。掌握 LangChain 與 Milvus 的 DML 操作意味著你能夠構(gòu)建的 RAG 應(yīng)用從靜態(tài)的“只讀”演示進(jìn)化成了動(dòng)態(tài)的、可維護(hù)的、貼近真實(shí)業(yè)務(wù)需求的系統(tǒng)。數(shù)據(jù)不再是初始化后一成不變的背景板而是可以隨著業(yè)務(wù)流動(dòng)和演化的核心資產(chǎn)。從插入第一份文檔到精準(zhǔn)刪除一條錯(cuò)誤記錄再到平滑更新整個(gè)知識(shí)體系每一步操作都關(guān)乎著最終應(yīng)用的可信度和智能水平。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天天视频精品9| 五月丁了香蕉综合| 婷婷五月天丁香| 婷婷五月天99综合网站| 99热日本| 国产操B| 轮奸综合网| 丁香六月激情综合| 日韩一级网站| 成人AV在线电影| 91精品丝袜久久久久久久久粉嫩| 婷婷激情六月综合| 狠狠 婷婷| 99热只有| 可以免费看的av网站| 激情小说五月天| 五月婷婷综合潮喷| 久久久久亚洲AV无码网影音先锋| 99熟女| 色五月激情视频在线综合| 久久婷婷网| 亚洲综合婷婷五月| 亚洲精品久久久无码| 婷婷五月18永久免费视频| 国产婷伊人| 99爱在线视频观看| 亚洲综合网激情小说| 五月播播| 五月天五月色婷婷综合| 五月丁香色色网| 婷五月丁香俺| www久| 日日爱699| 色情五月婷婷| 狠狠久久婷五月| 99日韩| 五月天激情视频五月天| 天天操天爱综合| 五月婷婷深深的爱| 在线不卡视频| 婷婷五月丁香99| 99久久五月婷婷| 九九亚洲视频| 九九精品网站| 少妇丁香婷婷| 婷婷六月丁香1| 91人碰| 99热这里只有精品8| 亚洲男人的天堂婷婷色五月| 久热婷婷| 伊人综合婷婷| 182tv992tv人之初午夜免费观看| 蜜桃婷婷五月| 五月色视频| 91黄操| 国产肥白大熟妇BBBB视频| 六月婷婷中文字幕| 69er小视频| 天堂网色色| 亚洲无码99| 丁香婷婷色情社区成人小说| 久久精品视频在这里有| 99亚洲日韩| 9999热这里只有精品| 激情5月婷婷狠狠干| 青青操avbb| 亚洲九九婷婷| 欧美性二区| 五月丁香啪啪| 五月天另类小说亚洲| 婷婷操久久| 中文AV网站| 成人日韩欧美| 久久午夜理论| 操逼福利视频| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 精品人妻一区二区三区四区不卡在| 五月丁香婷婷综合在线| 看久久性爱视频| 欧美婷婷综合| 97干网站| 婷婷综合五月天| cc精品国产性传播| 99久久久99久久91熟女| 久久99久久99精品免视看婷婷| 婷婷五月天激情网| 99精品偷自拍| 国产XXXX搡XXXXX搡麻豆| 91seav| 日日天天干| 9热精品| 色播五月网| 亚洲五月天激情| www999日韩精品| 婷婷的色色五月天| 日本久久天堂| 色色99| 亚洲A片成人无码久久精品青桔| 婷婷丁香九月| 婷婷亚洲丁香五月| 婷婷久久亚洲| 天天色视频| 色啪影院| 9精品国产在热久久| 激情人妻综合| 成人深爱丁香五月| 久久婷婷91| 激情五月综合网| 欧美日本99| 九九九九中文字幕| 深爱五月天 开心网| 国产亚洲精品久久一区二区三区| 五月丁香六月婷婷网| 操碰色一区就去操| 超碰猛烈的性猛交| 婷婷五月激情的图片| 華人性愛AV在線| 日本色色色| 色婷婷综合影院| 97香蕉碰碰人妻国产欧美| 激情综合丁香六| www一起操| www.狠狠狠狠| www.色五月| 夜夜爱伊人| 丁香五月天激情小说| 99久久久国产精品免费蜜乳tv| 成人五月丁香花| 丰满少妇乱A片无码| 久久月天堂| 久热婷婷| 97久久视频| 一起操最新网址| 婷婷丁香五月天综合AV| 亭亭五月色男人| 精品色| 亚洲免费成人电影AV| 激情五月天视频| 色之综合网| 99视频35精品视频在线观看| 日韩一级A片黄色| 五月花综合视频| 综合99综合久久久久久久| 182无码| 97sese婷婷| 2020久久婷婷五月| 色综合久久久综合久久网| 五月丁香日本一抹本| 青青草原伊人网| 墨西哥毛片内射精| 狠狠操.com| 久久婷婷五月天激情四射| 五月婷综合激情| 777色色色| 九色激情| 五月丁香综合| 激情婷婷色色| 91日视频| 九97免费视频| 99热这里有精品2| 久久大香蕉同僚| 丁香五月最新网址| 99综合| 99精品人人| 五月婷婷综合丁香视频| 亚洲在线操| 激情综合国产| 色婷婷狠狠干| 久久天堂女人| 欧美五月丁香啪啪响视频| 在线观看欧美| 色久婷婷五月| 68热超碰在线| 这里只有九九精品| 婷婷伊人綜合中文| 超碰免费人人| 天天 青草 丝袜制服 在线| 99久久国产宗和精品1上映| 五月婷婷丁香伦理网| 国产又爽又猛又粗的视频A片| 婷婷六月综合在线| 天天操精品| 91肏| 午夜丁香六月婷| 欧美性生交xXxX久久久| 激情综合99| 色综合久久天天综合网| 色婷婷婷婷| 婷婷色激情网| 欧亚中文A V| 第四色激情网| 亚美欧色影院| 九九热这里只有精品7| 青青青在线视频国产| 久久人人九九| 伊人婷婷大香蕉在线| 色五月五月婷婷| 日日操天天操| 丁香婷婷激情网站| 狠狠做六月爱婷婷综合aⅴ| 亚洲乱码日产精品BD| 五月天婷婷丁香六月| 婷婷刺激综合| 人妻丰满精品一区二区A片| 五月婷婷精品无在线| 久久丁香婷婷五月| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 久久综合五月天| 色五月av伊人| 五月综合视频在线| 日本一级一片免费视频 | 久久久这里有精品| 激情五月小说婷婷| 五月之婷婷| 色99在线视频| 中文字幕在线不卡视频| 播五月,色五月,开心五月播放器| 夜夜骑日日夜夜| A级毛片高清免费不卡播放谢谢谢谢| 婷婷爱在线观看| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 免费成人中文字幕| 国产欧美精品AAAAAA片| 成片免费播放| 五月婷在线| 99视频在线观看视频| 岛国av网站| 久er7久热| 日本一級黃色一級片| 激情五月天天狠狠久久| 久久机热这里只有精品| 国产精品色色色色| 丁香五月天天日| 人妻激情在线| 五月丁香色婷婷久久| 婷婷亚洲天堂| 天天搡日日搡aaaaⅩ| 五月婷婷色情| 五月丁香激情婷婷综合| 亚洲色vA| 久久五月婷婷电影| 久久伊人大香蕉| yazhochengrenavwang| 国产肥白大熟妇BBBB视频| 激情丁香九九五月综合网| 精品三区影院| 五月丁香欧美在线| 天堂草在线观| 一级操逼内射在线视频| 这里只有精品免费观看网占| 五月丁香六月婷婷在线观看| 天天干天天操天天爽| 翔田千里无码| 天天综合亚洲| 婷婷五月天视频| 91精品久久久久久综合五月天| 五月天伊人日日噜影片AV| 五月丁香婷婷爱激情综合网| 梁铮版蜘蛛女在线观看| 婷婷色五月天第7色| 亚洲色久| 日日干日日s| 性生活视频98791| 人人叉久| 色丁香婷婷| 99爽视频| 538在线| 99热精品网| 万月丁香狠狠爱| 成人在线二区| 日本黄色精品| 五月丁香啪啪网| 成人精品在线| 激情婷婷狠狠干| Va另类视频| 五月激情久久综合网| 视色综合| www色五月| 亚洲成人在线播放| 婷婷综合性爱网| 九色综合五月天婷五月| 影音先锋男人女人| 丁香花操逼| 日本色色网站| 26uuu色噜噜精品一区| 五月色婷婷综合丁香精品无遮挡| 拳交大逼| 日日夜夜天天| 牛牛色av| 国产精品色婷婷久久久精品| 狠爱婷色| 怕怕視頻| 婷婷成人五月天成人文学小说| 久久久噜噜噜久久人妻| 五月综合色| 爽tv | 夜色.cnm| 综合婷婷六月| 欧美丁香五月| 97人人操在线| 99燥99日| 国产成人av在线| 天天艹夜夜爽| 97精品欧美91久久久久久久| 青青久在线视频免费观看| 免费在线观看欧美激情xx小视频| 香蕉综合网| 国产毛片欧美毛片久久久| 色插人人| 在线,国产,色,热视频| 人人视频色| 婷婷激情六月综合| 激情五月最新网址| 婷婷丁香五月视频| 97久久人人| 五夜丁香| 亚韩精品视频1区| 大香蕉五月婷婷| 天天操天天爽天天爱| 久久久久丁香婷婷五月天| 久婷| 日熟女| 天天做天天爰天天爽天天无遮挡| 九九精品自拍| 91岛国片| 五月丁香六月婷婷国产视频| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 丁香丁香激情网| 色播五月网| 天天色天天操天天射| 色5月婷婷色| 婷婷综合在线网| 超碰色综合| 国产精品成人av在线观看春天| 操人无码| 欧美图片丁香五月天| 狠狠狠五月婷婷六月丁香| 97久久草草超级碰碰碰| 五月婷婷综合影院| 五月婷婷之婷婷| 久久精品99国产精品日本| 26UUU欧美激情一区二区| 思思热在线免费视频| 色亭亭五月天丁香综合AV - 百度 - 百度 | 婷婷丁香黄色| 精品无码99| 九九香蕉网| 91人人澡人人爽人人看| 天天日天天色| 欧美性猛交99久久久99| 久久久无码精品成人A片小说 | 欧洲亚洲免费视频区| 中美日韩成人在线| 成人电影AV在线观看| 丁香五月婷婷色偷偷| 国产精品久久久久久久久久免费| 狠狠色狠狠鲁| 久久精品凹凸分类| 精品久久66| 久久久久久久久久久-久五月天婷婷| 精品国产va久久久久| AV九九| 翔田千里 50岁 无码| 性视频久久| 人人操人人爽成人AV| 琪琪色影音先锋| 日韩五月丁香| 欧美99视频| 免费视频WWW在线观看网站| 天天色月| 乱精品一区字幕二区| 五月天操逼网| 成人在线视频网| 超碰91在线| 99超级碰免费视频| 色综合久久天天综合网 | 99视频这里只有精品10| www,超碰| 99成人| 综合五月丁香久久| 五月丁香六月片| 激情五月婷婷色综合| 无码少妇高潮喷水A片免费| 五月婷婷丁香五月亚洲色| 日日躁夜夜躁狠狠久久AV| 婷婷久久六月费| 第九色区AV在线| 开心五月深爱激情| 五月天婷婷色色网| 久久综合婷婷| 99亚洲视频| 伊人久久大香线蕉av一区| 五月丁香大香蕉| aaaaaa片| 狠狠草网| 色色激情五月天| 五月丁香婷中文| 怡红院成人AV| 啪啪综合网| 日本一道久久| 色www久视频| 日本va欧美va国产激情| 97丁香五月天| 久久久jd| av在线播放网站| 色综合99| 色婷五月| 亭亭五月丁香综合欧美| 91九九精品| 99热这里只有精品2| 婷婷五月激情基地| 性色婷婷| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 成人五月天在线视频在线观看 | 色婷婷五月色| 国产亚洲99久久精品熟| www激情| 99无吗| 色五月婷婷婷婷婷婷婷婷婷婷| 99re8热精品免费视频| 久久婷婷啪啪视频| 激情综合色播| 激情五月婷婷综合视频| 婷婷五月小说色综合| 99视频综合网| www99热| 97色色网| 女力报到正好爱上你| 五夜婷婷| www.99日本| 五月丁香婷婷五月色| 亚洲综合色色| 亚洲婷婷欧美婷婷| 日日夜夜爽| 五月丁香va| 精品久久99| 丁香狠狠操| 风流少妇A片一区二区蜜桃| 九月婷婷激情| 亚洲综合色网| 婷婷王月天影院| 国产永久一二一起草| 激情六月婷婷| 亚洲一区二区无遮挡A片| 丁香五月之久操视频| 99色婷婷| 欧美25p| 国产精品美女| 深爱激情五月天| 天天擼久久擼在线| www.婷婷,com| 操嫩逼电影| 激情六月下句是什么| 99操视频| 啪啪综合网| 色婷婷9| 国产成人在线不卡AV| 九一牛视频探花| 日韩中出视频| 九九re视频在线视频| 色婷婷激情视频| 黄网在线免费观| 中文字幕无码人妻少妇免费视频| 激情五月婷| 五月婷婷在线免费观看| 婷婷丁香成人| 亚洲欧洲中文日韩久久AV乱码| 色色色99| 六月丁花香啪啪激情欧美| 99原创自拍视频在线观看| 97色色网| www99精品在线观看| 免费黄网不卡AV| 丁香五月花| 国产片XXXXA片国语对白| 噜综合| 热99国产精品| 综合在线丁香五月| 激情五月,婷婷五月,丁香五月| 日日肏夜夜干| 婷婷五月花丁香| 色五月婷婷九月| 狠狠色噜噜狠狠狠888| 色99在线| 91丨九色丨43老版熟女| 美女婷婷激情亚洲| 97久久久免费福利网址| 依人大香蕉| 丁香六月婷婷久久综合八月| 激情影院免费视频婷婷五月天| 日本五月丁香| 亚洲激情97五月天| 996er热| 狠狠干,狠狠操| 国产精产国品一二三在观看| 色啪久| 狠狠色丁香久久婷婷综合五月| 色噜噜狠狠色综合成人99| 五月天婷婷午夜丁香| 都市激情五月婷婷综合| 激情五月天偷拍综合网| 91色色色| 91jiuseshunv| 成人五月天色天堂| 国产婷婷五月色情综合| www.丁香五月| 热日韩欧美| 九九大香视频| 久久婷婷电影| 丁香五月电影| 亚洲色情在线| 色999五月色| 操逼五月婷婷| 99精品久久| 99久久免费精品| 色五月天堂| 综合久久丁丁香婷| 色色日韩| 九九热免费视频| 五月丁香激情综合网| 一级无码作爱片| 色色99色色| 色播播婷婷| 99久久婷婷国产综合| 九九色插| \\五月天婷婷激情| 狠狠香蕉| 91丨九色丨国产在线| 一区二区三区四区五区| 久9久9久9久9久9久9| 五月婷A V在线| 色综合激情| 久 久9 9 热 视 频| 久综合网| 婷婷精品在线| 人人干av| 9色资源在线| 国产五月丁香在线| 五月丁香影视| 色哟哟www| 天天爽免费视频| 欧美电影在线观看| aaaaa不卡| 婷婷五月天亚洲综合| 色婷婷亚洲六月婷婷中文字幕| 丁香婷婷五月| 97人人超| 久久久婷婷| 日本天堂免费99| 婷婷中文字暮| 五月天婷婷偷拍| 99成人精品六| 91久久久久久| 激情五月深爱五月| 激情丁香五月婷婷| 亚洲视99| 九月婷婷| 五月天婷五月天综合网在线观| 欧美色久| 亚洲天99| 啪啪激情网| 97操碰视频| 日本久久人| 大香蕉伊在| 日日操夜夜骑| 丁香九月激情久久| 久久九精品| 婷色视频| 九九久久五月天| 91九色国产熟女| 亚洲第一综合| 超碰在线9| 婷婷激情视频| 91婷婷| 激情五月天影院| 成人AV免费观看| 色播丁香| 五月丁香在线婷婷蜜桃| 婷婷丁香五月天综合在线日韩| wwccc久久久| 日本人妻伦在线中文字幕| 五月天婷婷色播| 一本色道久久88综合日韩精品| 日本五月婷婷久久久六月丁香| 亚洲视频一区| 婷婷丁香色情五月天| 五月天婷婷Av| 99热8| 一区二区乱码视频| 夜夜干天天操| 26UUU精品一区二区c〇m| 中文中文在线| 亚洲国产精品VA在线看黑人| 色色免费网站| 97精品人人A片免费看| 九九精品re免费视频| 婷婷综合网| 超碰色综合| 99热在线观看| 久久性爱视频这里只有精品| 九热...av| 99无码精品| 婷婷五月天激情五月天| 五月天丁香综合久久国产| 激情五月天综合网| 在线1青婷| 日韩综合天堂| 另类在线免费视频| 超碰日日操| 丁香五月婷婷婷婷欧美综合| 激情婷婷五月综合| 狠狠干综合| 婷婷五月综合在线视频| 99日精品视频| 五月天婷婷丁香成人网| 日韩成人无码人妻| 婷婷五月天男人影院色色网| 嫩草视频在线观看| 色爆五月| 99热免费精品| 激情5月婷婷| 丁香六月开心| 日韩AV在线免费| 婷婷综合久久| 五月综合激情视频在线| 五月丁香婷婷综合激情基地| 婷婷伊人久久| 91碰| 这里只有精品视频一区| 欧美天天草人人草| 99热很操老逼| 少妇人妻人伦A片| 26UUU欧美激情一区二区| 思思热在线视频99| 五月婷婷六月丁香激情深爱| 亚洲第一影院高清无码网站| 日欧一片内射VA在线影院| 亚洲秘 无码一区二区三区妃光/1| 丁香五月天色| 99热婷婷| 日本一毛片| 伊人大香久久| 免费碰碰视频久| 狠狠操狠狠爱| 91丨九色丨国产打屁股| 欧美精品18| 精久久色| 婷婷开心青青草| 丁香婷婷久久 | 99热精品在线观看| 狠狠干综合| 蜜臀av粉嫩av懂色av| 九九激情视频| 五月婷婷九月婷婷九月婷婷| 五月丁香在线国产 | 色婷婷久久综| 五月婷婷六月丁香首页| 9久热在线精品| 午夜69成人做爰视频| 狠狠干综合| 五月丁香成人| 另类激情五月| 97精品欧美91久久久久久久| 黄色成人网站在线播放| 人伦30P| 丁香五月成人丝袜| 丁香五月成人自拍| 亚洲AV电影av| 岛国操B不卡在线| 婷婷婷久久| 五月丁香六月综合图| 色天堂婷婷| 色婷婷成人做爰A片免费看网站| 亚洲激情五月天| 青青草tp| 99性爱视频| 四色永久成人网站| 国产XXXX搡XXXXX搡麻豆| 亚洲精品无人区| 五月Huangsewang| 久久五月天影院| 久久婷婷五月综合色和| 丁香综合久久| 九洲一级A片| 97啪啪| site:xiongshengzz.com| 五月天激情综合网站| 狠狠另类视频| 97韩国久久电影院| 亚洲综合另类| 97人人射| 被强行糟蹋的女人A片| 国产AV一区二区三区日韩| 岛国在线观看91| 狠狠色综合久久久久| 日本一级大片| 色综合久久天天综合网| 五月天婷婷午夜丁香| 丁香五月激情六月| 色五月天综合网| 狠狠爱激情网| 久久99久久99久久99人受| 欧美成人猛片AAAAAAA| 久久久9久| 五月丁香婷婷中文| 久久99网| ..真实国产乱子伦毛片| 99久久视频| 久久女婷| www.开心激情| 婷婷激情社区| 久久色大香蕉| 九九热re99re6在线精品| 思思热久久阴99| 久狠日av| 五月叮香啪| 久草丁香婷婷1024| 久久婷婷色情7777网站| 丁香五月综合在线播放| 九九热啪啪| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 天天碰天天插天天操| 久久激情五月| 丁香五月婷婷基地| 人人叉久| 五月婷婷久久爱| 成人在线99| 少妇大叫太大太粗太爽了A片| 欧美碰碰碰| 99久久a线观| 99这里有精品视频| 尤物一区二区| 九九久久99| 久久ab| 这里只有精品久久| 日韩色久| 激情深爱综合网| 大香蕉综合网| 久久婷婷色综合| 色色六月| 色五月之第四色| 久久久久婷| 超碰免费人人肏| 中文字幕丰满乱孑伦无码专区| 精品无吗va视频免费观看| 中字幕视频在线永久在线观看免费| 欧美三日本三级少妇三99| 丁香五月天综合网| 香蕉AV福利精品导航| 五月丁香另类图片| 夜夜干天天操| 色婷婷狠狠禁久久| 婷婷五月天亚洲激情戏精品| 97人人操人人干| 超碰男人色| 可以看的av网站| 九九99精品视品| 五月婷婷深深爱爱| 久久色婷婷| 日韩欧美一道四区中文字幕| WWW,五月| www.色欲丁香婷婷| 婷婷五月天免费| 天天干,天天日| 天搞天天天天天| 伊人婷婷大香蕉| 久久婷婷综合国产| 新激情五月天天在线网| 欧美婷婷九月| 亚洲免费婷婷| 免费成片在线观看| 丁香涩涩爱| 色约约视频一区二区三区四区五区| tingtingzonghewang| 亚洲中文字幕在线观看| 亚洲熟妇AV综合网五月丁香伊人| 五月激情在线| 五月情综合| 丰满少妇猛烈A片免费看观看| 丁香六月 婷婷六月| 深爱激情五月网| 另类激情五月天。| 激情五月天综合网| 天天做天天双| av高清无码| 丁香五月六月欧美| 97碰操| 欧美性丁香色色五月天干干| 2015超碰| 91Chinese在线| 啪啪综合网| 开心五月激情网| 99人这里只有精品| 熟女色色一区二区| 桃色激情网| 男人天堂 久久| 亚洲AV网站在线观看| 激情婷婷色色| 中文字幕欧美日韩VA免费视频| 五月情四婷婷| 亚洲日本三级片| 五月婷婷深深爱| 97干免费视频| 深爱五月天| 色人妻五月| 婷婷天堂视频| 99热这里只有精品青草| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 五月天婷婷丁香花| 伊人天堂婷婷| 色色五月天丁香| 丁香婷婷六月婷婷六月婷婷六月婷婷| 国产婷婷色综合AV蜜臀AV| 66精品成人免费网站在线观看| 另类图片五月天婷婷| 国产综合婷婷| 婷婷五月免费观看| 99re免费视频| 人人播| 久久久久人妻精选| 五月久久婷婷丁香| 少妇口诉沐足视频播放器网址| 丁香五月天亚洲综合| 日良久久| 武汉美女啪啪视频免费一级片 | 婷婷丁香色五月天久久88| 男人的天堂婷婷色五月| 婷婷欧美激情综合| 色青青五月| 丁香五月最新网址| 极品人妻VIDEOSSS人妻| 五月丁香六月婷婷色日| 激情婷婷五月女| 99视频在线看| 久久99综合| 日日夜夜狠狠| 五月丁香亚洲综合网| 国产综合色婷婷精品久久| 婷婷成人基地| 丁香五月自拍| 99re热免费观看视频精品| 久久久人妻久久久| 欧美色色日韩| 777精品久无码人妻蜜桃| 天天拍天天操| 一区二区三区四区无码| 色九九综合| 涩 五月 婷婷 狠狠| 五月激情在线| 色色激情网| 丁香六月激情国产| 激情综合网,婷婷| 99热日韩| 无码动漫AV| 亚洲六月综合激情久久下卡| 五月丁香婷婷欧美| 99爱精品| 99日这里只有精品| 涩涩涩婷婷| 高潮毛片遮挡费高一百度| 婷婷婷久久久| 182tv992tv人之初午夜免费观看| 五月婷婷六月色| 99热国产精品| 色色色综合网| 99视频这里有精品免费观看| 天天日日天天| 偷偷狠狠久久婷婷五月天| 丁香五月激情综合婷综| 中文字幕不卡网站| 超级碰碰97在线| 五月天激情婷婷| 亚洲av综合网| 久久hd| www.狠狠| 婷婷五月天激情电影小说| 五月丁香六月激情综合在线| 99这里精品| 色五月天天在线观看资源站| 99欧美| 啊V视频在线观看| 嫩草视频观看| 九九精品亚洲| 色色欧美。| 人人舔天天| 色综合色婷婷色伊人| 色婷婷久久久| 狠狠综合网| 91超碰在线观看| 丁香五月婷婷偷拍| 婷婷丁香社区| 亚洲操B视频| 亚洲四色五月| 91丁香婷婷综合资源| ww超碰在线| 丁香五月色激情| 午夜激情久久| 日韩操啪| 99久超碰| 日韩成人网址| 色婷婷影院| 六月色伊人婷婷| 婷婷五月天少妇| 人人色AV| 日本操逼九九九九58日本操逼| 六月丁AV| 久操97| 综合久久综合| 色色色色热| 国产精品扒开腿做爽爽爽A片唱戏| 99原创自拍视频在线观看| 大香伊人久色| 中文在线视频久9| 99色五月| 天搞天天天天天| 538久久| 亚洲欧州色情在线观看| 4438国产免费看| 色99在线视频| 五月亚洲激情| 啪到高潮激情丁香五月| 99啪99| 成人在线99| 久久无码成人| 一级七香蕉| 99在线热| 激情五月天之六月婷婷| 无码 色| 91人人网| 欧美丰满熟妇BBB久久久| 九九精品免费视频99| 婷婷五月综合啪| 久久久婷婷| 五月天精品综合在线| 激情五月五月婷婷| www色五月| 亚洲综合五月天婷婷| 欧美VA视频| 五月天婷婷一起草| 另类五月激情| 99热手机在线精品| 超碰妻人人| 日韩啪啪视频| 99热这里只有在线| 激情色播| 狠狠色婷婷综合开心影视| 色婷婷AAA| 婷婷五月天天aV| 丁香五月综合激情啪啪| 久久人妻熟女一区二区| 九九99热| 成年人99热| 91久热| 99在线爽| 五月婷婷和六月| 99九九热在线观看| 色五月激情图片| 26uuu国产色| 色屌丝中文字幕| 激情又色又爽又黄的A片| 老妇操B| 激情五月五月五月婷婷| 涩五月婷婷| 91日综合欧美| 天天操天天操| 久久综合激情| 免费在线a| 色五月婷婷、老熟女| 五月丁香婷婷色色| 婷婷丁香婷婷97| 婷婷深爱五月亚洲综合| 国产67194| se99热久久一本| 亚洲人人干| 亚洲精品大片| 91综合在线视频| 夜夜AVV| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 五月丁香六月综合激情| 色婷婷激情五月天| 99愛国产| 久久久国产精品黄毛片| 99热思思久| www,色婷婷| 亚洲婷婷丁香五月| 日日夜夜爽爽| 青草青草视频2免费观看| 91Chinese在线| 99热精品观看| 久久激情五月网| 五月丁香中文字幕| 一级操逼大片| 激情综合五月激情XXXX| 六月激情婷婷| 久久婷婷成人| 婷婷射综合| 国产激情在线| 天天爱天天秀天天做| 日噜噜色| 久热视频这里只有精品| 综合色、色综合| 四虎婷婷五月天| 中文成人在线| 亚洲日韩26uuu| 777米奇影视第四色| 久久五月天精品视频| 亚洲天天操| 操操操www.com| 久久人人看| 久久亚洲婷婷综合色五月| 日韩无码专区| 国产裸舞福利资源在线视频| 天天操夜夜操| 久久五月丁香激情综合| 国产毛片精品一区二区色欲黄A片| 五月丁香六月激情综合啪啪| 亚洲国产精品二二三三区 | 国产精品爽爽久久久久久| 五月亭亭欧美女人| 99热这里| 婷婷五月色情天| 99热官网| 五月天亚洲最大成人| 伊人在线视频| 99热成人在线观看| 月色色综合婷婷网| 丁香九月综合| 天天情天天狠天天透| 狠狠干在线视频| www,婷婷,com| 九九热最新地址| 97五月婷婷| 综合大香蕉| 欧美极品999| 98国产精品综合一区二区三区 | 五月天另类综合网| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 996精品热视频| 另类视频综合| 天天看片日日夜夜| 日本不卡高字幕在线2019| 日日懆天天懆| 香蕉伊人综合| 狠狠干,狠狠操| 丁香五月 六月婷婷首页| 五月天丁香欧美激情| 亚洲国产成人综合| www.夜夜夜| 青青草网武则天| 婷婷99狠狠躁天天躁| 婷婷五月天.com| 五月婷中文娱乐综合| 9色在线| 丁香花五月天| 99.N在线视频| 五月婷婷色色| 99亚州综合精品成人网| 丁香六月婷婷综合激情欧美| 久久在线视频免费观看| 五月丁香婷婷综合网| 综合丁香婷婷五月天| 色婷婷av综合网| 九色视频91疯狂| 狠狠五月丁香色婷| 激情五月综合第一页| 99这里有精品| 久久只有18视频| 色八月婷婷| 狠狠 久久| 激情综合网五月天| 天天爽免费视频| 久久er免费视频| 99热99思午夜精品| 婷婷五月婷婷| 久久激情五月婷婷| 日韩一区二区三区无码| 九月综合| 婷婷99视频全集高清| 99熟女| 激情5月婷婷| 99视频久久免费视频| 六月丁香婷婷综合狠狠爱夜夜爱| 操人妻AV| 这里只有精彩视频| 激情网五月| 五月婷婷狠天天色综合| 98色花堂98t.R| 99久久婷婷国产综合精品电影| 日日夜夜天天综合| 中文在线视频久1| 99极品视频| 五月婷婷综合久久| 91九色 熟| 一本大道嫩草AV无码专区| 超碰二区| 婷婷色色婷婷| 色五月婷婷视频| www.日本久久videos| 久久久久99精品成人网站| 26uuu成人网| www久久99| 色综合天堂| 色五婷婷开心缴| 九玖欧洲亚洲| 这里只有精9| 97综合在线| 99爱爱网| 99啪视频在线观看| 亚洲丁香婷婷| 日韩黄色中文字幕| 欧美激情性做爰免费视频| 激情文学久久| 丁香婷婷五月色成人网站| 五月婷婷婷| 婷婷色丁香六月| 色综合久久天天综合网| 天天日狠狠| 广东99色在线| 婷婷综合激情五月中文字幕| 337p大胆噜噜噜噜噜91Av| 琪琪色热色色| 在线99精品| 狠狠综合区| 久九九热| 9热在线视频| 91在线观看www| 亚洲人成网站999综合| 大香蕉久久视频久久视频| 国产毛片精品一区二区色欲黄A片 国产人妻777人伦精品HD | 国产黄大片在线观看画质优化| AV在线观看网站| www一起操在线观看| 99碰在线视频| 久久182| 久久婷婷综合色丁香| 伦乱人妻| 五月天大香蕉AV| 婷婷综合日本| 97热这里精品在线视频| 激情丁香九九五月综合网| 97影院一级片| 五月婷婷综合激情网| 玖玖视频福利| 激情深爱综合| 婷婷五月激情片| 色婷婷五月天堂资源| 99精品22| 婷婷久久色| 99热最新精品| 99热亚洲精品| 丁香五月成人| 色婷婷呢狠禁久禁| 91av色色乱视频| 无码动漫av| 另类视频一区| 爱爱色五月天| 丁香婷婷六月激情综合| 激情五月色在线播放| 99热碰碰| 五月婷婷中文字幕| 人妻丰满精品一区二区A片| 99色爱| 久久丁香九| 九色91国产| 亚洲色色爱| 成人丁香婷婷五月天| 91精品久久久久、久五月天| 婷婷人人操| www.99色| 中文字幕欧美精品久久| 另类激情五月| 婷婷丁香成人在线视频| 五月激情婷婷六月| 国产成人在线精品| 99自拍视频在线观看| 99久| 中文字幕综合| 蜜桃婷婷五月| 九九久热| 青青草激情网| 丁香五月综合狠狠| 久久婷婷丁香| 欧美丁香六月在线观看视频| 五月伊人婷婷| 六月丁香啪啪| 五月天婷婷无码| 久色网址| 五月丁香色婷婷基地| 色色色色色色色色色色色色色97| 色色色综合| 九九九九中文字幕| 丁香婷婷五月天校园春色| 5月婷婷五月天| 在线日韩视频| 丁香五月婷婷香| 天天爽爽日日做做| 夜夜操,天天撸| 五月激情综合网| 亚洲五月天色色| 婷婷五月天亚洲色| 操操自拍| 五月天丁香久久综合| caop在线视频| 五月婷婷自拍| 天天天天操| 婷婷五月无码| 日逼免费视频 | 六月丁香激情婷婷| 五月天综合久久| 99热欲| 日本色婷婷五月天成人电影| 91精品国产99久久久久久天美| 国外亚洲成AV人片在线观看| www99精品| 人妻无码精品一区| 中国丰满熟女A片免费观| 激情综合区| 人妻啪啪啪| 7EzOBIhNq85TO| 99视频色在线观看| 91婷婷丁香五月| 狠狠色狠狠色综合日日91| 五月丁香六月婷婷不卡免费无码| 久久久久婷婷| 71在线精品视频一区| 天天天摸夜夜夜玩| 777精品久无码人妻蜜桃| AV在线免费网站| 婷婷久久色| 丁香婷婷五月激情四射网| 久久亚洲精品成人无码网站导航| 日本婷久久| 丁香婷婷五月人体| 久久精品亚洲热| 日本乱子人伦在线视频| 五月丁香激情综合网| AV成人在线播放| 99伊人婷婷在线| 激情网综合| 免费无码毛片一区二区A片| 婷婷丁香社区网| AV在线资源| 久久与婷婷| 67194中文字幕| 五月亭久久无码视频| 99爱在线视频观看| 亚洲久久天堂| 综合深爱五月| 久久婷婷五月天大香蕉| 日本特黄aaaaa| 熟女少妇内射日韩亚洲| 狠狠色综合777| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 99re思思精品视频在线观看| 久青草影院| 色婷婷视频| 成人精品视频99在线观看免费| 五月丁色AV| 涩五月婷婷| 激情婷婷五月天伊人在线观看| 国产精品美女久久久久AV超清| 91热er| 曰韩少妇内射免费播放| 激情五月婷婷伊人| 久婷婷视平| 色色色色色色网站|