基于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 json

os.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 编写搜索脚本

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"
)

Settings.llm = None

print("📂 正在加载数据...")
from llama_index.core import Document
import json
import os

documents = []
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"]))

print("🏗️ 正在构建向量索引...")
index = VectorStoreIndex.from_documents(documents)

print("🔍 创建查询引擎...")
query_engine = index.as_query_engine(similarity_top_k=2) # 返回最相似的2个结果

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二周预习报告(AI)

AI对学习内容的总结 使用AI工具: 腾讯元宝 (https://yuanbao.tencent.com/) 总结内容: 本周学习聚焦于C语言高级特性、对称密码算法实现及密码学编码格式。 Head First C第8章:静态与动态库核心思想: 代码复用与模…

编写代码时遇到的checkstyle问题归纳

当开发者编写代码时,遵循一定的代码风格和规范是必要的,这不仅有助于提高代码质量,也使代码更易于阅读和维护。Checkstyle 是一个用于检查Java源代码的工具,它帮助开发者按照一定的编码标准进行编程。它可以集成在…

.netcore的Lucene.Net基础应用

.netcore的Lucene.Net基础应用最近研究了一下使用.netcore的Lucene.Net应用,整理一下研究内容。 一、研究原因 1、系统环境:多终端、多服务、达梦数据库8、.netcore7.0、多机负载。 2、业务数量:单表1000万条数据,…

rook-ceph CRD资源配置时效困难

rook-ceph CRD资源配置时效困难2025-09-20 16:05 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importa…

实用指南:conda常见问题

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

关于1200模拟量输入滤波的问题

参考:为什么使用S7-1200模拟量输入模块时接收到变动很大的不稳定的值?unstable 参考:关于模拟量输入滤波的问题-SIMATIC S7-1500系列-找答案-西门子中国滤波周期设置和模拟量输入反馈速率有关!!! 调整为无时,可…

在Ubuntu 16.04上安装openjdk-6/7/8-jdk的步骤

由于Ubuntu 16.04的标准库可能不包含更早版本的OpenJDK,你可能需要添加额外的存储库或者下载特定的安装包。对于OpenJDK的这些旧版本,你可以使用Third-party PPA(个人软件包归档),或者从OpenJDK档案站点下载相应的…

物流行业信息咨询智能问答系统

物流行业信息咨询智能问答系统2025-09-20 15:58 dribs 阅读(0) 评论(0) 收藏 举报背景 练手rag项目 LLM都是基于过去的经验数据进行训练完成;无法处理获取实时的信息,需结合RAG实现;处理私域的数据 流程原理项目…

插座(SOCKET)

程序用来“上网说话”的工具。1:什么是套接字? 应用程序与网络协议栈之间进行数据收发的编程接口(API) 2.如何理解? 应用程序需要套接字才能接入网络,与其他计算机上的程序进行通信(插座---->电器需要插入插…

线性代数 行列式 | 子式 / 主子式 / 顺序主子式 / 余子式 / 代数余子式 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Red Hat 8.5.0-18 部署ceph文件系统 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

kettle从入门到精通 第108课 ETL之kettle 国产麒麟系统安装kettle教程

场景:最近vip群小伙伴在国产麒麟系统安装kettle时遇到无法正常启动的问题,今天周末远程连麦小伙伴一起解决此问题,梳理成章,方便后续小伙伴。 1、报错信息 国产麒麟系统安装kettle时遇到无法正常启动,提示错误信息…

部署 Squid 代理服务

安装 Squid: sudo apt install squid编辑配置文件: sudoedit /etc/squid/squid.confhttp_port 3128启动 Squid 服务 sudo systemctl start squid sudo systemctl enable squid

k8s--etcd - 详解

k8s--etcd - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Cou…

HBase 的自带命令行工具 hbase shell 的基本使用

1. 进入 HBase Shell 首先,通过以下命令连接到您的 HBase 集群命令行界面: hbase shell 连接成功后,提示符会变为 hbase(main):001:0>,表示您已经可以在里面执行 HBase 专属命令了。 2. 查看集群状态和表列表(…

市场交易反心理特征之一:太过完美而不敢买入

市场交易的最大特点就是“反心理”性。经常盘后看起来非常简单的事情,在盘前、盘中都会变得莫名复杂。明明盘前根据自己的交易策略可以轻松选出的牛股,开盘后没买,买了另一个,结果牛股涨停,买的票要么下跌,要么不…

3peak DCDC转换芯片选型列表

Part Number Subcategory VIN (V) Output (V) Max Output Current (A) PackageTPE15017 以太网供电 24~57 / / QFN3X4-19TPM1525 功率级DrMOS 7~140 / 1 SOP8TPM6501 隔离电源 2.5~25 / 1 SOT23-5TPM6501Q 隔离电源 2.…

重塑公司绩效管理的 6 种方法

有远见的公司开始了解绩效管理的真正潜力。通过将传统绩效管理转变为持续绩效管理——建立在定期签到、持续反馈和认可时刻的基础上——公司可以通过让员工发挥最大潜力来优化绩效。 1、通过真实和积极的文化建立信任基…

详细介绍:从“下山”到AI引擎:全面理解梯度下降(上)

详细介绍:从“下山”到AI引擎:全面理解梯度下降(上)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&…

flask下的MySQL增删改查

flask下的MySQL增删配置 添加数据 @app.route(/add) def add_data():u = UserInfo()new_user1 = UserInfo(nickname=flask_test1, mobile=13888888888, signature=理想, create_time=datetime.now(), role_id=1)new_us…