向量数据库实战:基于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密钥:
- 在阿里云控制台获取API密钥(DASHSCOPE_API_KEY)
- 设置环境变量:
- 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-v4input:要生成向量的文本内容dimensions:生成向量的维度,设置为1024encoding_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
解决方案:
- 检查API密钥是否正确获取
- 确保环境变量已正确设置
- 或直接在代码中硬编码API密钥(不推荐用于生产环境)
6.3 FAISS安装问题
问题描述:
1ERROR: Could not find a version that satisfies the requirement faiss_cpu 2
解决方案:
1pip install faiss-cpu 2
七、项目扩展建议
7.1 功能扩展
- 批量处理:优化代码以支持大规模文档的批量处理
- 索引持久化:将FAISS索引保存到磁盘,避免每次重启重新构建
- 多模态支持:扩展支持图像、音频等其他模态的数据
- 实时更新:实现向量索引的实时更新和增量添加
7.2 性能优化
- 使用GPU加速:安装
faiss-gpu版本,利用GPU加速向量搜索 - 索引类型选择:根据数据规模选择合适的FAISS索引类型(如IVF、HNSW等)
- 向量压缩:使用量化技术减小向量存储空间和加速搜索
八、总结
本项目展示了如何使用现代AI技术构建一个简单但功能完整的语义搜索系统。通过阿里云百炼Embedding API生成文本向量,结合FAISS实现高效的相似度搜索,我们可以轻松构建智能问答、文档检索等应用。
这个项目适合作为向量数据库和语义搜索领域的入门实战案例,通过学习和扩展,可以构建更复杂、更实用的AI应用系统。
关注作者:持续更新AI技术实战教程,分享最新技术动态和项目经验!
如果觉得有帮助,请点赞、收藏并关注,您的支持是我创作的最大动力!
《【AI大模型开发】-基于FAISS的语义搜索系统(实战)》 是转载文章,点击查看原文。