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.mzph.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.…