当前位置: 首页 > news >正文

基于LlamaIndex的相似性搜索

🌟 引言:为什么需要“相似性搜索”?

在信息爆炸的时代,我们每天面对大量文档、笔记、技术手册、会议记录……如何快速从自己的“知识库”中找到最相关的内容?

传统关键词搜索(如 Ctrl+F)已经不够用了 —— 它无法理解语义。比如你搜索“对心脏好的水果”,它不会返回“香蕉富含钾元素,有益心脏健康”。

这时候,语义相似性搜索(Semantic Similarity Search) 就派上用场了。

而今天,我们将使用 LlamaIndex —— 一个专门为 LLM 应用构建数据管道的 Python 框架 —— 来搭建一个本地运行、无需 API Key 的智能搜索系统!


🧰 一、准备工作

1.1 什么是 LlamaIndex?

LlamaIndex(原名 GPT Index)是一个连接自定义数据源与大语言模型(LLM)的框架。它擅长将文档切块、向量化、建立索引,并支持高效语义检索。

官网:https://www.llamaindex.ai/

1.2 为什么选它?

  • ✅ 支持本地嵌入模型(如 HuggingFace),无需 OpenAI Key
  • ✅ 简洁 API,几行代码即可构建搜索系统
  • ✅ 支持多种数据源:TXT、PDF、Markdown、数据库等
  • ✅ 可扩展性强,轻松接入 Chroma、FAISS、Qdrant 等向量库

🚀 二、实战:构建一个简洁版本的相似性搜索引擎

2.1 安装依赖

pip install llama-index llama-index-embeddings-huggingface### 2.2 准备演示数据
这里使用脚本创建 ./data/ 目录,放入3 个JSON文件:import os
import jsonos.makedirs("data", exist_ok=True)docs = {"data/doc1.json": {"id": 1,"content": "苹果是一种常见的水果,富含维生素C和纤维。它有助于消化和增强免疫力。每天吃一个苹果,医生远离我。","metadata": {"source": "doc1.json"}},"data/doc2.json": {"id": 2,"content": "香蕉是热带水果,含有丰富的钾元素,有助于维持心脏健康和肌肉功能。香蕉也常被运动员作为能量补充食品。","metadata": {"source": "doc2.json"}},"data/doc3.json": {"id": 3,"content": "橙子酸甜可口,是冬季最受欢迎的水果之一。它含有大量维生素C,可以预防感冒,促进胶原蛋白合成。","metadata": {"source": "doc3.json"}}
}for filename, data in docs.items():with open(filename, 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=4)print("✅ 3个演示数据文件(JSON格式)已生成在 ./data/ 目录下")### 2.3 编写搜索脚本# llama_index_demo.py
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings# 设置嵌入模型(本地免费模型)
Settings.embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L6-v2"
)# 禁用 LLM(避免依赖 OpenAI)
Settings.llm = None# 1. 加载数据
print("📂 正在加载数据...")
from llama_index.core import Document
import json
import osdocuments = []
for filename in os.listdir("./data"):if filename.endswith(".json"):with open(os.path.join("./data", filename), "r", encoding="utf-8") as f:data = json.load(f)documents.append(Document(text=data["content"], metadata=data["metadata"]))# 2. 构建向量索引
print("🏗️  正在构建向量索引...")
index = VectorStoreIndex.from_documents(documents)# 3. 创建查询引擎
print("🔍 创建查询引擎...")
query_engine = index.as_query_engine(similarity_top_k=2)  # 返回最相似的2个结果# 4. 执行相似性搜索
queries = ["哪种水果富含维生素C?","运动员适合吃什么水果补充能量?","对心脏有益的水果是什么?"
]for i, query in enumerate(queries, 1):print(f"\n--- 查询 {i}: {query} ---")response = query_engine.query(query)print("💬 回答:", str(response))# 打印参考来源(可选)print("📄 参考来源:")for node in response.source_nodes:print(f"  - {node.node.text[:100]}...")print("\n✅ 演示完成!")## 三、运行结果展示
![image](https://img2024.cnblogs.com/blog/3705917/202509/3705917-20250920160930349-1080150132.png)
http://www.hskmm.com/?act=detail&tid=10771

相关文章:

  • 第二周预习报告(AI)
  • 编写代码时遇到的checkstyle问题归纳
  • .netcore的Lucene.Net基础应用
  • 关于1200模拟量输入滤波的问题
  • 在Ubuntu 16.04上安装openjdk-6/7/8-jdk的步骤
  • yoloV8
  • 插座(SOCKET)
  • kettle从入门到精通 第108课 ETL之kettle 国产麒麟系统安装kettle教程
  • 部署 Squid 代理服务
  • k8s--etcd - 详解
  • HBase 的自带命令行工具 hbase shell 的基本使用
  • 市场交易反心理特征之一:太过完美而不敢买入
  • 3peak DCDC转换芯片选型列表
  • 重塑公司绩效管理的 6 种方法
  • 详细介绍:从“下山”到AI引擎:全面理解梯度下降(上)
  • flask下的MySQL增删改查
  • tips图解数组名与指针的关系
  • mysql查看数据库大小,可以通过查询系统表来实现
  • TPP21206替代MPQ8633,12A电流同步降压DCDC
  • 组件重新装载时 useSWR 会发起请求
  • kettle插件-kettle数据清洗插件,轻松处理脏数据
  • 中二
  • web应用程详解part1
  • Seedream 4.0 简直绝了!
  • 财务管理NPV与IRR投资分析在IT行业案例
  • 优化sigmoid
  • mysql查询死锁,mysql查询死锁方法
  • 【IEEE出版、已连续5届稳定快速EI检索】第六届计算机工程与智能控制学术会议(ICCEIC 2025)
  • 软工第二次作业之个人项目——论文查重
  • 对实体类Id自增