【AI大模型开发】-基于FAISS的语义搜索系统(实战)

向量数据库实战:基于FAISS的语义搜索系统

一、项目概述

1.1 什么是向量数据库?

向量数据库是一种专门用于存储、索引和检索高维向量数据的数据库系统。在AI领域,向量通常是指通过预训练模型(如Transformer)将文本、图像等非结构化数据转换而成的数值表示(Embedding)。

1.2 项目背景

本项目展示了如何使用阿里云百炼Embedding API 生成文本向量,并结合FAISS(Facebook AI Similarity Search)构建一个简单但功能完整的语义搜索系统。

1.3 技术栈

  • Python 3.11+:主要开发语言
  • 阿里云百炼Embedding API:生成文本向量
  • FAISS:向量相似度搜索引擎
  • NumPy:数值计算库

二、环境配置

2.1 安装依赖

项目所需依赖已在requirements.txt文件中列出:

faiss_cpu==1.7.4

openai>=1.0.0

numpy<2

复制代码
使用以下命令安装依赖:

```bash
pip install -r requirements.txt

2.2 配置API密钥

项目使用阿里云百炼Embedding API,需要配置API密钥:

  1. 在阿里云控制台获取API密钥(DASHSCOPE_API_KEY)
  2. 设置环境变量:
    • Windows:

      cmd 复制代码
      setx DASHSCOPE_API_KEY "your-api-key"
    • Linux/Mac:

      bash 复制代码
      export DASHSCOPE_API_KEY="your-api-key"

三、项目结构解析

项目包含两个核心Python脚本和一个依赖文件:

复制代码
CASE-向量数据库/
├── 1-embedding计算.py          # 基础的向量生成示例
├── 2-embedding-faiss-元数据.py # 完整的向量数据库搜索系统
└── requirements.txt            # 项目依赖

四、核心功能实现

4.1 基础向量生成(1-embedding计算.py

这个脚本展示了如何使用阿里云百炼API生成文本向量:

python 复制代码
import os
from openai import OpenAI

# 初始化OpenAI客户端(兼容模式)
client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

# 生成向量
completion = client.embeddings.create(
    model="text-embedding-v4",
    input='我想知道迪士尼的退票政策',
    dimensions=1024,  # 指定向量维度
    encoding_format="float"
)

# 输出结果
print(completion.model_dump_json())

关键参数说明:

  • model:使用的向量模型,这里是text-embedding-v4
  • input:要生成向量的文本内容
  • dimensions:生成向量的维度,设置为1024
  • encoding_format:输出格式,这里使用float格式

4.2 完整向量搜索系统(2-embedding-faiss-元数据.py

这个脚本实现了一个完整的语义搜索系统,包含向量生成、FAISS索引构建和相似度搜索功能:

4.2.1 系统架构
复制代码
文本数据 → Embedding生成 → 向量存储(FAISS索引)
                             ↓
查询文本 → Embedding生成 → 向量相似度搜索 → 返回结果
4.2.2 核心功能模块

1. 初始化API客户端

python 复制代码
try:
    client = OpenAI(
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )
except Exception as e:
    print("初始化OpenAI客户端失败,请检查环境变量'DASHSCOPE_API_KEY'是否已设置。")
    print(f"错误信息: {e}")
    exit()

2. 数据准备

python 复制代码
documents = [
    {
        "id": "doc1",
        "text": "迪士尼乐园的门票一经售出,原则上不予退换。但在特殊情况下,如恶劣天气导致园区关闭,可在官方指引下进行改期或退款。",
        "metadata": {"source": "official_faq_v1.pdf", "category": "退票政策", "author": "Admin"}
    },
    # 更多文档...
]

3. 向量生成与存储

python 复制代码
metadata_store = []
vectors_list = []
vector_ids = []

for i, doc in enumerate(documents):
    try:
        # 调用API生成向量
        completion = client.embeddings.create(
            model="text-embedding-v4",
            input=doc["text"],
            dimensions=1024,
            encoding_format="float"
        )
        
        # 获取向量
        vector = completion.data[0].embedding
        vectors_list.append(vector)
        
        # 存储元数据
        metadata_store.append(doc)
        vector_ids.append(i)
        
        print(f"  - 已处理文档 {i+1}/{len(documents)}")

    except Exception as e:
        print(f"处理文档 '{doc['id']}' 时出错: {e}")
        continue

# 转换为FAISS所需的NumPy格式
vectors_np = np.array(vectors_list).astype('float32')
vector_ids_np = np.array(vector_ids)

4. 构建FAISS索引

python 复制代码
dimension = 1024  # 向量维度

# 创建基础索引
index_flat_l2 = faiss.IndexFlatL2(dimension)

# 使用IndexIDMap包装,支持自定义ID
index = faiss.IndexIDMap(index_flat_l2)

# 添加向量和ID到索引
index.add_with_ids(vectors_np, vector_ids_np)

5. 语义搜索

python 复制代码
query_text = "我想了解一下迪士尼门票的退款流程"

# 生成查询向量
query_completion = client.embeddings.create(
    model="text-embedding-v4",
    input=query_text,
    dimensions=1024,
    encoding_format="float"
)
query_vector = np.array([query_completion.data[0].embedding]).astype('float32')

# 搜索相似向量
k = 3  # 返回前3个结果
distances, retrieved_ids = index.search(query_vector, k)

# 展示结果
print("\n--- 搜索结果 ---")
for i in range(k):
    doc_id = retrieved_ids[0][i]
    retrieved_doc = metadata_store[doc_id]
    
    print(f"\n--- 排名 {i+1} (相似度得分/距离: {distances[0][i]:.4f}) ---")
    print(f"ID: {doc_id}")
    print(f"原始文本: {retrieved_doc['text']}")
    print(f"元数据: {retrieved_doc['metadata']}")

五、运行示例

5.1 运行基础向量生成

bash 复制代码
python 1-embedding计算.py

输出结果示例:

json 复制代码
{
  "data": [
    {
      "embedding": [0.0123, -0.0456, ...],
      "index": 0,
      "object": "embedding"
    }
  ],
  "model": "text-embedding-v4",
  "object": "list",
  "usage": {
    "prompt_tokens": 12,
    "total_tokens": 12
  }
}

5.2 运行语义搜索系统

bash 复制代码
python 2-embedding-faiss-元数据.py

输出结果示例:

复制代码
正在为文档生成向量...
  - 已处理文档 1/4
  - 已处理文档 2/4
  - 已处理文档 3/4
  - 已处理文档 4/4

FAISS 索引已成功创建,共包含 4 个向量。

正在为查询文本生成向量: '我想了解一下迪士尼门票的退款流程'

--- 搜索结果 ---

--- 排名 1 (相似度得分/距离: 0.3222) ---
ID: 2
原始文本: 对于在线购买的迪士尼门票,如果需要退票,必须在票面日期前48小时通过原购买渠道提交申请,并可能收取手续费。
元数据: {'source': 'online_policy.html', 'category': '退票政策', 'author': 'E-commerceTeam'}

--- 排名 2 (相似度得分/距离: 0.3312) ---
ID: 0
原始文本: 迪士尼乐园的门票一经售出,原则上不予退换。但在特殊情况下,如恶劣天气导致园区关闭,可在官方指引下进行改期或退款。
元数据: {'source': 'official_faq_v1.pdf', 'category': '退票政策', 'author': 'Admin'}

六、常见问题与解决方案

6.1 NumPy版本不兼容问题

问题描述

复制代码
A module that was compiled using NumPy 1.x cannot be run in NumPy 2.4.0 as it may crash.

解决方案

bash 复制代码
pip install numpy<2

6.2 API密钥配置问题

问题描述

复制代码
初始化OpenAI客户端失败,请检查环境变量'DASHSCOPE_API_KEY'是否已设置。

解决方案

  1. 检查API密钥是否正确获取
  2. 确保环境变量已正确设置
  3. 或直接在代码中硬编码API密钥(不推荐用于生产环境)

6.3 FAISS安装问题

问题描述

复制代码
ERROR: Could not find a version that satisfies the requirement faiss_cpu

解决方案

bash 复制代码
pip install faiss-cpu

七、项目扩展建议

7.1 功能扩展

  1. 批量处理:优化代码以支持大规模文档的批量处理
  2. 索引持久化:将FAISS索引保存到磁盘,避免每次重启重新构建
  3. 多模态支持:扩展支持图像、音频等其他模态的数据
  4. 实时更新:实现向量索引的实时更新和增量添加

7.2 性能优化

  1. 使用GPU加速 :安装faiss-gpu版本,利用GPU加速向量搜索
  2. 索引类型选择:根据数据规模选择合适的FAISS索引类型(如IVF、HNSW等)
  3. 向量压缩:使用量化技术减小向量存储空间和加速搜索

八、总结

本项目展示了如何使用现代AI技术构建一个简单但功能完整的语义搜索系统。通过阿里云百炼Embedding API生成文本向量,结合FAISS实现高效的相似度搜索,我们可以轻松构建智能问答、文档检索等应用。

这个项目适合作为向量数据库和语义搜索领域的入门实战案例,通过学习和扩展,可以构建更复杂、更实用的AI应用系统。


关注作者:持续更新AI技术实战教程,分享最新技术动态和项目经验!

如果觉得有帮助,请点赞、收藏并关注,您的支持是我创作的最大动力!

相关推荐
张彦峰ZYF1 小时前
Java+Python双语言开发AI工具全景分析与选型指南
java·人工智能·python
张3蜂2 小时前
YOLOv8:下一代实时目标检测的全面解析
人工智能·yolo·目标检测
Java后端的Ai之路2 小时前
【AI大模型开发】-基于向量数据库的PDF智能问答系统(实战)
人工智能·pdf·向量数据库·智能问答系统
PeterClerk2 小时前
数据挖掘方向 CCF 期刊推荐(数据库 / 数据挖掘 / 内容检索)
数据库·人工智能·深度学习·数据挖掘·计算机期刊
乾元2 小时前
当奥本海默遇到图灵:AI 开启的网络安全新纪元
服务器·网络·人工智能·网络协议·安全·web安全
向量引擎2 小时前
2026年AI架构实战:彻底解决OpenAI接口超时与封号,Python调用GPT-5.2/Sora2企业级架构详解(附源码+压测报告)
人工智能·python·架构
木头程序员2 小时前
持续学习(Continual/Lifelong Learning)综述
大数据·人工智能·深度学习·机器学习
程途拾光1582 小时前
模型微调 vs 上下文学习的成本效益对比
人工智能·深度学习·机器学习
丝斯20112 小时前
AI学习笔记整理(51)——大模型之RAG优化技术
人工智能·笔记·学习