前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >构建自然语言搜索引擎

构建自然语言搜索引擎

作者头像
杜逸先
发布于 2023-12-25 02:03:14
发布于 2023-12-25 02:03:14
44500
代码可运行
举报
运行总次数:0
代码可运行

近期简单学习了一下向量数据库 qdrant 与 sentence-transformers 库,两者结合可以构建一个简单的自然语言搜索引擎。顺着官方的教程实操了一遍之后,稍微调整一番,我在中文数据集上构建了一个自然语言搜索引擎。

数据采集

教程中的数据集是一些美国的初创公司的数据(来自 startups-list.com),我打算自己从互联网上采集一些中文数据集,正好近期一直在使用微信读书,决定采集微信读书平台上计算机分类下的书籍数据。

观察了微信读书网页版的请求之后,我发现可以通过 ‘https://weread.qq.com/web/bookListInCategory/{type}?maxIndex={maxIndex}‘ 获取指定分类下的书籍列表。 在实验过程中,我发现即使分类下有更多的书籍,maxIndex 超过 480 之后就不再返回新的数据了,这应该是微信读书官方的一些限制。不过计算机分类下一共有七个子分类,每个分类都采集四百多本书籍,总共有 3000 多本书籍,也足够使用了。

首先定义一个函数用于获取制定分类指定页数的书籍列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
url = 'https://weread.qq.com/web/bookListInCategory/'
def fetch_page(param):
    type, page = param
    _url = f"{url}{type}?maxIndex={page*20}"
    resp = requests.get(_url)
    return resp.json()["books"]

为了提高采集的效率,我创建了一个线程池用于批量执行采集任务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from itertools import product
with ThreadPoolExecutor(max_workers=10) as executor:
    pages = list(
        executor.map(
            fetch_page,
            product(
                [700001, 700002, 700003, 700004, 700005, 700006, 700007],
                range(1, 25),
            ),
        )
    )

books = []
for page in pages:
    books.extend(page)

最终的执行时间是 11 秒,相当不错的速度。

数据处理

参考教程里的流程,我使用 pandas 进行了初步的数据处理,并用 sentence-transformers 库生成书籍描述的向量表示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sentence_transformers import SentenceTransformer
import numpy as np
import pandas as pd

model = SentenceTransformer(
    "paraphrase-multilingual-MiniLM-L12-v2", device="cuda"
)

df = pd.DataFrame([book['bookInfo'] for book in books])

vectors = model.encode(
    [row.title + ". " + row.author + "." + row.intro for row in df.itertuples()],
    show_progress_bar=True,
)

vectors.shape  # (3244, 384)

np.save("wx_books.npy", vectors, allow_pickle=False)

使用 qdrant 持久化向量数据

终于到了 qdrant 的环节,这里简单介绍一下 qdrant(内容来自 Microsoft Copilot)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Qdrant 是一个开源的向量数据库和向量相似度搜索引擎,用 Rust 语言编写,可以快速、可靠地存储和搜索任意维度的向量,支持多种距离度量,如余弦、欧氏、曼哈顿等。Qdrant 可以用于构建基于语义嵌入或神经网络编码器的匹配、搜索、推荐等 AI 应用。

Qdrant 的主要特点有:

- 易于使用的 API,提供 OpenAPI v3 规范,可以生成几乎任何编程语言的客户端库,或者使用现成的 Python 或其他语言的客户端。
- 快速和准确,采用一种独特的自定义修改的 HNSW 算法进行近似最近邻搜索,具有最先进的速度,并且可以在不影响结果的情况下应用搜索过滤器。
- 可过滤,支持与向量关联的额外负载,不仅存储负载,而且还允许根据负载值过滤结果。与 Elasticsearch 的后过滤不同,Qdrant 保证检索到所有相关的向量。
- 丰富的数据类型,向量负载支持多种数据类型和查询条件,包括字符串匹配、数值范围、地理位置等。负载过滤条件允许你构建几乎任何应该在相似度匹配之上工作的自定义业务逻辑。
- 分布式,支持云原生和水平扩展。无论你需要服务多少数据,Qdrant 都可以使用合适的计算资源。
- 高效,有效地利用你的资源。完全用 Rust 语言开发,实现了动态查询规划和负载数据索引。硬件感知的构建也可用于企业。

参照官方文档的指导,我使用 docker 部署了一个 qdrant 服务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -d -p 6333:6333 -v $(pwd)/qdrant_data:/data qdrant/qdrant

客户端使用的是官方提供的 python sdk。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install qdrant-client

创建集合

连接到 qdrant 服务之后,创建一个集合用于存储书籍数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from qdrant_client import QdrantClient
from qdrant_client.models import VectorParams, Distance

qdrant_client = QdrantClient("http://localhost:6333")

qdrant_client.recreate_collection(
    collection_name="wx_books",
    vectors_config=VectorParams(size=384, distance=Distance.COSINE),
)

这里指定了向量的维度为 384,距离度量方法为余弦相似度。

导入数据

接下来使用 upload_collection 方法,将书籍详情与向量数据导入到 qdrant 中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# vectors = np.load("./wx_books.npy")
# books = json.load(open("./wx_books.json", "r", encoding="utf-8"))

qdrant_client.upload_collection(
    collection_name="wx_books",
    vectors=vectors,
    payload=(book['bookInfo'] for book in books),
    ids=None,  # Vector ids will be assigned automatically
    batch_size=256,  # How many vectors will be uploaded in a single request?
)

这三千多条书籍数据的导入在我本地花费了 2 秒钟左右,速度还是很快的。

构建搜索引擎

这里可以完全照搬官方教程,创建一个 NeuralSearcher 类,用于在 qdrant 集合中进行自然语言搜索。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# search.py

from qdrant_client import QdrantClient
from sentence_transformers import SentenceTransformer


class NeuralSearcher:
    def __init__(self, collection_name):
        self.collection_name = collection_name
        # Initialize encoder model
        self.model = SentenceTransformer(
            "paraphrase-multilingual-MiniLM-L12-v2", device="cpu"
        )
        # initialize Qdrant client
        self.qdrant_client = QdrantClient("http://localhost:6333")

    def search(self, text: str):
        # Convert text query into vector
        vector = self.model.encode(text).tolist()

        # Use `vector` for search for closest vectors in the collection
        search_result = self.qdrant_client.search(
            collection_name=self.collection_name,
            query_vector=vector,
            query_filter=None,  # If you don't want any filters for now
            limit=5  # 5 the most closest results is enough
        )
        # `search_result` contains found vector ids with similarity scores along with the stored payload
        # In this function you are interested in payload only
        payloads = [hit.payload for hit in search_result]
        return payloads

接下来使用 FastAPI 创建一个简单的接口,用于接收用户的查询请求。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# api.py
from fastapi import FastAPI

# The file where NeuralSearcher is stored
from search import NeuralSearcher

app = FastAPI()

# Create a neural searcher instance
neural_searcher = NeuralSearcher(collection_name="wx_books")


@app.get("/api/search")
def search_startup(q: str):
    return {"result": neural_searcher.search(text=q)}


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8000)

效果

定义一个 search 函数用来测试搜索服务的效果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def search(q: str):
    resp = requests.get(f"http://localhost:8000/api/search?q={q}")
    for book in resp.json()['result']:
        print(f'{book["title"]} - {book["author"]}')
        print(book['intro'][:50])
        print()

既然主打的是自然语言搜索,查询条件可以不用太简单(例如“AI”,“C++”等关键词。)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
search("初学者如何入门机器学习")

机器学习入门:数学原理解析及算法实践 - 董政
本书面向初学者,介绍了机器学习的基本方法,循序渐进的阐述了其中的数学原理,让读者能够知其然,然后知其

机器学习:Python实践 - 魏贞原
本书系统地讲解了机器学习的基本知识,以及在实际项目中使用机器学习的基本步骤和方法;详细地介绍了在进行

机器学习实践指南:案例应用解析 - 麦好
《机器学习实践指南:案例应用解析》是机器学习及数据分析领域不可多得的一本著作,也是为数不多的既有大量

机器学习:使用OpenCV、Python和scikit-learn进行智能图像处理(原书第2版) - 阿迪蒂亚·夏尔马 维什韦什·拉维·什里马利 迈克尔·贝耶勒
本书通过具体的编程实践案例,全面系统地讲述了机器学习涉及的核心内容。首先介绍新特性以及安装OpenC

机器学习 - 赵卫东 董亮
机器学习是人工智能的重要技术基础,涉及的内容十分广泛。本书内容涵盖了机器学习的基础知识,主要包括机器
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
search("我想了解生成式人工智能(AIGC)")

AIGC未来已来 - 翟尤 郭晓静 曾宣玮
AIGC(Artificial Intelligence Generated Content)中文译

人工智能基础与进阶(第二版) - 周越编著
人工智能是一门发展极其迅速且内容丰富的学科,其众多分支领域都值得大家去探索和学习。本书分为基础篇和进

人工智能(AI)应用从入门到精通 - 苏秉华 吴红辉 滕悦然编著
《人工智能(AI)应用从入门到精通》是一本人工智能应用入门级读物,全书分基础篇和应用篇两个部分。基础

人工智能简史 - 尼克
本书全面讲述人工智能的发展史,几乎覆盖人工智能学科的所有领域,包括人工智能的起源、自动定理证明、专家

生成式AI:人工智能的未来 - 詹姆斯·斯金纳
一本书全面了解生成式AI的发展与创作能力,并为我所用。20世纪60年代,AI的概念就被提出,其商业应

可以看到整体效果还是不错的。

总结

受益于 qdrant 和 sentence-transformers 这两个库,我们可以很方便地构建一个简单的自然语言搜索引擎,提供给用户更加自然的搜索体验。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
快速上手 LiteLLM:打造高效、稳定、面向生产的 LLM 应用程序
LiteLLM 是一个 Python 库,旨在简化多种大型语言模型(LLM)API 的集成。通过支持来自众多提供商的超过 100 种 LLM 服务,它使用户能够使用标准化的 OpenAI API 格式与这些模型进行交互。提供商包括 Azure、AWS Bedrock、Anthropic、HuggingFace、Cohere、OpenAI、Ollama 和 Sagemaker 等主要品牌。
汀丶人工智能
2025/05/21
2020
快速上手 LiteLLM:打造高效、稳定、面向生产的 LLM 应用程序
.NET 原生驾驭 AI 新基建实战系列(四):Qdrant ── 实时高效的向量搜索利器
向量数据库作为一种专为现代AI应用设计的新型存储技术,能够高效地管理和检索高维数据,成为智能应用开发中的关键基础设施。本文将深入探讨 Qdrant 这个开源、高性能的向量数据库,重点介绍其如何与 .NET 生态系统结合,为开发者提供强大的工具支持。
AI.NET 极客圈
2025/04/22
2010
.NET 原生驾驭 AI 新基建实战系列(四):Qdrant  ── 实时高效的向量搜索利器
【RAG落地利器】向量数据库Qdrant使用教程
通过 http://localhost:6333/dashboard 地址访问web ui
致Great
2025/01/19
3620
【RAG落地利器】向量数据库Qdrant使用教程
基于GPT3.5实现本地知识库解决方案-利用向量数据库和GPT向量接口-实现智能回复并限制ChatGPT回答的范围
标题有点长,但是基本也说明出了这篇文章的主旨,那就是利用GPT AI智能回答自己设置好的问题
唯一Chat
2023/03/25
6.8K0
基于GPT3.5实现本地知识库解决方案-利用向量数据库和GPT向量接口-实现智能回复并限制ChatGPT回答的范围
使用Sentence Transformers和Faiss构建语义搜索引擎
介绍 您是否曾经想过如何使用Sentence Transformers创建嵌入向量,并在诸如语义文本相似这样的下游任务中使用它们在本教程中,您将学习如何使用Sentence Transformers和Faiss构建一个基于向量的搜索引擎。代码地址会在本文的最后提供 为什么要构建基于向量的搜索引擎? 基于关键字的搜索引擎很容易使用,在大多数情况下工作得很好。你要求机器学习论文,他们会返回一堆包含精确匹配或接近变化的查询结果,就像机器学习一样。其中一些甚至可能返回包含查询的同义词或出现在类似上下文中的单词的结
deephub
2020/11/17
2.5K0
使用Sentence Transformers和Faiss构建语义搜索引擎
Chroma: 引领AI本地向量数据库的新潮流,向量数据库看这篇足够了
在前面的文章我们简单介绍了下什么是向量数据库,用比较生动的三原色的概念进行了类别,可以回顾下之前的文章。
一个程序猿的异常
2023/12/26
3.6K0
Chroma: 引领AI本地向量数据库的新潮流,向量数据库看这篇足够了
向量检索(RAG)之向量数据库研究
研究内容主要包括:是否开源,支持的功能有哪些(是否支持暴力检索,支持哪些索引),是否有可视化界面,是否支持标量过滤。
码之有理
2025/03/05
1.1K0
谷歌发大招:搜索全面AI化,不用关键词就能轻松“撩书”
新智元报道 来源:Google Research 【新智元导读】昨天,谷歌发布“Talk to Books”(撩书??)和一个名为Semantris的游戏。这两项都是基于自然语言文本理解,用户能够凭语义而非关键词来实现搜索功能。这些创新来源于“在向量空间中表示语言”想法的延伸,以及词向量模型的发展。 未来的搜索,可能不需要输入关键词,直接表达想法就好。 谷歌昨晚放出大招:上线Semantic Experiences(语义体验)网站,网站有两项特殊功能,一个是“Talk to Books”(撩书?
新智元
2018/04/18
6930
谷歌发大招:搜索全面AI化,不用关键词就能轻松“撩书”
人人都可参与的AI技术体验:谷歌发布全新搜索引擎Talk to Books
选自Research.Google 作者:Ray Kurzweil 机器之心编译 参与:路、张倩、李泽南 作为搜索引擎起家的科技巨头,谷歌曾推出过很多有意思的搜索工具。昨天,这家公司的研究机构发布了一款基于人工智能的搜索引擎,该实验项目可以让普通人也能感受最新语义理解和自然语言处理技术的强大能力:它们是目前人工智能技术发展的重要方向。值得一提的是,《奇点临近》一书的作者,谷歌研究院工程总监雷·库兹韦尔也参与了这一工作。 项目链接:https://research.google.com/semanticex
机器之心
2018/05/08
7990
人人都可参与的AI技术体验:谷歌发布全新搜索引擎Talk to Books
使用 Llama3 和 Ollama 改进了 RAG
在本文中,我们将创建一个高级 RAG,它将根据作为管道输入给出的研究论文来回答用户查询。用于构建该管道的技术堆栈如下。
IT大咖说
2024/04/24
1.3K0
使用 Llama3 和 Ollama 改进了 RAG
【RAG落地利器】向量数据库Weaviate部署与使用教程
Weaviate 是一种开源的向量搜索引擎数据库,允许以类属性的方式存储 JSON 文档,并将机器学习向量附加到这些文档上,以在向量空间中表示它们。Weaviate 支持语义搜索、问答提取、分类等功能,并且可以通过 GraphQL-API 轻松访问数据。
致Great
2025/01/23
1.7K0
【RAG落地利器】向量数据库Weaviate部署与使用教程
RAG 架构中的向量数据库与文档嵌入:核心原理与实例解析
在人工智能领域,检索增强生成(Retrieval-Augmented Generation,RAG)是一种结合了检索(Retrieval)与生成(Generation)的方法,旨在提高语言模型的准确性和可靠性。向量数据库是 RAG 架构的关键组成部分,它使得模型能够存储、检索和使用外部知识,从而提升文本生成的质量和准确性。
编程小妖女
2025/02/09
6490
RAG 架构中的向量数据库与文档嵌入:核心原理与实例解析
谷歌发布全新搜索引擎Talk to books
谷歌作为全球最大搜索引擎公司,发布过很多有趣项目。近日,谷歌又上线了一个名为“Semantic Experiences”(语义体验)的网站,包含了Talk to Books和“Semantris“两个项目,前者是一款基于人工智能的书籍搜索引擎,用户不用像以往的搜索方式,键入书名,作者等关键词,而是可以用书中的某个句子搜索到目标书籍,而后者是一个基于机器学习驱动的单词联想游戏。这两项功能是基于自然语言文本的理解,而语义理解正是人工智能技术发展的重要方向,谷歌希望通过这两个项目让普通人也能感受最新语义理解和自然语言处理技术的强大能力。此外,谷歌还发布了论文《Universal Sentence Encoder》,详细地介绍了这些示例所使用的模型。并提供了一个预训练语义 TensorFlow 模块。
刀刀老高
2018/07/24
1K0
谷歌发布全新搜索引擎Talk to books
AI应用开发基础教程_借助LangChain来调用ChatGPT_API
最准确的模型text-embedding-ada-002可以非常便宜地使用,所以我认为您很少会使用其他模型。(费用为每1000个标记0.0001美元,几乎是免费的)
yeedomliu
2023/10/20
1.4K0
AI应用开发基础教程_借助LangChain来调用ChatGPT_API
大模型结合知识库问答应用第一次实践(下)
记录一次用大模型LLM和向量数据库,搭建垂直领域的知识库问答实践。上文已经介绍了文本如何转换成向量,存储到向量数据库中。本文将介绍大语言模型LLM+提示工程+向量数据库作为背景知识,回答用户的提问。
用户9295575
2024/09/11
2380
矢量数据库与LLM的集成:实践指南
通常,LLM会在各种各样的数据上进行训练,这使它们具有广泛的理解能力,但可能会导致在特定的知识领域存在差距。有时,它们甚至可能产生与目标无关或带有偏见的信息——这是从广阔但未经筛选的web学习的副产品。为了解决该问题,我们引入了向量数据库(Vector Database)的概念。这些数据库以一种称为"向量嵌入"的独特格式存储数据,可以让LLMs掌握和使用的信息更连贯和准确。
charlieroro
2024/03/16
4320
矢量数据库与LLM的集成:实践指南
向量数据库Chroma极简教程
向量数据库其实最早在传统的人工智能和机器学习场景中就有所应用。在大模型兴起后,由于目前大模型的token数限制,很多开发者倾向于将数据量庞大的知识、新闻、文献、语料等先通过嵌入(embedding)算法转变为向量数据,然后存储在Chroma等向量数据库中。当用户在大模型输入问题后,将问题本身也embedding,转化为向量,在向量数据库中查找与之最匹配的相关知识,组成大模型的上下文,将其输入给大模型,最终返回大模型处理后的文本给用户,这种方式不仅降低大模型的计算量,提高响应速度,也降低成本,并避免了大模型的tokens限制,是一种简单高效的处理手段。此外,向量数据库还在大模型记忆存储等领域发挥其不可替代的作用。
Rude3Knife的公众号
2023/11/08
2.2K0
向量数据库Chroma极简教程
AI大模型全栈工程师课程笔记 - RAG 检索增强生成
课程学习自 知乎知学堂 https://www.zhihu.com/education/learning
Michael阿明
2023/12/09
1.6K0
AI大模型全栈工程师课程笔记 - RAG 检索增强生成
AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
在当今这个数据爆炸的时代,信息的快速存储与高效检索已经成为技术领域的核心挑战。随着人工智能(AI)和机器学习(ML)的迅猛发展,向量存储和相似性搜索技术逐渐崭露头角,成为处理海量数据的利器。对于使用 .NET 的开发者来说,掌握这些技术不仅意味着能够开发出更智能、更高效的应用,更是在信息洪流中保持竞争力的关键。借助向量存储,我们可以将复杂的数据(如文本、图像或音频)转化为高维向量,通过相似性搜索快速找到与查询最相关的内容,从而大幅提升信息检索的精度和效率。
AI.NET 极客圈
2025/03/20
1850
AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
将分布式系统转换为可嵌入的库有多难?
最近,我在开发一个本地 RAG/LLM 应用,需要支持语义搜索。实际上,作为一款本地应用,它可能产生的嵌入(embeddings)数量相对有限,很难超过百万级别。因此,在项目初期,一个简单幼稚的遍历匹配方法就足以应对需求。然而,我还是希望能够一步到位,找到一个支持 HNSW 索引的嵌入式向量数据库(关于 HNSW 索引的详细信息,请参考我之前的文章)。
tyrchen
2023/12/20
3510
将分布式系统转换为可嵌入的库有多难?
推荐阅读
相关推荐
快速上手 LiteLLM:打造高效、稳定、面向生产的 LLM 应用程序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档