OpenAI 实战进阶教程 - 第十节 : 结合第三方工具的向量数据库Pinecone

news2025/3/13 6:32:05
面向读者群体

本节课程主要面向有一定编程基础和数据处理经验的计算机从业人员,如后端开发工程师、数据工程师以及对 AI 应用有浓厚兴趣的技术人员。即使你之前没使用过向量数据库,也可以通过本节的实操内容快速上手,为企业或个人项目构建强大的智能问答或信息检索系统。


为什么要采用向量数据库技术?解决了什么问题?

在上一节我们已经介绍了 Embedding(嵌入向量)的概念:将文本、图片等信息转化成向量形式,以便进行相似度计算。当数据量较小或问题单一时,直接将嵌入向量存成文件,再在内存中进行搜索就够用了。但一旦数据量庞大(如上万、几十万条文档),仅靠内存检索就会遇到以下问题:

  1. 检索速度变慢:当数据量巨大时,简单的线性搜索耗时较长,且占用大量内存。
  2. 难以维护和扩展:手动管理嵌入向量文件不便于多用户并发访问、更新或删除数据。
  3. 缺少高可用、高并发支持:需要可扩展的分布式服务来支撑海量数据与高频访问。

向量数据库(如 Pinecone、Weaviate 等)为此提供了解决方案:

  • 支持大规模数据存储,可处理数百万甚至更多的向量。
  • 高效相似度检索,内置优化索引结构。
  • API 级别的读写操作,方便集成到各种应用场景中。

原理与概念简明说明

  1. Embedding 向量:将文本(或图片等)转化为高维向量表示。
  2. 向量数据库:将海量嵌入向量存储在分布式、高可用的系统中,并提供搜索与管理 API。
  3. 检索过程:当用户查询一个问题时,先将查询问题转成向量,然后在向量数据库中检索最相似的向量条目,找到可能的上下文或答案。

在此基础上,再结合 GPT 等大语言模型,就可以构建检索增强生成 (RAG) 系统,通过先检索、再生成的方式,得到更加精准的回答。


实操:将嵌入向量存储在 Pinecone 中,并结合 GPT 生成响应

以下以 Pinecone 为例演示整个流程。你也可以选择 Weaviate 或其他向量数据库,核心步骤类似。

1. 注册并配置 Pinecone
  1. 在 Pinecone 官网 注册账户,获取 API Key。
  2. 创建一个 Index(索引),配置相应维度(与 Embedding 模型输出的维度一致,如 text-embedding-ada-002 模型输出 1536 维)。
2. 准备待存储的数据

以 FAQ 为例,假设我们有如下几条问答:

Q: 贵公司支持退货吗?
A: 我们支持30天内无理由退货,请保留好购买凭证。

Q: 标准配送需要多久?
A: 标准配送一般需要5到7个工作日。

Q: 如何联系客户服务?
A: 您可以拨打400-xxxx-xxxx或发送邮件至support@example.com。
3. 生成并上传嵌入向量到 Pinecone
import openai
from pinecone import Pinecone, Index, ServerlessSpec

# 设置 OpenAI 的 API Key,用于生成 Embedding
openai.api_key = "Your_API_Key"

# 1. 实例化 Pinecone 对象
# environment 对应你在 Pinecone 控制台上设置的区域,如 "us-east1-gcp"
pc = Pinecone(
    api_key="Your_API_Key",
    environment="us-east-1"
)

# 2. 如果还没有索引,就创建一个;如果已有,可以直接获取。
index_name = "my-faq-index"

# 列出已存在的索引
index_list = pc.list_indexes().names()
print("当前已有索引:", index_list)

if index_name not in index_list:
    print(f"索引 {index_name} 不存在,即将创建...")
    # dimension = 1536 与 text-embedding-ada-002 模型输出保持一致
    pc.create_index(
        name=index_name,
        dimension=1536,
        metric='cosine',
        spec=ServerlessSpec(
            cloud='aws',
            region='us-east-1'
        )
    )
else:
    print(f"索引 {index_name} 已存在。")

# 3. 获取索引对象
# To get the unique host for an index,
# see https://docs.pinecone.io/guides/data/target-an-index
index = pc.Index(host="INDEX_HOST")

# 4. 构造 FAQ 数据
faq_data = [
    {"id": "1", "question": "贵公司支持退货吗?", "answer": "我们支持30天内无理由退货,请保留好购买凭证。"},
    {"id": "2", "question": "标准配送需要多久?", "answer": "标准配送一般需要5到7个工作日。"},
    {"id": "3", "question": "如何联系客户服务?", "answer": "您可以拨打400-xxxx-xxxx或发送邮件至support@example.com。"}
]

# 5. 生成 Embedding 并批量 upsert 到 Pinecone
upserts = []
for item in faq_data:
    response = openai.embeddings.create(
        model="text-embedding-ada-002",
        input=item["question"]
    )
    vector = response.data[0].embedding

    upserts.append((item["id"], vector, {"question": item["question"], "answer": item["answer"]}))

# 6. 批量 upsert 向量
index.upsert(vectors=upserts)
print("FAQ 数据已成功上传至 Pinecone!")

Pinecone控制台示例:
在这里插入图片描述

4. 通过 Pinecone API 检索数据并结合 GPT 生成响应

当用户输入问题时,可以先将问题向量化,然后在 Pinecone 中检索相似问题,再由 GPT 根据检索到的结果生成更准确的回答。

def get_answer_from_faq(user_question: str) -> str:
    """根据用户输入,在 Pinecone 中检索最相关 FAQ,并使用 GPT 生成回答。"""
    # 1. 将用户问题转化为向量
    embedding_result = openai.embeddings.create(
        model="text-embedding-ada-002",
        input=user_question
    )
    user_vector = embedding_result.data[0].embedding

    # 2. 在 Pinecone 中检索相似 FAQ
    query_result = index.query(
        vector=user_vector,
        top_k=1,
        include_metadata=True
    )

    if query_result and query_result.matches:
        faq_match = query_result.matches[0].metadata
        # 3. 使用 GPT 生成自然语言回答
        prompt = f"用户的问题:{user_question}\n参考回答:{faq_match['answer']}\n请给出简明回复:"
        completion = openai.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=[{"role": "user", "content": prompt}]
        )
        return completion.choices[0].message.content.strip()
    else:
        return "抱歉,目前无法找到相关信息。"

# 测试检索和回答
user_q = "请问怎么退货?"
response_text = get_answer_from_faq(user_q)
print("AI 回答:", response_text)

示例输出:

AI 回答: 您可以在30天内无理由退货,需要保留购买凭证。

工作原理

  1. 将用户问题转化为向量。
  2. 在 Pinecone 中检索最相似的 FAQ 数据。
  3. 使用 GPT(如 gpt-3.5-turbo)基于检索结果进行加工和回答。

小结与练习

通过向量数据库(Pinecone、Weaviate 等),我们能更高效地管理大规模嵌入向量,并快速检索最匹配的内容。再结合 GPT 模型生成自然语言回答,实现近乎“专业客服级”的问答体验。

练习

  1. 扩展 FAQ 数据

    • 添加更多常见问题,如退货流程、发票问题、会员折扣等。
    • 上传并检索,观察在 Pinecone 中的查询效果。
  2. 结合更多业务场景

    • 不是只有 FAQ,可以是产品文档、新闻文章、客户评价等内容。
    • 将其嵌入向量化后,在检索到的上下文基础上让 GPT 生成总结或答案。
  3. 尝试 Weaviate

    • 如果想对比不同向量数据库,可以尝试 Weaviate,查看其相似度搜索与 API 集成方式。

通过本节的学习,你将能搭建一个功能强大的问答或信息检索系统,适用于客服、知识管理、技术文档查阅等实际业务场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入Linux系列之进程地址空间

深入Linux系列之进程地址空间 1.引入 那么在之前的学习中,我们知道我们创建一个子进程的话,我们可以在代码层面调用fork函数来创建我们的子进程,那么fork函数的返回值根据我们当前所处进程的上下文是返回不同的值,它在父进程中返…

AWK系统学习指南:从文本处理到数据分析的终极武器 介绍

目录 一、AWK核心设计哲学解析 1.1 记录与字段的原子模型 1.2 模式-动作范式 二、AWK编程语言深度解析 2.1 控制结构 说明: 2.2 关联数组 代码说明: 示例输入和输出: 注意事项: 2.3 内置函数库 三、高级应用技巧 3.1…

250207-MacOS修改Ollama模型下载及运行的路径

在 macOS 上,Ollama 默认将模型存储在 ~/.ollama/models 目录。如果您希望更改模型的存储路径,可以通过设置环境变量 OLLAMA_MODELS 来实现。具体步骤如下: 选择新的模型存储目录:首先,确定您希望存储模型的目标目录路…

半导体行业跨网文件交换系统

在当今这个数字化转型的时代,半导体行业作为技术密集型产业,正面临着前所未有的信息安全挑战。随着企业内外网隔离措施的加强,如何实现既安全又高效的跨网文件交换,成为了众多半导体企业的一大难题。 特别是在研发和生产过程中产生…

使用GD32F470的硬件SPI读写W25Q64

代码简单改下引脚定义便可以使用! 使用的单片机具体型号:GD32F470ZGT6 简单介绍下W25Q64: /* W25Q64 性能参数 */ /* 容量:8MByte 64Mbit */ /* 有128个块,每个块有64KByte */ /* 每个块有16个扇区,每个…

02为什么 OD门和 OC门输出必须加上拉电阻?

为什么 OD(开漏)门和 OC(开集)门输出必须加上拉电阻? 1、首先一点,知道OD是说的MOS管,OC是说的三极管,二者的区别与联系大家应该都懂。 2、以OC门举例,芯片的OC门内部结…

AI方案调研与实践 (不定期补充)

目录 说明 1. AI云主机准备 1.1 Ollama配置 设置模型保存路径 配置模型驻留内存时间 查看GPU状况命令: nvidia-smi 2. Deepseek 2.1 安装与使用 3. LobeChat配置 参考 说明 调研并实例化各种AI方案,探索训练/使用方式的最佳实践。 1. AI云主机准备 可以去一…

人工智能大模型之模型蒸馏与知识蒸馏

一、背景介绍 随着人工智能技术的不断发展,大模型在各个领域的应用也越来越广泛。模型蒸馏(Model Distillation)和知识蒸馏(Knowledge Distillation)是两种非常重要的模型压缩技术,它们可以帮助我们将大型…

[手机Linux] onepluse6T 系统重新分区

一,刷入TWRP 1. 电脑下载 Fastboot 工具(解压备用)和对应机型 TWRP(.img 后缀文件,将其放入前面解压的文件夹里) 或者直接这里下载:TWRP 2. 将手机关机,长按音量上和下键 开机键 进入 fastbo…

k8s部署elasticsearch

前置环境:已部署k8s集群,ip地址为 192.168.10.1~192.168.10.5,总共5台机器。 1. 创建provisioner制备器(如果已存在,则不需要) 制备器的具体部署方式,参考我之前的文章:k8s部署rab…

本地部署DeepSeek

下载Docker Docker Desktop: The #1 Containerization Tool for Developers | Docker 下载安装ollama Download Ollama on macOS 下载完成后解压运行 终端输入 Ollama --version 输出对应版本号即为下载成功 如果没有弹出上述图片,浏览器输入http://localhos…

21.[前端开发]Day21-HTML5新增内容-CSS函数-BFC-媒体查询

王者荣耀-网页缩小的问题处理 为什么会产生这个问题?怎么去解决 可以给body设置最小宽度 1 HTML5新增元素 HTML5语义化元素 HTML5其他新增元素 2 Video、Audio元素 HTML5新增元素 - video video支持的视频格式 video的兼容性写法 HTML5新增元素 - audio audio…

nbmade-boot调用deepseek的api过程与显示

希望大家一起能参与我的新开源项目nbmade-boot: 宁波智能制造低代码实训平台 下面简单介绍调用最近大红的AI :deepseek的api过程与显示,包括前后端代码与效果图 一、后端代码 1、几个基础的java类 DeepSeekRequest .java package com.nbcio.demo.do…

Linux:安装 node 及 nvm node 版本管理工具(ubuntu )

目录 方法一:手动下载安装文件安装方法二:curl安装 方法一:手动下载安装文件安装 git clone 远程镜像 git clone https://gitee.com/mirrors/nvm安装 nvm bash install.sh刷新配置,使配置在终端生效 // 方法 1 source /root/.…

【多线程-第三天-NSOperation和GCD的区别 Objective-C语言】

一、我们来看NSOperation和GCD的区别 1.我们来对比一下,NSOperation和GCD, 那这个代码,我们都写过了, 我们来看一下它们的特点啊,首先来看GCD, 1)GCD是C语言的框架,是iOS4.0之后推出的,并且它的特点是,针对多核做了优化,可以充分利用CPU的多核,OK,这是GCD, 2…

【医院运营统计专题】2.运营统计:医院管理的“智慧大脑”

医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 引言 在当今医疗行业快速发展的背景下,医院运营管理的科学性和有效性成为了决定医院竞争力和可持续发展能力的关键因素。运营统计作为医院管理的重要工具,通过对医院各类数据的收集、整理、分析和解读,为医…

Ollama 部署 DeepSeek-R1 及Open-WebUI

Ollama 部署 DeepSeek-R1 及Open-WebUI 文章目录 Ollama 部署 DeepSeek-R1 及Open-WebUI〇、说明为什么使用本方案 一、 安装Ollama1、主要特点:2、安装3、验证 二、Ollama 部署 DeepSeek1、部署2、模型选用3、Ollama 常用命令4、Ollama模型默认存储路径 安装open-w…

Vite 打包原理

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【大模型】Ubuntu下安装ollama,DeepSseek-R1:32b的本地部署和运行

1 ollama 的安装与设置 ollama官网链接:https://ollama.com/ 在左上角的【Models】中展示了ollama支持的模型在正中间的【Download】中课可以下载支持平台中的安装包。   其安装和模型路径配置操作流程如下: ollama的安装 这里选择命令安装curl -fsSL …

蓝桥杯---力扣题库第38题目解析

文章目录 1.题目重述2.外观数列举例说明3.思路分析(双指针模拟)4.代码说明 1.题目重述 外观数列实际上就是给你一串数字,我们需要对于这个数据进行一个简单的描述罢了; 2.外观数列举例说明 外观数列都是从1开始的,也…