面向读者群体
本节课程主要面向有一定编程基础和数据处理经验的计算机从业人员,如后端开发工程师、数据工程师以及对 AI 应用有浓厚兴趣的技术人员。即使你之前没使用过向量数据库,也可以通过本节的实操内容快速上手,为企业或个人项目构建强大的智能问答或信息检索系统。
为什么要采用向量数据库技术?解决了什么问题?
在上一节我们已经介绍了 Embedding(嵌入向量)的概念:将文本、图片等信息转化成向量形式,以便进行相似度计算。当数据量较小或问题单一时,直接将嵌入向量存成文件,再在内存中进行搜索就够用了。但一旦数据量庞大(如上万、几十万条文档),仅靠内存检索就会遇到以下问题:
- 检索速度变慢:当数据量巨大时,简单的线性搜索耗时较长,且占用大量内存。
- 难以维护和扩展:手动管理嵌入向量文件不便于多用户并发访问、更新或删除数据。
- 缺少高可用、高并发支持:需要可扩展的分布式服务来支撑海量数据与高频访问。
向量数据库(如 Pinecone、Weaviate 等)为此提供了解决方案:
- 支持大规模数据存储,可处理数百万甚至更多的向量。
- 高效相似度检索,内置优化索引结构。
- API 级别的读写操作,方便集成到各种应用场景中。
原理与概念简明说明
- Embedding 向量:将文本(或图片等)转化为高维向量表示。
- 向量数据库:将海量嵌入向量存储在分布式、高可用的系统中,并提供搜索与管理 API。
- 检索过程:当用户查询一个问题时,先将查询问题转成向量,然后在向量数据库中检索最相似的向量条目,找到可能的上下文或答案。
在此基础上,再结合 GPT 等大语言模型,就可以构建检索增强生成 (RAG) 系统,通过先检索、再生成的方式,得到更加精准的回答。
实操:将嵌入向量存储在 Pinecone 中,并结合 GPT 生成响应
以下以 Pinecone 为例演示整个流程。你也可以选择 Weaviate 或其他向量数据库,核心步骤类似。
1. 注册并配置 Pinecone
- 在 Pinecone 官网 注册账户,获取 API Key。
- 创建一个 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天内无理由退货,需要保留购买凭证。
工作原理
- 将用户问题转化为向量。
- 在 Pinecone 中检索最相似的 FAQ 数据。
- 使用 GPT(如
gpt-3.5-turbo
)基于检索结果进行加工和回答。
小结与练习
通过向量数据库(Pinecone、Weaviate 等),我们能更高效地管理大规模嵌入向量,并快速检索最匹配的内容。再结合 GPT 模型生成自然语言回答,实现近乎“专业客服级”的问答体验。
练习:
-
扩展 FAQ 数据
- 添加更多常见问题,如退货流程、发票问题、会员折扣等。
- 上传并检索,观察在 Pinecone 中的查询效果。
-
结合更多业务场景
- 不是只有 FAQ,可以是产品文档、新闻文章、客户评价等内容。
- 将其嵌入向量化后,在检索到的上下文基础上让 GPT 生成总结或答案。
-
尝试 Weaviate
- 如果想对比不同向量数据库,可以尝试 Weaviate,查看其相似度搜索与 API 集成方式。
通过本节的学习,你将能搭建一个功能强大的问答或信息检索系统,适用于客服、知识管理、技术文档查阅等实际业务场景。