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

作者:Java后端的Ai之路日期:2026/1/19

向量数据库实战:基于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

1使用以下命令安装依赖:
2
3```bash
4pip install -r requirements.txt
5

2.2 配置API密钥

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

  1. 在阿里云控制台获取API密钥(DASHSCOPE_API_KEY)
  2. 设置环境变量:
    • Windows:
    1setx DASHSCOPE_API_KEY "your-api-key"  
    • Linux/Mac:
    1export DASHSCOPE_API_KEY="your-api-key"  

三、项目结构解析

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

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

四、核心功能实现

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

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

1import os
2from openai import OpenAI
3
4# 初始化OpenAI客户端(兼容模式)
5client = OpenAI(
6    api_key=os.getenv("DASHSCOPE_API_KEY"),
7    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
8)
9
10# 生成向量
11completion = client.embeddings.create(
12    model="text-embedding-v4",
13    input='我想知道迪士尼的退票政策',
14    dimensions=1024,  # 指定向量维度
15    encoding_format="float"
16)
17
18# 输出结果
19print(completion.model_dump_json())
20

关键参数说明:

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

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

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

4.2.1 系统架构
1文本数据  Embedding生成  向量存储(FAISS索引)
2                             
3查询文本  Embedding生成  向量相似度搜索  返回结果
4
4.2.2 核心功能模块

1. 初始化API客户端

1try:
2    client = OpenAI(
3        api_key=os.getenv("DASHSCOPE_API_KEY"),
4        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
5    )
6except Exception as e:
7    print("初始化OpenAI客户端失败,请检查环境变量'DASHSCOPE_API_KEY'是否已设置。")
8    print(f"错误信息: {e}")
9    exit()
10

2. 数据准备

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

3. 向量生成与存储

1metadata_store = []
2vectors_list = []
3vector_ids = []
4
5for i, doc in enumerate(documents):
6    try:
7        # 调用API生成向量
8        completion = client.embeddings.create(
9            model="text-embedding-v4",
10            input=doc["text"],
11            dimensions=1024,
12            encoding_format="float"
13        )
14        
15        # 获取向量
16        vector = completion.data[0].embedding
17        vectors_list.append(vector)
18        
19        # 存储元数据
20        metadata_store.append(doc)
21        vector_ids.append(i)
22        
23        print(f"  - 已处理文档 {i+1}/{len(documents)}")
24
25    except Exception as e:
26        print(f"处理文档 '{doc['id']}' 时出错: {e}")
27        continue
28
29# 转换为FAISS所需的NumPy格式
30vectors_np = np.array(vectors_list).astype('float32')
31vector_ids_np = np.array(vector_ids)
32

4. 构建FAISS索引

1dimension = 1024  # 向量维度
2
3# 创建基础索引
4index_flat_l2 = faiss.IndexFlatL2(dimension)
5
6# 使用IndexIDMap包装,支持自定义ID
7index = faiss.IndexIDMap(index_flat_l2)
8
9# 添加向量和ID到索引
10index.add_with_ids(vectors_np, vector_ids_np)
11

5. 语义搜索

1query_text = "我想了解一下迪士尼门票的退款流程"
2
3# 生成查询向量
4query_completion = client.embeddings.create(
5    model="text-embedding-v4",
6    input=query_text,
7    dimensions=1024,
8    encoding_format="float"
9)
10query_vector = np.array([query_completion.data[0].embedding]).astype('float32')
11
12# 搜索相似向量
13k = 3  # 返回前3个结果
14distances, retrieved_ids = index.search(query_vector, k)
15
16# 展示结果
17print("\n--- 搜索结果 ---")
18for i in range(k):
19    doc_id = retrieved_ids[0][i]
20    retrieved_doc = metadata_store[doc_id]
21    
22    print(f"\n--- 排名 {i+1} (相似度得分/距离: {distances[0][i]:.4f}) ---")
23    print(f"ID: {doc_id}")
24    print(f"原始文本: {retrieved_doc['text']}")
25    print(f"元数据: {retrieved_doc['metadata']}")
26

五、运行示例

5.1 运行基础向量生成

1python 1-embedding计算.py
2

输出结果示例:

1{
2  "data": [
3    {
4      "embedding": [0.0123, -0.0456, ...],
5      "index": 0,
6      "object": "embedding"
7    }
8  ],
9  "model": "text-embedding-v4",
10  "object": "list",
11  "usage": {
12    "prompt_tokens": 12,
13    "total_tokens": 12
14  }
15}
16

5.2 运行语义搜索系统

1python 2-embedding-faiss-元数据.py
2

输出结果示例:

1正在为文档生成向量...
2  - 已处理文档 1/4
3  - 已处理文档 2/4
4  - 已处理文档 3/4
5  - 已处理文档 4/4
6
7FAISS 索引已成功创建,共包含 4 个向量。
8
9正在为查询文本生成向量: '我想了解一下迪士尼门票的退款流程'
10
11--- 搜索结果 ---
12
13--- 排名 1 (相似度得分/距离: 0.3222) ---
14ID: 2
15原始文本: 对于在线购买的迪士尼门票,如果需要退票,必须在票面日期前48小时通过原购买渠道提交申请,并可能收取手续费。
16元数据: {'source': 'online_policy.html', 'category': '退票政策', 'author': 'E-commerceTeam'}
17
18--- 排名 2 (相似度得分/距离: 0.3312) ---
19ID: 0
20原始文本: 迪士尼乐园的门票一经售出,原则上不予退换。但在特殊情况下,如恶劣天气导致园区关闭,可在官方指引下进行改期或退款。
21元数据: {'source': 'official_faq_v1.pdf', 'category': '退票政策', 'author': 'Admin'}
22

六、常见问题与解决方案

6.1 NumPy版本不兼容问题

问题描述

1A module that was compiled using NumPy 1.x cannot be run in NumPy 2.4.0 as it may crash.
2

解决方案

1pip install numpy<2
2

6.2 API密钥配置问题

问题描述

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

解决方案

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

6.3 FAISS安装问题

问题描述

1ERROR: Could not find a version that satisfies the requirement faiss_cpu
2

解决方案

1pip install faiss-cpu
2

七、项目扩展建议

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技术实战教程,分享最新技术动态和项目经验!

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


【AI大模型开发】-基于FAISS的语义搜索系统(实战)》 是转载文章,点击查看原文


相关推荐


Claude Skills:Agent 能力扩展的新范式
清沫2026/1/11

为什么需要 Skills? 2025 年被称为智能体元年。各类 Agent、子 Agent、MCP 工具及自动化流水线迅速出现,让 AI 可以接手越来越多真实工作。比如 Claude Code 推出的 Agent 模块,或通过可视化平台、LangChain 开发的各种工具。 随着智能体功能增强,需要更具可组合性、可扩展性和可移植性的方法,为它们配备特定领域专业知识。这促使智能体 Skills 诞生:智能体可动态发现并加载包含指令、脚本和资源的文件夹,从而更好完成特定任务。 什么是 Skills?


2025年度总结之-如何构建 2025 专属的 GitHub AI 项目情报库
CoderJia_2026/1/3

背景 为什么做 为了更好地追踪 2025 年涌现的 AI 开源项目,我经常浏览 Github 热榜 并整理分享。但手动查阅难免会有遗漏,为此,我计划开发一套自动化工具来采集 Github 热榜数据,旨在辅助个人技术积累的同时,也为博客内容提供持续的素材来源。下文将详细介绍我的技术实现思路,若有设计不足之处,恳请各位读者指正。 如何制作 在该流程的初始阶段,核心任务是构建针对 GitHub 热榜(Trending)页面的数据采集机制。需要分别按照日(Daily)、周(Weekly)及月(M


从字符游戏到 CPU 指令集:一道算法题背后的深度思维跃迁
ToddyBear2025/12/24

"Simplicity is the ultimate sophistication." — Leonardo da Vinci 前言:很多时候,一道看似简单的算法题,不仅是代码能力的试金石,更是计算机底层思维的显微镜。本文记录了一次关于“查找 K-th 字符”问题的深度探讨。我们不满足于“做出来”,而是试图通过逆向工程,从直觉出发,推导出数学原理,最终触达硬件指令集的设计哲学。 🟢 第一部分:面试极速备忘录 (Executive Summary) 为了方便日后快速回顾(如面试前 5


5 分钟快速入门 Gitlab CI/CD
yuguo.im2025/12/16

🚀 快速掌握 GitLab CI/CD:自动化你的开发流程 GitLab CI/CD 是一个功能强大的工具,它内置于 GitLab 中,用于自动化你的软件构建、测试和部署流程。如果你希望提升开发效率、减少人为错误并实现持续集成/持续部署(CI/CD),那么掌握它至关重要。 本文将通过最核心的概念、最简单的配置,带你快速入门 GitLab CI/CD。 核心概念:理解 GitLab CI 的基石 在编写你的第一个配置文件之前,理解以下几个关键概念是掌握 GitLab CI 的前提: 1. 配置


这5个AI文本可视化工具太强了!一键把文本转信息图、流程图等多种可视化形式!PPT秒变高级!(建议收藏)
程序员X小鹿2025/12/8

大家好,我是X小鹿。 前几天被读者问到了「文本可视化」工具,趁着周末,整理了下之前体验过的几款还不错的 AI 工具。 这些 AI 工具都可以一键将枯燥的文本,转化为精美信息图、数据图、卡片等形式。 不管是在项目汇报中插入,还是用于 PPT 配图、文章配图、生成科普图文、读书笔记卡片、自媒体图文创作等场景,都是可以的。 下面分享 5 个目前国内外用得较多「文本可视化」工具。 有需要的可以保存下,早晚用得上~ 一、Seede AI 第一个,Seede AI,一款适合普通人上手的 AI 设计工具,国内


从客户端自适应码率流媒体迁移到服务端自适应码率流媒体
AKAMAI2025/11/28

流媒体平台需要扩展以容纳数百万在不同设备和网络条件下同时观看的观众,这使得高效的自适应码率(ABR)流媒体技术至关重要。在这篇博文中,我们将探讨从客户端 ABR 过渡到服务端 ABR 的技术细节,重点关注实现细节和性能优化。 如您所在的企业也在考虑采购云服务或进行云迁移, 点击链接了解Akamai Linode解决方案,现在申请试用可得高达500美元专属额度 自适应码率流媒体基础 自适应码率流媒体究竟是如何工作的?让我们一步步来看。首先,视频内容需要经过准备,即将其编码为多种码率(例如 5

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客