milvus+flask山寨《從零構建向量數據庫》第7章case2

?繼續流水賬完這本書,這個案例是打造文字形式的個人知識庫雛形。

create_context_db:

# Milvus Setup Arguments
COLLECTION_NAME = 'text_content_search'
DIMENSION = 2048
MILVUS_HOST = "localhost"
MILVUS_PORT = "19530"# Inference Arguments
BATCH_SIZE = 128from pymilvus import MilvusClient,utility,connections
milvus_client = MilvusClient(uri="http://localhost:19530")# Connect to the instance
connections.connect(host=MILVUS_HOST,port=MILVUS_PORT)from markdown_processor import vectorize_segments,split_html_into_segmentstest_embedding = vectorize_segments(split_html_into_segments("<h1>RAG還是挺有意思的!</h1>"))
embedding_dim = len(test_embedding[0]) #原始的test_embedding的len結構是[[],[]]的形式
print(embedding_dim)
print(test_embedding[:10])# Remove any previous collection with the same name
if utility.has_collection(COLLECTION_NAME):utility.drop_collection(COLLECTION_NAME)milvus_client.create_collection(collection_name=COLLECTION_NAME,dimension=embedding_dim,metric_type="IP",  # Inner product distanceconsistency_level="Strong",  # Supported values are (`"Strong"`, `"Session"`, `"Bounded"`, `"Eventually"`). See https://milvus.io/docs/consistency.md#Consistency-Level for more details.
)#下面這個手法可以直接讀取md文件,然后向量化存系統。
#from tqdm import tqdm
#data = []
#from glob import glob
#text_lines = []
#for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
#    with open(file_path, "r") as file:
#        file_text = file.read()
#    text_lines += file_text.split("# ")
#
#for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
#    data.append({"id": i, "vector": vectorize_segments(split_html_into_segments(line)), "text": line})
#
#milvus_client.insert(collection_name=COLLECTION_NAME, data=data)

markdown_processor.py 這個文件如今大可不必了。

import markdown
from bs4 import BeautifulSoup  #用于解析和操作HTML文檔
from transformers import AutoTokenizer,AutoModel #用于自動加載預訓練的模型以及分詞器
import torch #用于深度學習計算def markdown_to_html(markdown_text):return markdown.markdown(markdown_text)def split_html_into_segments(html_text): #定義函數,將HTML文檔分割成多個段落soup = BeautifulSoup(html_text,"html.parser") #解析HTML文檔segments = [] #初始化一個列表用于存儲分割后的段落#找HTML文檔中的段落,標題,無序列表和有序列表標簽for tag in soup.find_all(["h1","h2","h3","h4","h5","h6","p","ul","ol"]):segments.append(tag.get_text())return segments#定義函數,用于將文本段落轉換為向量表示
def vectorize_segments(segments):# 使用預訓練的分詞器和模型,這里使用的是BAAI/bge-large-zh-v1.5 一個中文模型tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-large-zh-v1.5")model = AutoModel.from_pretrained("BAAI/bge-large-zh-v1.5")model.eval() #將模型定位評估模式,避免dropout等訓練模式下的參數#使用分詞器對文本段落進行編碼,添加必要的填充和截斷,并返回PyTorch張量格式encoded_input = tokenizer(segments,padding=True,truncation=True,return_tensors="pt")with torch.no_grad():model_output = model(**encoded_input) #將編碼后的輸入傳遞給模型,獲取模型的輸出sentence_embeddings = model_output[0][:,0] #從模型輸出中提取句子向量化的結果#對句子的量化結果進行L2歸一化,以便于后續的相似度比較或聚類分析sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings,p=2,dim=1)return sentence_embeddings

flask的app.py

from flask import Flask,request,jsonify
from flask import render_template
import requests
from markdown_processor import markdown_to_html, split_html_into_segments, vectorize_segments
from pymilvus import MilvusClientimport logging
import osMILVUS_HOST = "localhost"
MILVUS_PORT = "19530"
COLLECTION_NAME = 'text_content_search'
TOP_K = 3app = Flask(__name__)
milvus_client = MilvusClient(uri="http://localhost:19530")@app.route("/")
def index():return render_template("index.html")@app.route('/upload', methods=['POST'])
def upload():if 'file' not in request.files:return jsonify({'error': 'No file part in the request'}), 400file = request.files['file']if file.filename == '':return jsonify({'error': 'No file selected for uploading'}), 400markdown_text = file.read().decode('utf-8')html_text = markdown_to_html(markdown_text)segments = split_html_into_segments(html_text)vectors = vectorize_segments(segments)# 將向量上傳到數據庫data = []for i, (segment, vector) in enumerate(zip(segments, vectors)):data.append({"id": i + 1,"vector": vector.tolist(), "text": segment})milvus_client.insert(collection_name=COLLECTION_NAME, data=data)return jsonify({'message': '文件已處理并上傳向量到數據庫'})@app.route('/search', methods=['POST'])
def search():data = request.get_json()search_text = data.get('search')# 添加前綴到查詢字符串instruction = "為這個句子生成表示以用于檢索相關文章:"search_text_with_instruction = instruction + search_text# 向量化修改后的查詢search_vector = vectorize_segments([search_text_with_instruction])[0].tolist()search_results = milvus_client.search(collection_name=COLLECTION_NAME,data=[search_vector],  limit=3,  # Return top 3 resultssearch_params={"metric_type": "IP", "params": {}},  # Inner product distanceoutput_fields=["text"],  # Return the text field)  # 構建與 LLM API 交互的消息列表messages = [{"role": "system", "content": "You are a helpful assistant. Answer questions based solely on the provided content without making assumptions or adding extra information."}] # 解析搜索結果for index,value in enumerate(search_results):#print(value)text = value[0]["entity"]["text"]print(text)messages.append({"role": "assistant", "content": text})messages.append({"role": "user", "content": search_text})# 向 deepseek 發送請求并獲取答案 (用的silicon flow)url = "https://api.ap.siliconflow.com/v1/chat/completions"payload = {"model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B","messages": messages,"stream": False,"max_tokens": 1000,"stop": None,"temperature": 0.7,"top_p": 0.7,"top_k": 10,"frequency_penalty": 0.5,"n": 1,"response_format": {"type": "text"},}headers = {"Authorization": "Bearer <#你自己的token>","Content-Type": "application/json"}response = requests.request("POST", url, json=payload, headers=headers)answer = response.textreturn jsonify({'answer': answer})if __name__ == '__main__':app.run(host='0.0.0.0', port=5020, debug=True)

吐槽一下,silicon flow這種deepseek API免費問不到幾個,就開始算錢咯。

?小網站結構,以及其他雜代碼,可以查看以及直接下載:https://www.ituring.com.cn/book/3305?

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

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

相關文章

【第一篇】 創建SpringBoot工程的四種方式

簡介&#xff1a; 通過此篇博客你可以使用任何方式進行創建 SpringBoot 項目&#xff0c;并且在文章的最后附上答疑解惑一節&#xff0c;為你排除在使用過程中發生的常見問題。文章內容若存在錯誤或需改進的地方&#xff0c;歡迎大家指正&#xff01;若對操作有任何疑問歡迎留言…

GPT( Generative Pre-trained Transformer )模型:基于Transformer

GPT是由openAI開發的一款基于Transformer架構的預訓練語言模型&#xff0c;擁有強大的生成能力和多任務處理能力&#xff0c;推動了自然語言處理&#xff08;NLP&#xff09;的快速發展。 一 GPT發展歷程 1.1 GPT-1&#xff08;2018年&#xff09; 是首個基于Transformer架構…

網絡檢測工具InternetTest v8.9.1.2504 單文件版,支持一鍵查詢IP/DNS、WIFI密碼信息

—————【下 載 地 址】——————— 【?本章下載一】&#xff1a;https://drive.uc.cn/s/295e068b79314 【?本章下載二】&#xff1a;https://pan.xunlei.com/s/VOQDXguH0DYPxrql5y2zlkhTA1?pwdg2nx# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

CSS- 4.1 浮動(Float)

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在HBuilder中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 HTML系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查看&#xff01; 點…

配置WebStorm鍵盤快捷鍵

目錄 配置快捷鍵添加鍵盤快捷鍵添加鼠標快捷鍵添加縮寫重置為默認快捷鍵 禁用雙快捷鍵用戶快捷鍵的保存位置與操作系統沖突 配置快捷鍵 WebStorm包含預定義的快捷鍵&#xff0c;同時允許自定義快捷鍵。要查看快捷鍵配置&#xff0c;請打開“設置”對話框&#xff0c;然后選擇K…

Java 21 + Spring Boot 3.5:AI驅動的高性能框架實戰

簡介 在微服務架構日益普及的今天,如何構建一個既高性能又具備AI驅動能力的后端系統成為開發者關注的焦點。本篇文章將深入探討Java 21與Spring Boot 3.5的結合,展示如何通過Vector API和JIT優化實現單線程性能提升30%,并利用飛算JavaAI生成智能重試機制和超時控制代碼,解…

Matrix-Game:鍵鼠實時控制、實時生成的游戲生成模型(論文代碼詳細解讀)

1.簡介 本文介紹了一種名為Matrix-Game的交互式世界基礎模型&#xff0c;專門用于可控的游戲世界生成。 Matrix-Game通過一個兩階段的訓練流程來實現&#xff1a;首先進行大規模無標簽預訓練以理解環境&#xff0c;然后進行動作標記訓練以生成交互式視頻。為此&#xff0c;研…

AI生成信息準確性,Ask-Refine提問策略,Agent最少的工具箱是什么樣的?

關于AI生成信息準確性的探討 在社群聊天記錄中&#xff0c;用戶提出在使用多種AI工具搜索培生出版企業上市信息時&#xff0c;遇到80%信息錯誤的問題&#xff0c;質疑AI為何無法勝任簡單的網絡信息爬取任務&#xff0c;并表達了對AI實用性的期望。 我抽空對此做出解答&#xff…

Linux系統中部署java服務(docker)

1、不使用docker ? 1. 檢查并安裝 Java 環境 檢查 Java 是否已安裝&#xff1a; java -version? 2. 上傳 Java 項目 JAR 文件 可以創建一個server文件夾&#xff0c;然后上傳目錄 查看當前目錄 然后創建目錄上傳jar包 ? 3. 啟動 Java 服務 java -jar hywl-server.jar…

遨游科普:三防平板是什么?有什么功能?

清晨的露珠還掛在帳篷邊緣&#xff0c;背包里的三防平板卻已開機導航&#xff1b;工地的塵土飛揚中&#xff0c;工程師正通過它查看施工圖紙&#xff1b;暴雨傾盆的救援現場&#xff0c;應急隊員用它實時回傳災情數據……這些看似科幻的場景&#xff0c;正因三防平板的普及成為…

Flask Docker Demo 項目指南

首先&#xff0c;創建一個新的項目目錄并創建必要的文件&#xff1a; mkdir flask-docker-demo cd flask-docker-demo創建一個簡單的Flask應用 (app.py)&#xff1a; from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, Docker World…

GO語言語法---if語句

文章目錄 1. 基本語法1.1 單分支1.2 雙分支1.3 多分支 2. Go特有的if語句特性2.1 條件前可以包含初始化語句2.2 條件表達式不需要括號2.3 必須使用大括號2.4 判斷語句所在行數控制 Go語言的if語句用于條件判斷&#xff0c;與其他C風格語言類似&#xff0c;但有一些獨特的語法特…

自動化 NuGet 包打包與上傳:完整批處理腳本詳解(含 SVN 支持)

在大型項目中&#xff0c;我們常常需要定期打包多個 .csproj 項目為 NuGet 包&#xff0c;并上傳到私有 NuGet 服務。這篇文章分享一份實戰腳本&#xff0c;支持以下自動化流程&#xff1a; 自動讀取、更新 .csproj 文件中的 Version、PackageOutputPath 等節點&#xff1b; 自…

刷leetcodehot100返航版--雙指針5/16

for (int i 0, j 0; i < n; i ) { while (j < i && check(i, j)) j ; // 具體問題的邏輯 } 常見問題分類&#xff1a; (1) 對于一個序列&#xff0c;用兩個指針維護一段區間 (2) 對于兩個序列&#xff0c;維護某種次序&#xff0c;比如歸并排序中…

手撕四種常用設計模式(工廠,策略,代理,單例)

工廠模式 一、工廠模式的總體好處 解耦&#xff1a;客戶端與具體實現類解耦&#xff0c;符合“開閉原則”。統一創建&#xff1a;對象創建交由工廠處理&#xff0c;便于集中控制。增強可維護性&#xff1a;新增對象種類時不需要大改動調用代碼。便于擴展&#xff1a;易于管理…

阿里通義萬相 Wan2.1-VACE:開啟視頻創作新境界

2025 年 5 月 14 日&#xff0c;阿里巴巴為視頻創作領域帶來了重磅驚喜 —— 開源通義萬相 Wan2.1-VACE。這一模型堪稱視頻生成與編輯領域的集大成者&#xff0c;憑借其全面且強大的功能&#xff0c;為廣大創作者、開發者以及企業用戶開辟了全新的視頻創作天地。它打破了以往視…

自定義類、元組、字典和結構體對比——AutoCAD C# 開發中建立不同對象之間的聯系

以下是對它們的詳細分析和對比&#xff1a; 1. 自定義類&#xff08;Class&#xff09; 優勢 封裝性強&#xff1a;可以定義字段、屬性、方法和事件&#xff0c;實現復雜的行為和邏輯。繼承與多態&#xff1a;支持繼承體系&#xff0c;可通過接口或抽象類實現多態。引用類型…

MVC架構模式

mvc架構是一種常見的開發模式,以下是三個核心部分 Model&#xff08;模型&#xff09;&#xff1a;負責應用程序的數據和業務邏輯。它與數據庫交互&#xff0c;處理數據的存儲、檢索和更新&#xff0c;是應用程序的核心業務所在。View&#xff08;視圖&#xff09;&#xff1a…

Python實例題:Python百行制作登陸系統

目錄 Python實例題 題目 python-login-systemPython 百行登錄系統腳本 代碼解釋 用戶數據庫&#xff1a; 注冊功能&#xff1a; 登錄功能&#xff1a; 主程序&#xff1a; 運行思路 注意事項 Python實例題 題目 Python百行制作登陸系統 python-login-systemPython…

uniapp使用全局組件,

在 Uniapp 中&#xff0c;如果你的組件是應用層組件&#xff08;例如全局懸浮按鈕、全局通知欄等&#xff09;&#xff0c;并且希望它自動出現在所有頁面而無需在每個頁面模板中手動添加組件標簽&#xff0c;可以通過以下兩種方案實現&#xff1a; 方案一&#xff1a;通過 app.…