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

news/2025/2/9 6:11:03 标签: 数据库, 人工智能, python
面向读者群体

本节课程主要面向有一定编程基础和数据处理经验的计算机从业人员,如后端开发工程师、数据工程师以及对 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
python">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 根据检索到的结果生成更准确的回答。

python">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.niftyadmin.cn/n/5845667.html

相关文章

归一化与伪彩:LabVIEW图像处理的区别

在LabVIEW的图像处理领域,归一化(Normalization)和伪彩(Pseudo-coloring)是两个不同的概念,虽然它们都涉及图像像素值的调整,但目的和实现方式截然不同。归一化用于调整像素值的范围&#xff0c…

golang使用sqlite3,开启wal模式,并发读写

因为sqlite是基于文件的,所以默认情况下,sqlite是不支持并发读写的,即写操作会阻塞其他操作,同时sqlite也很容易就产生死锁。 但是作为一个使用广泛的离线数据库,从sqlite3.7.0版本开始(SQLite Release 3.…

PrimeFaces面包屑导航组件的实战应用

在Web开发中,面包屑导航是一种非常实用的功能,它可以帮助用户清晰地了解当前页面在网站中的位置,方便用户快速返回到上一级页面。PrimeFaces作为一款强大的JavaServer Faces(JSF)组件库,提供了简洁易用的&l…

React 与 Next.js

先说说 React 与 Next.js 结合的作用:高效构建高性能与搜索引擎优化(SEO)的网页 一. React 网站的“积木” React 用于构建网站中的各个组件,像是“积木”一样组成页面元素(如按钮、图片、表单等)。这些…

算法兵法全略(译文)

目录 始计篇 谋攻篇 军形篇 兵势篇 虚实篇 军争篇 九变篇 行军篇 地形篇 九地篇 火攻篇 用间篇 始计篇 算法,在当今时代,犹如国家关键的战略武器,也是处理各类事务的核心枢纽。算法的世界神秘且变化万千,不够贤能聪慧…

keil 解决 Error: CreateProcess failed, Command: ‘XXX\ARM\ARMCC\bin\fromelf.exe

从同事手里接手的工程,编译报错 *** Error: CreateProcess failed, Command: E:\Application\keil_5\ARM\ARMCC\bin\fromelf.exe --bin -o ..\Indbus.bin ..\OBJ\Indbus.axf 给大家讲一下,就是这条命令的意思是调用E:\Application\keil_5\ARM\ARM…

DeepSeek与ChatGPT对比:技术、应用与未来趋势

在人工智能飞速发展的时代,大语言模型成为了推动技术革新和产业变革的核心力量。DeepSeek和ChatGPT作为其中的典型代表,各自凭借独特的技术架构、训练方式和应用优势,在不同领域展现出卓越的性能。这两款模型在技术原理、应用表现以及未来发展…

2020-12-27 把int类型拆开并放入一个字符型数组当中。

缘由 把int类型拆开并放入一个字符型数组当中。_编程语言-CSDN问答 char a[47]{}; int aa 0, x 0;std::cin >> aa;while (aa)a[x] (aa % 10) 0, aa / 10;std::cout << a << "倒序\n";