首页 > 数据库 >实现 Excel 文件导入到向量数据库(Milvus),并支持 先查询知识库(Milvus),然后再查询大模型(Ollama) 的功能

实现 Excel 文件导入到向量数据库(Milvus),并支持 先查询知识库(Milvus),然后再查询大模型(Ollama) 的功能

时间:2024-09-14 15:57:26浏览次数:12  
标签:导入到 knowledge 知识库 Excel 查询 query Milvus


为了实现 Excel 文件导入到向量数据库(Milvus),并支持 先查询知识库(Milvus),然后再查询大模型(Ollama) 的功能,以下是具体的实现步骤:

1. 导入 Excel 数据到向量数据库(Milvus)

首先,您需要将 Excel 文件中的数据向量化,并将这些向量导入到 Milvus 数据库中。可以使用 pandas 读取 Excel 文件,使用 sentence-transformers 将数据转为向量,再将这些向量存入 Milvus。

安装必要依赖:
pip install pandas openpyxl sentence-transformers pymilvus
代码示例:
import pandas as pd
from sentence_transformers import SentenceTransformer
from pymilvus import connections, CollectionSchema, FieldSchema, DataType, Collection

# 连接 Milvus
connections.connect(host="localhost", port="19530")

# 定义 Milvus 中的 Collection Schema
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=500),
    FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768)  # 根据模型的输出维度调整
]
schema = CollectionSchema(fields, "Excel Data Collection")

# 创建 Collection
collection = Collection(name="excel_data", schema=schema)

# 载入 Excel 文件并向量化
def load_excel_to_milvus(excel_file):
    # 读取 Excel 数据
    df = pd.read_excel(excel_file)
    
    # 加载句子向量化模型
    model = SentenceTransformer('all-MiniLM-L6-v2')  # 或根据需要选择合适的模型
    
    # 向量化 Excel 数据中的文本列
    vectors = model.encode(df['text_column'].tolist())  # 假设有一列 'text_column'
    
    # 插入向量和文本到 Milvus
    collection.insert([df['text_column'].tolist(), vectors])

    # 创建索引
    collection.create_index(field_name="vector", index_params={"index_type": "IVF_FLAT", "metric_type": "L2", "params": {"nlist": 100}})
    collection.load()

# 示例:导入 Excel 文件
load_excel_to_milvus('data.xlsx')

2. 通过 Milvus 查询知识库

当数据导入 Milvus 后,您可以通过向量化的方式查询知识库。在此,用户输入会被转为向量,并与 Milvus 中的向量进行匹配。

def query_knowledge_base(user_query):
    # 使用相同的向量化模型将用户查询向量化
    model = SentenceTransformer('all-MiniLM-L6-v2')
    query_vector = model.encode([user_query])

    # 在 Milvus 中查询最相似的向量
    search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
    results = collection.search(
        data=query_vector,
        anns_field="vector",
        param=search_params,
        limit=5,
        output_fields=["text"]
    )
    
    # 返回查询到的文本结果
    return [result.entity.get("text") for result in results[0]]

3. 调用 Ollama 模型进行增强

知识库返回的结果可以作为输入传递给大模型(Ollama),以增强大模型的生成能力。这种方法叫做 知识增强推理,它先使用知识库对查询进行初步过滤,再用大模型进行推理。

def call_ollama_model_with_knowledge(knowledge_context, user_query):
    # 将知识库的结果作为上下文传递给 Ollama 模型
    prompt = f"Here is some relevant information from the knowledge base: {knowledge_context}\nNow answer the user's question: {user_query}"
    
    url = "http://localhost:port/ollama_model"  # 根据您的 Ollama 服务配置调整
    headers = {
        "Content-Type": "application/json"
    }
    data = {
        "prompt": prompt
    }
    
    response = requests.post(url, json=data, headers=headers)
    return response.json()

4. 使用 FastAPI 实现完整流程

可以使用 FastAPI 来实现整个流程:Excel 文件导入 -> 知识库查询 -> Ollama 模型增强。

FastAPI 代码示例:
from fastapi import FastAPI, UploadFile, File
import pandas as pd

app = FastAPI()

# 导入Excel到 Milvus 向量数据库
@app.post("/upload_excel/")
async def upload_excel(file: UploadFile = File(...)):
    df = pd.read_excel(file.file)
    load_excel_to_milvus(df)
    return {"message": "Excel file has been uploaded and processed"}

# 查询知识库,然后调用 Ollama 模型
@app.post("/query/")
async def query_knowledge_and_model(user_input: str):
    # 1. 查询 Milvus 知识库
    knowledge_results = query_knowledge_base(user_input)
    
    # 2. 将知识库结果作为上下文传递给 Ollama 模型
    knowledge_context = " ".join(knowledge_results)
    ollama_response = call_ollama_model_with_knowledge(knowledge_context, user_input)
    
    return {"knowledge_response": knowledge_results, "ollama_response": ollama_response}

5. 运行 FastAPI 应用

启动 FastAPI 服务器:

uvicorn main:app --reload

6. 使用 API 流程

  1. 导入 Excel 文件到 Milvus
curl -X POST "http://127.0.0.1:8000/upload_excel/" -F "[email protected]"
  1. 查询知识库并调用 Ollama 模型
curl -X POST "http://127.0.0.1:8000/query/" -H "Content-Type: application/json" -d '{"user_input": "关于人工智能的最新进展"}'

7. 总结

  • Excel 导入:通过 pandas 读取 Excel 数据,并使用 sentence-transformers 模型将文本转为向量,存入 Milvus。
  • 知识库查询:通过向量化方式在 Milvus 中进行查询,并返回最相似的结果。
  • 增强推理:使用查询到的知识库上下文作为 Ollama 模型的输入,增强大模型的回答能力。


标签:导入到,knowledge,知识库,Excel,查询,query,Milvus
From: https://blog.51cto.com/u_13171517/12017500

相关文章

  • Ubuntu系统Docker部署数据库管理工具DbGate并实现远程查询数据
    文章目录前言1.安装Docker2.使用Docker拉取DbGate镜像3.创建并启动DbGate容器4.本地连接测试5.公网远程访问本地DbGate容器5.1内网穿透工具安装5.2创建远程连接公网地址5.3使用固定公网地址远程访问前言本文主要介绍如何在LinuxUbuntu系统中使用Docker部......
  • IP 地址查询,给网络公关来点“真”的
    现在网络普及越来越广,影响力也越来越大,然而一些人为的操纵的负面事件也浮出水面,其中最为突出的便是“水军”操纵下的虚假网络公关战以及各种“刷量”服务。从“花5万就能上热搜”的非法生意被警方打击,到刷量公司被微博平台以不正当竞争为由告上法庭,网络世界中的“虚假繁荣”正......
  • T-SQL——转载:SQL Server 存储过程中处理多个查询条件的几种常见写法分析,我们该用那种
    本文出处:http://www.cnblogs.com/wy123/p/5958047.html原文中的图片并没有转载,具体查看原文目录0.背景说明1.测试数据2.第一种常见的写法:拼凑字符串,用EXEC的方式执行这个拼凑出来的字符串,不推荐3.第二种常见的写法:对所有查询条件用OR的方式加在where条件中,非常不推荐4.......
  • Mysql--查询
    目录基本语法查询常量查看表达式查询函数查询指定字段1.LIKE操作符2.使用正则表达式单个字段查询多个字段查询使用别名(AS)使用WHERE子句汇总函数查询所有列列别名子句对列别名的使用表别名条件查询条件查询运算符逻辑查询运算符排序与分页排序分页分组查询单子段分组多字段分组gr......
  • 【MySQL】查询语句之inner、left、right、full join 的区别
     前言:    INNERJOIN和OUTERJOIN是SQL中常用的两种连接方式,用于从两表活多表中提取相关的数据。两者区别主要在于返回的结果集如何处理匹配与不匹配的行。目录1、INNERJOIN2、OUTERJOIN3、总结1、INNERJOIN    称为内连接,只有查询的几......
  • 基于Java Springboot自驾游攻略查询系统
    一、作品包含源码+数据库+设计文档万字+PPT+全套环境和工具资源+部署教程二、项目技术前端技术:Html、Css、Js、Vue、Element-ui数据库:MySQL后端技术:Java、SpringBoot、MyBatis三、运行环境开发工具:IDEA/eclipse数据库:MySQL5.7数据库管理工具:Navicat10以上版本环境......
  • 邮政EMS查询|通过python查询快递单号API
    快递聚合查询的优势1、高效整合多种快递信息。2、实时动态更新。3、自动化管理流程。聚合国内外1500家快递公司的物流信息查询服务,使用API接口查询邮政EMS物流的便捷步骤,首先选择专业的数据平台的快递API接口:https://www.tanshuapi.com/market/detail-68以下示例是参考的示例代码:im......
  • MSSQL遍历数据库根据列值查询数据
    --受理编号declare@slbhvarchar(100),@searchColumnvarchar(100)--设置被查询列值set@slbh='201703160009'--设置搜索列名set@searchColumn='SLBH'declare@tableNamevarchar(50)declare@sqlnvarchar(max),@countintset@sql=N''setNOCOUNTON--优先输出表,......
  • 从MySQL JSON字段中提取去重城市列表的SQL查询
    重点:数据库有一个城市字段,是一个json数组(["北京市","上海市","广州市"]),每条数据的城市可能重合,通过下面SQL可返回去重后的城市列表,mysql版本要5.7以上才支持。SQL如下:SELECTDISTINCTTRIM(JSON_UNQUOTE(JSON_EXTRACT(城市json字段名,CONCAT('$[',n.n,']'))))AScityF......
  • 详细教您怎么用IP地址查询防范网络威胁
    网络安全表里如一有待考察。IP地址查询获得到的相关信息包含以下几个方面:最基础的地理位置—确定IP地址所属的地区、城市、甚至是街道,那么威胁溯源的追踪就容易很多了,如果发现可疑网络活动,IP地址查询快速确定来源地。这里不排除攻击来自高风险地区,要高度警惕。网络服务提供......