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

如何用faiss强化基于mysql的文本检索

mysql支持基于like的关键字匹配,具备强大的文本检索功能。

然而,当检索问题或关键词与存储的文本差异较大时,like类字符匹配就不能有效发挥作用。

比如,“查询校园绿化方面的规定”,然而数据库中可能仅有“校园花卉种植管理规范”等文档。

虽然绿植和花卉语义一致,但在这种场景下like关键词匹配可能不好发挥作用。

这里尝试基于faiss,采用向量检索的方式,强化mysql的文本检索能力。

1 faiss介绍

1.1 faiss介绍

faiss是Facebook研究院开发的一种高效的相似搜索和聚类库,能够快速处理大规模数据,支持在高维空间进行相似性搜索。

faiss建立vector库过程,即把候选向量集封装成一个index数据库,不需要开发即可实现topk的相似检索过程。

1.2 faiss安装

为简化分析,这里采用conda方式安装,假设conda环境已经创建。

conda install -c pytorch faiss-cpu

pip install faiss-cpu==1.7.2

pip install faiss仅安装一个faiss-cpu的壳子。

如果要正常运行,还需要安装faiss-cpu实体模块,这里采用conda安装。

2 向量检索示例

2.1 测试数据

这里新闻数据库中title字段表示的内容,示例如下所示。

candidates = ['领益智造:打造AI终端硬件制造平台','领益智造在智能手机与人形机器人领域的创新','领益智造积极布局通信和汽车业务','领益智造的投资前景与风险提示','领益智造:打造AI终端硬件制造平台','领益智造在智能手机与人形机器人领域的创新','领益智造积极布局通信和汽车业务','领益智造的投资前景与风险提示','贝斯特:精密机加工领域的隐形冠军','贝斯特:直线滚动功能部件打开新成长空间','贝斯特:精密机加工领域的隐形冠军','光大同创把握折叠屏手机市场机遇,推动新材料创新应用','科技2025展望:AI算力需求与服务器创新引领市场','智能手机市场2025年展望:AI驱动换机周期,创新升级用户体验','AR/VR与汽车电子:AI眼镜与智能化趋势引领未来','公用行业发电量及建议关注板块','全国能源工作会议关注特高压与核电投资','特高压建设提速,柔直项目渗透率上升','核电发展空间有望打开,多重催化助力成长','新能源车与储能行业12月展望:政策助力,电车储能高歌猛进','谷歌Willow量子芯片重大突破,量子计算商业化加速在即','博通ASIC业务超预期,配套网络通信设备迎来新机遇','一汽吉林产品研发未跟上市场节奏,陷入经营困境',
]

2.2 faiss检索

from langchain.agents.agent_toolkits import create_retriever_tool
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_ollama import OllamaEmbeddingsembeddings = OllamaEmbeddings(model="bge-m3")vector_db = FAISS.from_texts(candidates, embeddings)
retriever = vector_db.as_retriever(search_kwargs={"k": 3})
print(retriever.invoke("AI算力需求"))

faiss检索输出如下

[Document(id='8d90e6b6-7e81-4a2b-910f-384dfc4c7c98', metadata={}, page_content='科技2025展望:AI算力需求与服务器创新引领市场'), Document(id='ce8905ae-95c8-43af-b7c7-5bcdcc96809a', metadata={}, page_content='领益智造:打造AI终端硬件制造平台'), Document(id='3b19ded6-578f-40f3-8be2-6fc7dd8cb049', metadata={}, page_content='领益智造:打造AI终端硬件制造平台')]

3 mysql + faiss

由于语义搜索方面的优势,这里尝试用向量检索,替代like关键词检索,确定待检索文档,然后再营业sql检索。

3.1 构建向量库

假设我们想为news表的title字段构建faiss向量库。

运行如下sql,收集数据库中所有tag为news的新闻title。

select title from news where tag=“news”;

将所有收集的title存储为candidates,id则用candidates下标表示,范围从0到len(candidates)-1。

运行如下代码狗讲向量库,减速入口为vector_store。

from langchain.agents.agent_toolkits import create_retriever_tool
from langchain_community.vectorstores import FAISS
from langchain_community.docstore.in_memory import InMemoryDocstore
from langchain_openai import OpenAIEmbeddings
from langchain_ollama import OllamaEmbeddings
from langchain_core.documents import Documentembeddings = OllamaEmbeddings(model="bge-m3")
index = faiss.IndexFlatL2(len(embeddings.embed_query("hello world")))vector_store = FAISS(embedding_function=embeddings,index=index,docstore= InMemoryDocstore(),index_to_docstore_id={}
)documents = []
ids = []for i, content in enumerate(candidates):documents.append(Document(page_content=content, metadata={"source": "title"}))ids.append(str(i))vector_store.add_documents(documents=documents, ids=ids)

3.2 向量库检索

需要注意的是,document的id对应的就是title在原始candidates中的位置。

根据id即可对应到原始candidates中title的位置下标。

针对三种不同的场景,这里尝试三种检索方式:过滤检索、score检索、retriefver检索。

1)过滤检索

query = "特高压建设"results = vector_store.similarity_search(query=query,k=1,filter={"source": "title"})
for doc in results:print(f"* id={doc.id}  {doc.page_content} [{doc.metadata}]")

 2)score检索

results = vector_store.similarity_search_with_score(query=query,k=1)
for doc, score in results:print(f"* [SIM={score:3f}] id={doc.id} {doc.page_content} [{doc.metadata}]")

3)retriever检索

retriever = vector_store.as_retriever(search_type="mmr",search_kwargs={"k": 1, "fetch_k": 2, "lambda_mult": 0.5},
)
retriever.invoke(query)

3.3 搜索数据库

构建如下select检索sql,这里id_candidates即为向量检索获得到的文档id列表。

select title, content from news where id in choosen_candidates

附录

import faiss报错

ModuleNotFoundError: No module named 'faiss'

pip install faiss-cpu==1.7.2后依然报错

conda install -c pytorch faiss-cpu后问题解决

reference

---

faiss

https://github.com/facebookresearch/faiss

基于langgraph agent的SQL DB知识库系统

https://blog.csdn.net/liliang199/article/details/153317678

向量数据库-Faiss详解

https://zhuanlan.zhihu.com/p/671776778

查询向量存储

https://python.langchain.ac.cn/docs/integrations/vectorstores/faiss/

langchain_community.vectorstores.faiss.FAISS

https://api.python.langchain.com/en/latest/vectorstores/langchain_community.vectorstores.faiss.FAISS.html

向量数据库-Faiss详解

https://zhuanlan.zhihu.com/p/671776778

http://www.dtcms.com/a/577685.html

相关文章:

  • C++面试4-线程同步
  • 【LeetCode热题100(62/100)】搜索二维矩阵
  • 并发编程、锁、线程池知识整理<1>
  • 11种方法解决iPhone上共享相册不显示的问题[2025]
  • php网站制作教程美食网站开发的技术简介
  • Spring整合单元测试
  • 深入浅出理解克尔效应(Kerr Effect)及 MATLAB 仿真实现
  • 【区块链】二、案例1:汽车供应链区块链
  • 影刀RPA一键批量上传商品视频!AI智能处理,效率提升2000%[特殊字符]
  • 安卓/IOS工具开发基础教程:按键精灵一个简单的文字识别游戏验证
  • Python爬虫实战:澳元-人民币汇率历史数据获取与趋势分析
  • 网站开发属于大学那个专业网页设计题材
  • 图书馆网站建设的项目报告网站svg使用
  • 基于大数据的短视频流量数据分析与可视化
  • OT83211_VC1:4通道 ASRC OTG(44.1kHz~192kHz)音频采样率转换器产品介绍
  • 性能测试需求分析详解
  • Redis-面试问题
  • 小型网站开发用什么语言大型h5手游平台
  • 徐州网站建设工作室中国建筑官网首页
  • MyBatis注解的运用于条件搜索实践
  • 搭建网站 软件下载吴忠市建设局官方网站
  • 工厂方法模式:从理论到实战指南
  • 微信小程序 点击地图后弹出一个模态框
  • 3.6.6【2021统考真题】
  • 《道德经》第五十章
  • 分类问题的基石:逻辑回归(Logistic Regression)
  • 机器学习实践项目(二)- 房价预测增强篇 - 特征工程二
  • Jenkins自动部署CI/CD
  • 【unity】PowerVR GE8320系列GPU渲染问题分析
  • 做网站设计需要哪些知识网页游戏排行榜回合制