大模型与矢量数据库协同工作原理

news/2025/4/1 3:50:37/文章来源:https://www.cnblogs.com/strivegys/p/18799498

环境准备

所需工具和库

  • Python:主编程语言。

  • PyMySQL/SQLAlchemy:连接MySQL数据库。

  • Sentence Transformers:本地开源文本嵌入模型。

  • Milvus/Pinecone:矢量数据库(示例使用Milvus)。

  • Transformers/PyTorch:支持模型推理。

  • Docker:部署Milvus(本地或服务器)。

安装依赖

pip install pymysql sentence-transformers pymilvus pandas

从MySQL导出数据

连接MySQL并提取文本数据

import pymysql
import pandas as pd
# 连接MySQL
conn = pymysql.connect(host='localhost',user='root',password='your_password',db='your_database',charset='utf8mb4'
)# 执行查询(示例:提取id和文本字段)
query = "SELECT id, content FROM articles;"
df = pd.read_sql(query, conn)conn.close()# 查看数据
print(df.head())

数据预处理

import redef clean_text(text):# 去除HTML标签text = re.sub(r'<[^>]+>', '', text)# 去除特殊字符和多余空格text = re.sub(r'[^a-zA-Z0-9\s]', '', text).strip()return text# 清洗文本字段
df['clean_content'] = df['content'].apply(clean_text)# 去除空值
df = df.dropna(subset=['clean_content'])

生成文本向量

使用Sentence-BERT模型

from sentence_transformers import SentenceTransformer# 加载模型(以'all-MiniLM-L6-v2'为例,生成384维向量)
model = SentenceTransformer('all-MiniLM-L6-v2')# 批量生成向量
texts = df['clean_content'].tolist()
embeddings = model.encode(texts, show_progress_bar=True)# 查看向量维度
print(embeddings.shape)  # 输出:(样本数, 384)

存入矢量数据库(以Milvus为例)

部署Milvus

# 使用Docker启动Milvus单机版
docker run -d --name milvus \-p 19530:19530 \-p 9091:9091 \milvusdb/milvus:latest

连接Milvus并创建集合

from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility# 连接Milvus
connections.connect(host='localhost', port='19530')# 定义集合结构
fields = [FieldSchema(name='id', dtype=DataType.INT64, is_primary=True),FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, dim=384)
]schema = CollectionSchema(fields, description='Text Embeddings')
collection = Collection('mysql_rag_demo', schema)# 创建索引(加速搜索)
index_params = {'index_type': 'IVF_FLAT','metric_type': 'L2','params': {'nlist': 128}
}collection.create_index(field_name='embedding', index_params=index_params)

插入数据

# 准备数据(确保id唯一)
ids = df['id'].tolist()
embeddings_list = embeddings.tolist()# 插入数据到Milvus
data = [ids, embeddings_list]
collection.insert(data)# 将数据加载到内存
collection.load()

实现RAG检索流程

用户查询向量化

def get_query_embedding(query):return model.encode([query])[0].tolist()

检索相似向量

def search_similar_texts(query, top_k=5):# 生成查询向量query_embedding = get_query_embedding(query)# 定义搜索参数search_params = {'metric_type': 'L2','params': {'nprobe': 10}}# 执行搜索results = collection.search(data=[query_embedding],anns_field='embedding',param=search_params,limit=top_k,output_fields=['id']  # 可返回其他字段)# 提取匹配的ID和文本matched_ids = [hit.entity.get('id') for hit in results[0]]matched_texts = df[df['id'].isin(matched_ids)]['clean_content'].tolist()return matched_texts

集成到大模型生成回答

from openai import OpenAI
# 可选用其他大模型
client = OpenAI(api_key='your_api_key')def rag_answer(query):# 检索相关文本context_texts = search_similar_texts(query)context = "\n".join(context_texts)# 构造Promptprompt = f"""基于以下上下文回答问题:{context}问题:{query}答案:"""# 调用大模型生成回答response = client.chat.completions.create(model="gpt-3.5-turbo",messages=[{"role": "user", "content": prompt}])return response.choices[0].message.content

增量数据同步

定期同步MySQL新增数据

def sync_new_data():# 查询最新ID(假设表中有自增ID)last_id = df['id'].max()# 获取新增数据new_query = f"SELECT id, content FROM articles WHERE id > {last_id};"new_df = pd.read_sql(new_query, conn)if not new_df.empty:# 清洗和生成向量new_df['clean_content'] = new_df['content'].apply(clean_text)new_embeddings = model.encode(new_df['clean_content'].tolist())# 插入Milvusdata = [new_df['id'].tolist(), new_embeddings.tolist()]collection.insert(data)collection.load()

总结

  • 将MySQL中的文本数据转换为向量,并利用矢量数据库实现高效的RAG检索。
  • 核心流程包括数据提取、向量化、存储和检索增强生成。
  • 应用于知识库问答、个性化推荐等场景,显著提升大模型在专业领域的准确性和实时性。

本文由mdnice多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907630.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[DevOps] 使用 Windows Sysprep(系统准备)重置计算机 SID

关于 Sysprep(系统准备) https://learn.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/sysprep--system-preparation--overview?view=windows-11 Sysprep 是 Windows 映像的一部分,在审核模式下运行。Sysprep(系统准备)可以准备 Windows 客户端或 Windows S…

堆区的介绍

悲观者从机会中看到困难。乐观者从困难中看到机会。 ——温斯顿丘吉尔我们先来说堆。堆是 OOM 故障最主要的发生区域。它是内存区域中最大的一块区域,被所有线程共享,存储着几乎所有的实例对象、数组。所有的对象实例以及数组都要在堆上分配,但是随着 JIT 编译器的发展与逃逸…

langchain0.3教程:从0到1打造一个智能聊天机器人

构建一个智能对话聊天机器人需要多少行代码?只需要不到30行。本篇文章结合gradio和langchain0.3从0到1创建一个智能聊天机器人并逐步优化流式输出、上下文记忆等功能在上一篇文章《大模型开发之langchain0.3(一):入门篇》 中已经介绍了langchain开发框架的搭建,最后使用la…

OpenGL渲染YUV实战:GPU加速转换与MipMap模糊效果实现

本文介绍了使用Qt和OpenGL渲染YUV420P数据的方法,包括YUV到RGB的转换以及通过OpenGL实现画质模糊的技术。文章详细讲解了YUV420P的结构、OpenGL纹理处理、MipMap技术及其在模糊效果中的应用,并探讨了在OpenGL ES 2.0环境下的兼容性问题及解决方案。最后,提出了进一步优化性能…

OpenGL绘制YUV、OpenGL 实现画质模糊以及 OpenGL ES 实现画质模糊

本文介绍了使用Qt和OpenGL渲染YUV420P数据的方法,包括YUV到RGB的转换以及通过OpenGL实现画质模糊的技术。文章详细讲解了YUV420P的结构、OpenGL纹理处理、MipMap技术及其在模糊效果中的应用,并探讨了在OpenGL ES 2.0环境下的兼容性问题及解决方案。最后,提出了进一步优化性能…

electron浏览器模式多标签方案

main.js let mainWindow function createWindow () {// Create the browser window.mainWindow = new BrowserWindow({}) }app.whenReady().then(() => {createWindow()const tabManager = new TabManager(mainWindow, baseUrl);//打开标签ipcMain.handle(open-tab, (event,…

EtherNet/IP转ProfiNet协议转换网关实现Alicat流量计数据批量接入西门子TIA Portal系统

一、案例背景 汽车涂装线的静电喷涂工艺对压缩空气流量稳定性要求极高。原系统中Alicat流量计与西门子PLC因协议差异无法联动,导致涂料浪费率高达8%。通过JM-EIPM-PN网关实现供气系统与PLC的深度集成。从而实现了EtherNet/IP转ProfiNet的通讯。二、设备连接与配置 设备配置: …

Ethernet/IP转Modbus助力库卡机器人与S7-1200PLC高效双向通讯

项目背景 在某汽车零部件生产车间的焊接生产线中,使用了库卡机器人进行焊接操作,其控制系统采用 Ethernet/IP 协议。同时,车间的自动化控制系统以西门子 S7 - 1200 PLC 为核心,采用 Modbus TCP 协议进行数据交互。为了实现焊接过程的自动化控制和生产数据的实时监控,需要将…

泛型--java进阶day10

1.泛型2.泛型--统一数据类型 如下图,当我们在泛型中添加不同的数据类型,add方法需要的数据类型也随之改变 [1][2]泛型--默认类型object当我们不指定泛型时,泛型的默认类型为object,所以add方法可以存储任意数据类型3.泛型--将运行期间错误提升到编译期 如下图,我们在集合中…

web139笔记(过if和sleep来判断盲注)

<?php error_reporting(0); function check($x){if(preg_match(/\\$|\.|\!|\@|\#|\%|\^|\&|\*|\?|\{|\}|\>|\<|nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|php|python|pingtouch|mv|mkdir|cp/i, $x)){die(too young too simple sometimes naiv…

App性能测试工具-solopi

Solopi 简介Solopi 是阿里的一款开源的APP测试工具,能对App进行UI自动化测试和性能测试,而且还能进行单台设备控制多台测试设备 的工具。在使用Solopi 时不用进行root权限,但需要连接到adb(android SDK提供的命令行工具)。因此在使用Solopi之前需要开启开发者权限。 Solop…