您是否曾经搜索过“古老的黑白喜剧”却被现代动作片的轰炸所困扰?令人沮丧,对吧?这就是传统搜索引擎面临的挑战——它们常常难以理解我们查询的细微差别,让我们费力地浏览不相关的结果。
这就是智能过滤的用武之地。它是一个游戏规则改变者,它使用元数据和矢量搜索来提供真正符合您意图的搜索结果。想象一下,轻松找到您渴望的经典喜剧。
我们将深入了解智能过滤是什么、它是如何工作的,以及为什么它对于构建更好的搜索体验至关重要。让我们揭开这项技术背后的魔力,并探索它如何彻底改变您的搜索方式。
矢量搜索是一种强大的工具,可以帮助计算机理解数据背后的含义,而不仅仅是单词本身。它不是匹配关键字,而是关注底层概念和关系。想象一下搜索“狗”并获得包括“小狗”、“犬”甚至狗的图像的结果。这就是矢量搜索的魔力!
它是如何运作的?嗯,它将数据转换为称为向量的数学表示形式。这些向量就像地图上的坐标,相似的数据点在这个向量空间中距离更近。当您搜索某些内容时,系统会找到最接近您的查询的向量,为您提供语义相似的结果。
虽然矢量搜索在理解上下文方面非常出色,但在执行简单的过滤任务时有时会表现不佳。例如,查找 2000 年之前发行的所有电影需要精确的过滤,而不仅仅是语义理解。这就是智能过滤可以补充矢量搜索的地方。
虽然矢量让我们更接近于理解查询的真正含义,但用户想要的和搜索引擎提供的之间仍然存在差距。像“2000 年之前最早的喜剧电影”这样的复杂搜索查询仍然是一个挑战。语义搜索可能会理解“喜剧”和“电影”的概念,但可能会难以理解“最早”和“2000 年之前”的具体细节。
这就是结果开始变得混乱的地方。我们可能会混合新旧喜剧,甚至是错误包含的戏剧。为了真正满足用户,我们需要一种方法来细化这些搜索结果并使其更加精确。这就是预过滤器发挥作用的地方。
智能过滤是应对这一挑战的解决方案。这是一种使用数据集的元数据创建特定过滤器、优化搜索结果并使其更加准确和高效的技术。通过分析有关数据的信息(例如其结构、内容和属性),智能过滤可以识别相关条件来过滤您的搜索。
想象一下搜索“2000 年之前上映的喜剧电影”。智能过滤将使用流派、发行日期等元数据,甚至可能是情节关键字来创建仅包含符合这些条件的电影的过滤器。这样,您就可以获得您想要的内容的列表,而不会产生无关的噪音。
让我们在下一节中更深入地了解智能过滤的工作原理。
智能过滤是一个多步骤过程,涉及从数据中提取信息、分析信息以及根据您的需求创建特定的过滤器。让我们来分解一下:
元数据提取:第一步是收集有关数据的相关信息。这包括以下详细信息:
预过滤器生成:一旦获得元数据,您就可以开始创建预过滤器。这些是数据必须满足才能包含在搜索结果中的特定条件。例如,如果您要搜索 2000 年之前发行的喜剧电影,您可以为以下内容创建预过滤器:
与矢量搜索集成:最后一步是将这些预过滤器与矢量搜索相结合。这可确保矢量搜索仅考虑符合您预定义条件的数据点。
通过执行这些步骤,智能过滤可显着提高搜索结果的准确性和效率。
元数据提取:为了简化事情,我们将使用示例数据并手动定义元数据。请参阅: prepare_test_data.py
中的 get_docs_metadata 。
预过滤器生成:我们将分两步生成预过滤器。
第 1 步:基于元数据的过滤器
该步骤包括基于元数据生成过滤器。我们将把用户查询和元数据传递给 LLM 并生成元数据过滤器。
我们将使用使用此 DEFAULT_SCHEMA_PROMPT 初始化的 query_constructor。
注意:根据您的用例更新提示和一些镜头示例。
例如:如果元数据有genre
和release_date
,并且用户要求2020年之前发布的action
类型电影,那么我们可以使用LLM生成如下过滤器:
{"$and": [{"genre": {"$in": ["anime"]}}, {"release_date": {"$lt": "2024-01-01"}}]}
第 2 步:基于时间的过滤
在这一步中,我们将处理用户请求latest
、 most recent
、 earliest
类型信息的情况。我们必须查询实际数据才能获取此信息。我们将在此步骤中使用LLM代理来使用执行器工具查询mongodb集合:QueryExecutorMongoDBTool我们在generate_time_based_filter中生成基于时间的过滤器。我们还将在聚合阶段的$match
中使用第一步生成的pre_filter。例如:如果用户想要最新的电影,LLM代理将使用执行器工具运行以下聚合查询:
Invoking: `mongo_db_executor` with `{'pipeline': '[{"$match": {"$and": [{"genre": {"$in": ["anime"]}}, {"release_date": {"$lt": "2024-01-01"}}]}}, { "$sort": { "release_date": -1 } }, { "$limit": 1 }, { "$project": { "release_date": 1 } }]'}`
与矢量搜索集成:生成的预过滤器将与 MongoDBAtlasVectorSearch 检索器一起使用:
retriever = vectorstore.as_retriever(
search_kwargs={ ' pre_filter ' : pre_filter}
)
创建新的python环境
python3 -m venv env
source env/bin/activate
安装要求
pip3 install -r requirements.txt
在config.yaml中设置配置
database_name: < your database name >
collection_name: < your collection name >
vector_index_name: default
embedding_model_dimensions: 1536
similarity: cosine
model: gpt-4o
embedding_model: text-embedding-ada-002
设置环境变量
export OPEN_AI_API_KEY = " "
export OPEN_API_BASE = " "
# headers are optional
export OPEN_API_DEFAULT_HEADERS= " "
export MONGO_URI= " "
使用示例数据初始化 mongodb 集合。此命令将索引一些示例数据,并在集合上创建向量搜索索引。
python3 rag/initialize_mongo_collection.py
python3 rag/main.py --queries < list of queries in json format >
python3 rag/main.py --queries ' ["I want to watch an anime genre movie", "Recommend a thriller or action movie release after Feb, 2010", "Recommend an anime movie released before 2023 with the latest release date"] '
生成的 Pre_filters:
输入查询: "I want to watch an anime genre movie", "Recommend a thriller or action movie release after Feb, 2010"
输出:
输入查询: "Recommend a thriller or action movie release after Feb, 2010"
输出:
输入查询: "Recommend an anime movie released before 2023 with the latest release date"
输出:
智能过滤为表格带来了许多优势,使其成为增强搜索体验的宝贵工具:
提高搜索准确性:通过精确定位与查询匹配的数据,智能过滤极大地增加了找到相关结果的可能性。不再费力地浏览不相关的信息。
更快的搜索结果:由于智能过滤缩小了搜索范围,系统可以更有效地处理信息,从而更快地获得结果。
增强的用户体验:当用户快速轻松地找到他们正在寻找的内容时,就会带来更高的满意度和更好的整体体验。
多功能性:智能过滤可以应用于从电子商务产品搜索到内容推荐的各个领域,使其成为一种多功能工具。
通过利用元数据并创建有针对性的预过滤器,智能过滤使您能够提供真正满足用户期望的搜索结果。
智能过滤是一个强大的工具,可以通过弥合用户意图和结果之间的差距来改变体验。通过利用元数据和矢量搜索的力量,它可以提供更准确、相关和高效的搜索结果。
无论您是构建电子商务平台、内容推荐系统还是任何依赖于有效搜索的应用程序,结合智能过滤都可以显着提高用户满意度并带来更好的结果。
通过了解智能过滤的基础知识,您可以探索其潜力并在您的项目中实施。那为什么还要等呢?立即开始利用智能过滤的强大功能,彻底改变您的搜索游戏!
灵感来自 LangChain 的自助查询检索器。