如何构建一个带自查询检索器的 RAG 系统

探索Vectara自查询检索器:如何构建智能的文本检索系统 Vectara提供的RAG即服务包括多个关键组件:文本提取、ML-based分片、Boomerang嵌入模型、内部向量数据库、自动编码查询的检索服务,以及基于检索文档进行生成性总结的LLM。这一切都通过简单易用的API进行管理。Vectara提供的RAG平台以及自查询检索器为用户提供了一种高效管理和检索文本数据的方式。通过结合LLM的智能分析能力,用户可以在多种场景下应用这一技术。对于希望深入探索这一领域的读者,推荐阅读Vectara的API文档以及LangChain的社区资源。 阅读详情

原文:towardsdatascience.com/how-to-build-a-rag-system-with-a-self-querying-retriever-in-langchain-16b4fa23e9ad?source=collection_archive---------0-----------------------#2024-04-25

RAG + 元数据过滤 = 极好的电影推荐 🍿

https://medium.com/@ed.izaguirre?source=post_page---byline--16b4fa23e9ad--------------------------------https://towardsdatascience.com/?source=post_page---byline--16b4fa23e9ad-------------------------------- Ed Izaguirre

·发表于 Towards Data Science ·阅读时间 12 分钟·2024 年 4 月 25 日

–

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f25989e1bd8f991ca2ce6d84a27ab9ef.png

电视观看者的图片。图片由 DALL·E 3 创建。

目录

  • 检索数据

  • 将文档上传到 Pinecone

  • 创建自查询检索器

  • 创建聊天模型

  • 演示

链接

最近,我在浏览 Max,试图找到一部电影观看。通常这包括浏览呈现给我的各种列表,阅读几个描述,然后挑选出听起来略微有趣的东西。有时候这是一个不错的选择,有时候则不尽如人意。如果我知道自己想看的电影标题或演员的名字,我通常才会使用搜索功能。否则,搜索功能就不太有用了。

我突然有了一个想法:为什么我不能使用自然语言,根据电影的氛围或内容来查询电影,而不仅仅是基于标题或演员呢?例如,为什么我不能打开 Max、Netflix 或 Hulu,然后在搜索栏中输入以下查询之一:

  • 帮我找一些英文的戏剧电影,时长不超过 2 小时,并且有宠物。

  • 推荐僵尸电影,但要确保它们是有趣的。

  • 我喜欢《瞬息全宇宙》。给我一部类似的电影,但更黑暗一些。

这种方法的美妙之处不仅仅在于提供了更自然的搜索电影方式。这种方法还保护了用户的隐私。这个系统完全不使用任何用户数据。所需的唯一内容就是一个查询。

所以我构建了电影搜索系统。这是一个基于 RAG(检索增强生成)的系统,它接收用户查询,将其嵌入并进行相似性搜索,找到类似的电影。但它不仅仅是一个普通的 RAG 系统。这个系统使用了所谓的自查询检索器。这使得在进行相似性搜索之前,能够通过电影的元数据对其进行筛选。所以,如果用户的查询是“推荐 1980 年后制作的恐怖电影,并且包含大量爆炸场面”,搜索会首先过滤掉所有不是“1980 年后制作的恐怖电影”的影片,然后再进行关于“包含大量爆炸场面”的相似性搜索。

在本文中,我将提供一个关于如何构建这个系统的高层次概述。如果你想深入了解,完整的代码可以通过上面的链接获取。

让我们深入探讨。

获取数据

这个项目的数据来自于The Movie Database (TMDB),并且得到了所有者的许可。他们的 API 简单易用,维护良好,并且限制不多。我从他们的 API 中提取了以下电影属性:

  • 片名

  • 片长(分钟)

  • 语言

  • 概述

  • 上映年份

  • 类型

  • 描述电影的关键词

  • 演员

  • 导演

  • 流媒体播放地点

  • 购买地点

  • 租赁地点

  • 制作公司列表

以下是如何使用 TMDB API 和 Python 的响应库提取数据的片段:

def get_data(API_key, Movie_ID, max_retries=5):
    """
    Function to pull details of your film of interest in JSON format.

    parameters:
    API_key (str): Your API key for TMBD
    Movie_ID (str): TMDB id for film of interest

    returns:
    dict: JSON formatted dictionary containing all details of your film of
    interest
    """

    query = 'https://api.themoviedb.org/3/movie/' + Movie_ID + \
        '?api_key='+API_key + '&append_to_response=keywords,' + \
            'watch/providers,credits'
    for i in range(max_retries):
        response = requests.get(query)
        if response.status_code == 429:
            # If the response was a 429, wait and then try again
            print(
                f"Request limit reached. Waiting and retrying ({i+1}/{
                    max_retries})")
            time.sleep(2 ** i)  # Exponential backoff
        else:
            dict = response.json()
            return dict

请注意,查询需要电影 ID(这些 ID 也是通过 TMDB 获得的),以及append_to_response,它允许我拉取多种类型的数据,例如关键词、观看提供者、信用信息(导演和演员)以及一些关于电影的基本信息。这里还包括一些基本的框架代码,以防我遇到速率限制,尽管我从未遇到过这种情况。

接下来,我们需要解析 JSON 响应。以下是一个片段,展示了如何解析参与电影制作的演员和导演信息:

credits = dict[‘credits’]
actor_list, director_list = [], []

# Parsing cast
cast = credits['cast']
NUM_ACTORS = 5
for member in cast[:NUM_ACTORS]:
    actor_list.append(member["name"])

# Parsing crew
crew = credits['crew']
for member in crew:
    if member['job'] == 'Director':
        director_list.append(member["name"])

actor_str = ', '.join(list(set(actor_list)))
director_str = ', '.join(list(set(director_list)))

请注意,我将每部电影的演员数量限制在前五名。我还必须指定只关心导演,因为响应中还包含了其他类型的工作人员,比如剪辑师、服装设计师等。

所有这些数据随后被汇总成了 CSV 文件。上面列出的每个属性都变成了一个列,而每一行现在代表一部特定的电影。以下是从2008_movie_collection_data.csv文件中提取的一小段电影数据,这个文件是通过编程生成的。在这个项目中,我大约获取了 1920 年至 2023 年间的 100 部顶级电影。

用于演示的电影数据片段。作者提供。

信不信由你,我至今还没有看过《功夫熊猫》。或许在这个项目之后我得去看一看。

上传文档到 Pinecone

接下来,我需要将 csv 数据上传到 Pinecone。在 RAG 系统中,通常需要对数据进行分块,但这里每个“文档”(CSV 文件中的一行)都相对较短,因此不需要分块。我首先将每个 CSV 文件转换为 LangChain 文档,然后指定哪些字段应该是主要内容,哪些字段应该是 metadata。

下面是用于构建这些文档的代码片段:

# Loading in data from all csv files
loader = DirectoryLoader(
    path="./data",
    glob="*.csv",
    loader_cls=CSVLoader,
    show_progress=True)

docs = loader.load()

metadata_field_info = [
    AttributeInfo(
        name="Title", description="The title of the movie", type="string"),
    AttributeInfo(name="Runtime (minutes)",
                  description="The runtime of the movie in minutes", type="integer"),
    AttributeInfo(name="Language",
                  description="The language of the movie", type="string"),
    ...
]

for doc in docs:
    # Parse the page_content string into a dictionary
    page_content_dict = dict(line.split(": ", 1)
                             for line in doc.page_content.split("\n") if ": " in line)

    doc.page_content = 'Overview: ' + page_content_dict.get(
        'Overview') + '. Keywords: ' + page_content_dict.get('Keywords')
    doc.metadata = {field.name: page_content_dict.get(
        field.name) for field in metadata_field_info}

    # Convert fields from string to list of strings
    for field in fields_to_convert_list:
        convert_to_list(doc, field)      

    # Convert fields from string to integers
    for field in fields_to_convert_int:
        convert_to_int(doc, field)

来自 LangChain 的DirectoryLoader负责将所有 csv 文件加载为文档。然后,我需要指定什么内容应该是page_content,什么内容应该是metadata。这是一个重要的决定。page_content将被嵌入并在检索阶段用于相似度搜索。metadata仅在相似度搜索之前用于过滤。 我决定将overview和keywords属性嵌入到page_content中,而其他属性则作为 metadata。进一步调整应考虑是否将title也包含在page_content中,但我发现这个配置对于大多数用户查询效果很好。

然后,文档需要上传到 Pinecone。这是一个相当直接的过程:

# Create empty index
PINECONE_KEY, PINECONE_INDEX_NAME = os.getenv(
    'PINECONE_API_KEY'), os.getenv('PINECONE_INDEX_NAME')

pc = Pinecone(api_key=PINECONE_KEY)

# Uncomment if index is not created already
pc.create_index(
    name=PINECONE_INDEX_NAME,
    dimension=1536,
    metric="cosine",
    spec=PodSpec(
        environment="gcp-starter"
    )
)

# Target index and check status
pc_index = pc.Index(PINECONE_INDEX_NAME)
print(pc_index.describe_index_stats())

embeddings = OpenAIEmbeddings(model='text-embedding-ada-002')

vectorstore = PineconeVectorStore(
    pc_index, embeddings
)

# Create record manager
namespace = f"pinecone/{PINECONE_INDEX_NAME}"
record_manager = SQLRecordManager(
    namespace, db_url="sqlite:///record_manager_cache.sql"
)

record_manager.create_schema()

# Upload documents to pinecome
index(docs, record_manager, vectorstore,
      cleanup="full", source_id_key="Website")

在这里,我只想强调几点:

  • 使用SQLRecordManager可以确保如果这段代码运行多次,重复的文档不会被上传到 Pinecone。如果文档被修改,只有该文档会在向量存储中被更新。

  • 我们使用的是 OpenAI 的经典text-embedding-ada-002嵌入模型。

创建自查询检索器

自查询检索器将允许我们通过之前定义的 metadata 过滤在 RAG 过程中检索的电影。这将大大提高我们电影推荐系统的实用性。

选择向量存储时,一个重要的考虑因素是确保它支持通过 metadata 进行过滤,因为并非所有向量存储都支持。这是 LangChain 支持自查询检索的数据库列表。另一个重要的考虑因素是每个向量存储允许哪些类型的比较器。比较器是我们通过 metadata 进行过滤的方法。例如,我们可以使用eq比较器来确保我们的电影属于科幻类型:eq('Genre', 'Science Fiction')。并非所有向量存储都允许所有比较器。作为例子,请查看Weaviate 中允许的比较器,以及它们与Pinecone 中的比较器的差异。我们需要告诉模型允许哪些比较器,以防止它意外地写出不允许的查询。

除了告诉模型存在哪些比较器,我们还可以给模型提供一些用户查询的示例和相应的筛选条件。这被称为少量样本学习,它对于帮助指导你的模型非常宝贵。

为了看看这有什么帮助,看看以下两个用户查询:

  • “推荐一些由约尔戈斯·兰西莫斯导演的电影。”

  • “类似于约尔戈斯·兰西莫斯电影的电影。”

对于我的元数据筛选模型来说,即使我希望它们被不同对待,也很容易为每个示例编写相同的筛选查询。第一个应该只返回由兰西莫斯导演的电影,而第二个则应该返回与兰西莫斯电影有相似氛围的电影。为了确保这种行为,我向模型提供了我期望的行为示例。语言模型的美妙之处在于,它们可以利用其“推理”能力和世界知识,从这些少量的示例中推广到其他用户查询。

document_content_description = "Brief overview of a movie, along with keywords"

        # Define allowed comparators list
        allowed_comparators = [
            "$eq",  # Equal to (number, string, boolean)
            "$ne",  # Not equal to (number, string, boolean)
            "$gt",  # Greater than (number)
            "$gte",  # Greater than or equal to (number)
            "$lt",  # Less than (number)
            "$lte",  # Less than or equal to (number)
            "$in",  # In array (string or number)
            "$nin",  # Not in array (string or number)
            "$exists", # Has the specified metadata field (boolean)
        ]

        examples = [
            (
                "Recommend some films by Yorgos Lanthimos.",
                {
                    "query": "Yorgos Lanthimos",
                    "filter": 'in("Directors", ["Yorgos Lanthimos]")',
                },
            ),
            (
                "Films similar to Yorgos Lanthmios movies.",
                {
                    "query": "Dark comedy, absurd, Greek Weird Wave",
                    "filter": 'NO_FILTER',
                },
            ),
            ...
        ]

        metadata_field_info = [
            AttributeInfo(
                name="Title", description="The title of the movie", type="string"),
            AttributeInfo(name="Runtime (minutes)",
                          description="The runtime of the movie in minutes", type="integer"),
            AttributeInfo(name="Language",
                          description="The language of the movie", type="string"),
            ...
        ]

        constructor_prompt = get_query_constructor_prompt(
            document_content_description,
            metadata_field_info,
            allowed_comparators=allowed_comparators,
            examples=examples,
        )

        output_parser = StructuredQueryOutputParser.from_components()
        query_constructor = constructor_prompt | query_model | output_parser

        retriever = SelfQueryRetriever(
            query_constructor=query_constructor,
            vectorstore=vectorstore,
            structured_query_translator=PineconeTranslator(),
            search_kwargs={'k': 10}
        )

除了示例,模型还必须了解每个元数据字段的描述。这有助于它理解可能的元数据筛选。

最后,我们构建我们的链条。这里的query_model是使用 OpenAI API 的 GPT-4 Turbo 实例。我建议使用 GPT-4 而不是 3.5 来编写这些元数据筛选查询,因为这是一个关键步骤,而 3.5 在这一点上更容易出错。search_kwargs={'k':10}告诉检索器根据用户查询拉取最相似的 10 部电影。

创建聊天模型

最后,在构建自查询检索器之后,我们可以在其基础上构建标准的 RAG 模型。我们从定义聊天模型开始。我称之为总结模型,因为它接受一个上下文(检索到的电影 + 系统消息),并以每个推荐的摘要进行回应。如果你想降低成本,可以使用 GPT-3.5 Turbo,或者如果你想要最好的结果,可以使用 GPT-4 Turbo。

在系统消息中,我告诉机器人它的目标是什么,并提供一系列建议和限制,其中最重要的是不要推荐任何没有通过自查询检索器提供的电影。在测试中,当用户查询没有从数据库中检索到电影时,我遇到了问题。例如,查询:*“推荐一些由马特·达蒙主演、韦斯·安德森导演的恐怖片,且是在 1980 年之前制作的”*会导致自查询检索器无法检索到任何电影(因为虽然听起来很棒,但这样的电影并不存在)。在没有电影数据的上下文中,模型会使用它自己的(错误的)记忆来尝试推荐一些电影。这种行为不好。我不希望 Netflix 推荐系统讨论数据库中不存在的电影。下面的系统消息成功阻止了这种行为。我确实注意到,GPT-4 比 GPT-3.5 更善于遵循指令,这是预期之中的。

chat_model = ChatOpenAI(
    model=SUMMARY_MODEL_NAME,
    temperature=0,
    streaming=True,
)

prompt = ChatPromptTemplate.from_messages(
    [
        (
            'system',
            """
            Your goal is to recommend films to users based on their 
            query and the retrieved context. If a retrieved film doesn't seem 
            relevant, omit it from your response. If your context is empty
            or none of the retrieved films are relevant, do not recommend films
            , but instead tell the user you couldn't find any films 
            that match their query. Aim for three to five film recommendations,
            as long as the films are relevant. You cannot recommend more than 
            five films. Your recommendation should be relevant, original, and 
            at least two to three sentences long.

            YOU CANNOT RECOMMEND A FILM IF IT DOES NOT APPEAR IN YOUR 
            CONTEXT.

            # TEMPLATE FOR OUTPUT
            - **Title of Film**:
                - Runtime:
                - Release Year:
                - Streaming:
                - (Your reasoning for recommending this film)

            Question: {question} 
            Context: {context} 
            """
        ),
    ]
)

def format_docs(docs):
    return "\n\n".join(f"{doc.page_content}\n\nMetadata: {doc.metadata}" for doc in docs)

# Create a chatbot Question & Answer chain from the retriever
rag_chain_from_docs = (
    RunnablePassthrough.assign(
        context=(lambda x: format_docs(x["context"])))
    | prompt
    | chat_model
    | StrOutputParser()
)

rag_chain_with_source = RunnableParallel(
    {"context": retriever, "question": RunnablePassthrough()}
).assign(answer=rag_chain_from_docs)

format_docs 用于格式化呈现给模型的信息,以便它易于理解和解析。我们将 page_content(概述和关键词)以及 metadata(所有其他电影属性)同时呈现给模型;任何它可能需要的信息,以便更好地向用户推荐电影。

rag_chain_from_docs 是一个链条,它接受检索到的文档,通过 format_docs 格式化,然后将格式化后的文档输入模型上下文中,模型基于这些内容回答问题。最后,我们创建了 rag_chain_with_source,这是一个 RunnableParallel,顾名思义,它同时执行两个操作:自查询检索器去检索相似的文档,而查询则通过 RunnablePassthrough() 直接传递给模型。然后,来自并行组件的结果被组合,rag_chain_from_docs 用来生成答案。这里的 source 指的是检索器,它访问所有的‘源’文档。

因为我希望答案是逐步流式传输的(例如,像 ChatGPT 一样逐块展示给用户),我们使用以下代码:

for chunk in rag_chain_with_source.stream(query):
    for key in chunk:
        if key == 'answer':
            yield chunk[key]

演示

现在是有趣的部分:与模型互动。如前所述,Streamlit 被用来创建前端并托管应用程序。我在这里不讨论 UI 的代码;有关实现的详细信息,请参见原始代码。它相当直接,而且在Streamlit 网站上有很多其他示例。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/02b3a62862751b327a753fd250ba3e74.png

电影搜索界面。作者提供。

有几个建议可以使用,但让我们尝试我们自己的查询:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7ad4d1b3125c7faf549f71d8c1afbacf.png

示例查询和模型响应。作者提供。

在后台,自查询检索器确保过滤掉任何非法语的电影。然后,它执行了一个“成长故事”的相似性搜索,结果是上下文中有十部电影。最后,摘要机器人选择了五部电影进行推荐。请注意推荐的电影范围:一些电影的上映日期早至 1959 年,最晚的为 2012 年。为了方便起见,我确保机器人包括电影的片长、上映年份、流媒体提供商,以及由机器人精心制作的简短推荐。

(附注:如果你还没有看过 400 击,立刻停下你正在做的事情,去 立即观看。)

在大型语言模型中,通常被视为负面的特性,比如其响应的非确定性,现在变成了积极的。你如果向模型问同一个问题两次,可能会得到略有不同的推荐。

需要注意当前实现的一些限制:

  • 不支持保存推荐。用户可能希望重新访问以前的推荐。

  • 手动更新来自电影数据库的原始数据。将其自动化并每周更新一次是一个不错的主意。

  • 自查询检索中的元数据过滤不准确。例如,查询“Ben Affleck films”可能会出现问题。这可能指的是由本·阿弗莱克主演的电影,或者是由本·阿弗莱克执导的电影。这是一个需要澄清查询的例子。

对这个项目的可能改进之一是在检索后进行文档重新排序。还可以有一个聊天模型,可以进行多轮对话,而不仅仅是一个问答机器人。还可以创建一个推荐代理,如果查询不明确,可以向用户提出澄清问题。

玩得开心,搜索电影吧!

从零构建:基于BM25与LangChain的自查询检索器实战指南 本文详细介绍了如何从零构建基于BM25与LangChain的自查询检索器,结合传统关键词匹配与语义理解技术,提升信息检索的准确率和效率。通过实战指南,开发者可以学习环境搭建、数据准备、BM25策略定制及自查询检索器的实现与优化,适用于电商搜索、知识库问答等场景。 阅读详情

相关推荐

改进RAG:自查询检索

每日推荐一篇专注于解决实际问题的外文,精准翻译并深入解读其要点,助力读者培养实际问题解决和代码动手的能力。

HJ_blog 934

TowardsDataScience 2024 中文翻译(七十二)

遗传算法的美妙之处在于它们直接受到自然的启发,特别是自然选择的过程:自然选择是指通过选择性地繁殖基因型或遗传构成的变化,使得生物体能够适应其环境的过程 [1]。更广泛地说,自然选择是进化的主要机制之一。我对这个机制感到着迷,它在数百万年的时间里改变了自然界。更令人兴奋的是,我们可以通过遗传算法利用自然选择的力量。遗传算法模拟了自然选择在非自然环境中的过程,通常类似于商业资源优化。然而,它的应用并不限于这些类型的用例。

龙哥盟 1101

LangChain实战(八):Retrievers - 构建智能检索器

本文深入探讨LangChain中的检索器(Retrievers)模块,详细介绍其核心功能和实现方法。检索器作为RAG应用的核心组件,通过get_relevant_documents(query)方法连接用户查询与知识库,具有抽象化、标准化、灵活性和智能化等特点。文章从基础向量检索器入手,展示如何配置检索参数和搜索类型(如相似度、MMR、阈值过滤),进而介绍多源集成的高级检索器,包括多查询检索器、混合检索器和多向量检索器。最后还讲解了父文档检索器等高级应用场景,为构建高效智能检索系统提供全面指导。

厚积薄发的博客 1197

langchain从入门到精通——RAG优化策略自查询检索器实现动态数据过滤

本文介绍了RAG应用中的自查询检索器(SelfQueryRetriever)技术,用于动态过滤检索数据。当用户提问隐含筛选条件时(如"2023年AI新闻"),传统相似性搜索无法识别这些条件。自查询检索器通过LLM解析自然语言,自动生成元数据过滤器,从而提高检索精度。文章以Pinecone数据库为例,展示了如何设置带元数据的文档、定义可过滤字段,并使用SelfQueryRetriever包装检索过程。该技术特别适合结构化数据领域(如财报、新闻),能有效提取查询中的隐含条件,生成结构化检索请

AI_today的博客 1874

(17-6-06)检索增强生成(RAG):自查询检索器

(1)构建查询:当用户提交一个自然语言查询时,自我查询检索器使用一个查询构建链(通常是一个大型语言模型,如OpenAI的GPT系列)来解析和理解查询的意图。这些元数据字段信息是构建自我查询检索器时的重要部分,因为它们允许检索器理解文档的结构和内容,并根据用户的自然语言查询构建有效的搜索条件。(4)设置自查询检索器(SelfQueryRetriever)的元数据字段信息的一部分,定义了与电影相关的几个关键属性,这些属性将用于构建查询和过滤条件,以便在检索过程中精确地找到匹配的文档。

码农三叔 4455

LLMs之RAG:LangChain框架实现RAG系统所涉及的几十种检索器的简介、适应场景、部分代码实战案例集合之详细攻略

​ LLMs之RAG:LangChain框架实现RAG系统所涉及的几十种检索器的简介、适应场景、部分代码实战案例集合之详细攻略 目录 LangChain框架实现RAG系统所涉及的几十种检索器的简介 基于LangChain框架各种检索器案例代码实战 LangChain框架实现RAG系统所涉及的几十种检索器的简介 1、LangChain框架的各种检索器概览 源码地址:retrievers — 🦜🔗 LangChain documentation Retriever 名称 简介

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 1246

释放你的元数据:使用 Elasticsearch 的自查询检索器

了解如何使用 Elasticsearch 的 “self-quering” 检索器来通过结构化过滤器提高语义搜索的相关性。在人工智能搜索的世界中,在海量的数据集中高效地找到正确的数据至关重要。传统的基于关键词的搜索在处理涉及自然语言的查询时往往会失效,这时就需要语义搜索了。然而,如果你想将语义搜索的功能与过滤日期和数字值等结构化元数据的能力结合起来,那么自查询检索器(self-querying retrievers)就可以发挥作用了。 自查询检索器提供了一种强大的方法来利用元数据进行更精确、更细致

Elastic 中国社区官方博客 1780

MS17-010(Eternal blue永恒之蓝)漏洞利用+修复方法

msf永恒之蓝漏洞复现过程以及修复建议

记录学习 8512

改进 RAG:自查询检索

改进 RAG:自查询检索

安静的软件工程师 1186

【Lane】 Ultra-Fast-Lane-Detection 复现

引言 车道线检测源码复现以及训练自己的数据集 1 环境搭建 conda create -n lane python=3.7 conda activate lane # 激活环境 conda install pytorch torchvision cudatoolkit=10.1 -c pytorch pip install -r requirements.txt 2 下载项目源码 若在服务器上可以用指令下载,否则直接在网址中下载 git clone https://github.com/cfzd/U

qq_44703886的博客 2万+

麒麟信安3.3-6C电网版虚拟机安装避坑指南:从ISO下载到SSH配置全流程

本文提供麒麟信安3.3-6C电网版虚拟机的详细安装与配置指南。针对电力行业仿真测试需求,重点解析从ISO镜像获取、虚拟机环境准备、安装过程中的三大“雷区”(如多管理员密码逻辑、分区方案、网络配置)到首次启动后的网络、SSH及root策略配置的全流程避坑要点,帮助技术人员高效、安全地完成部署。

rainy的博客 854

langchain从入门到精通(三十二)——RAG优化策略(八)自查询检索器实现动态数据过滤

在这段 原始提问 中,如果执行相应的向量数据库相似性搜索,其实是附加了 筛选条件 的,即 year=2023,但是在普通的相似性搜索中,是不会考虑 2023 年这个条件的(因为没有添加元数据过滤器,2022年和2023年数据在高维空间其实很接近),存在很大概率会将其他年份的数据也检索出来。接下来使用特定的转换器,将生成的查询语句转换成适配向量数据库的 过滤器,并在检索时传递该参数,从而完成自查询构建的全过程,不同的向量数据库对应的转换器差异也非常大。这个思想其实就是 查询构建 或者称为 自查询。

swpucwf的博客 951

MDT部署实战:除了Office,这些“装机必备”软件也能一键静默安装(含静默参数)

本文详细介绍了如何利用Microsoft Deployment Toolkit(MDT)实现企业级软件的静默安装,包括浏览器、开发工具和系统增强工具等“装机必备”软件的部署方案。通过命令行参数和MSI属性,IT运维团队可以高效构建标准化工作环境,提升部署效率并确保版本一致性。文章还提供了安装顺序控制、结果验证和常见问题排错等高级技巧。

weixin_26985923的博客 172

收藏!小白也能掌握的RAG高级技巧:自查询检索器让AI更懂你的提问

本文介绍RAG应用中的查询构建与自查询检索器技术,通过LLM将用户提问中的隐式筛选条件转换为元数据过滤器,提高检索准确性。文章详细讲解了SelfQueryRetriever的实现原理、使用方法及在不同数据库类型中的应用,并探讨了将LLM输出与企业应用对接的思路及注意事项,帮助开发者提升大模型检索系统的精准度。

Androiddddd的博客 726

OpenCV实例(一)人脸检测

计算机视觉使很多任务成为现实,其中两项任务就是人脸检测(在图像中定位人脸)和人脸识别(将人脸识别为特定的人)。OpenCV实现了一些人脸检测和识别的算法。从安全到娱乐,这些技术在现实环境中都有应用。介绍OpenCV的一些人脸检测和识别功能,并定义特定类型的可跟踪物体的数据文件。具体来说,将研究Haar级联分类器,通过分析相邻图像区域之间的对比度,确定给定图像或子图像是否与已知类型匹配。

小幽余生不加糖 5004

会计引擎:交易与核算分离的前世今生

一、为什么需要会计引擎 金融产品的设计,一如一块硬币需要兼顾两面:一面是为客户提供好的金融服务,满足客户支付结算、借贷、资产保值增值等方面的需求,并在这个过程中,以数字化的方式做好客户资产的登记,登记的载体,则是“分户”或“台账”,如客户存款户,是一种典型的分户--资金的增减变化都在一个账户中进行体现,而客户购买的银行理财,因为收益率、期限、投资标的不同,每一笔持有就形成一行记录,即为“台账”--这当然是不严谨但相对形象的表述。但是,“分户”和“台账”并没有必然的区别,以贷款为例,一些银行仍然存在所谓“

银行信息系统应用架构详解 985

【一起来学AI大模型】RAG系统组件:检索器(LangChain)

摘要: 检索器(Retriever)是RAG系统的核心组件,负责从知识库中检索与用户查询相关的信息。LangChain框架提供了模块化的检索器实现,包括基础向量检索器(VectorStoreRetriever)、多路融合检索器(EnsembleRetriever)、智能解析查询的自查询检索器(SelfQueryRetriever)以及优化结果的上下文压缩检索器(ContextualCompressionRetriever)。这些检索器支持灵活配置(如搜索算法、元数据过滤等),并与向量数据库(如ChromaD

hhhhuuuu_的博客 1723

静态编译Qt5源码(Kylin-Desktop-V10-SP1-2203-LoongArch64+qt5.15.16)

之前的文档,记录的是通用情况,本次笔者记录下Qt5的静态编译过程,供有需要的小伙伴参考使用的操作系统是Kylin-Desktop-V10-SP1-General-Release-2203-LoongArch64,处理器是龙芯3A5000,架构是loongarch。

aggs1990的专栏 1402

提升你的 RAG 的高级检索技术

原文:towardsdatascience.com/advanced-retriever-techniques-to-improve-your-rags-1fac2b86dd61?

龙哥盟 1138

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

使用Vectara的自查询检索器构建强大的AI助手

文本提取功能:支持从PDF、PPT、DOCX等文件中提取文本。ML分块技术:提供先进的文本分块性能。Boomerang嵌入模型:支持文本嵌入的生成与存储。向量数据库:存储文本分块及其对应的嵌入向量。查询服务:自动将查询编码为嵌入,并检索最相关的文本片段。LLM生成摘要:基于检索到的文档生成总结,包括引用。通过结合使用Vectara和LangChain,我们可以快速创建一个智能的自查询检索系统,极大提升信息获取的效率。要深入了解更多内容,请参阅以下资源。

saghthefs的博客 379

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

什么自查询?为什么在 RAG 中需要自查询?

自查询(Self-Query)是一种增强RAG系统检索能力的技术,通过将自然语言查询分解为语义内容和元数据过滤器两部分,提高检索精度。它能有效处理结构化数据(如日期、评分等),减少无关结果,支持复杂查询条件。工作流程包括查询解析、向量检索和结构化过滤。相比传统RAG,自查询在电商、文档管理、学术检索等场景中表现更优,能更准确地理解用户意图,返回更相关的结果。代码示例展示了如何利用LangChain实现自查询功能。

weixin_45422672的博客 906

RAG检索性能提升实践:混合检索与自查询技术详解

在RAG(检索增强生成)系统中,检索性能直接影响着最终的生成质量。本文将深入探讨两种先进的检索优化技术:混合检索和自查询检索。这些技术能显著提升检索的准确性和灵活性,为RAG系统带来实质性的性能提升。

瓦罗兰特顶级C位的博客 1541

Elasticsearch:BM25 及 使用 Elasticsearch 和 LangChain 的自查询检索器

本工作簿演示了 Elasticsearch 的自查询检索器将非结构化查询转换为结构化查询的示例,我们将其用于 BM25 示例。在这个例子中:如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考文章:如果你还没有安装好自己的 Elasticsearch 及 Kibana,那么请参考一下的文章来进行安装:如何在 Linux,MacOS 及 Windows 上进行安装 ElasticsearchKibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中

Elastic 中国社区官方博客 5649

RAG检索性能提升实践:混合检索与自查询技术详解。大模型入门到精通,收藏这篇就足够了!

本文将深入探讨两种先进的检索优化技术:混合检索和自查询检索。这些技术能显著提升检索的准确性和灵活性,为RAG系统带来实质性的性能提升。

瓦罗兰特顶级C位的博客 1087
上一篇: 如何构建一个 Graph RAG 应用
下一篇: 如何构建一个语义搜索引擎来搜索表情符号
绝不原创的飞龙
绝不原创的飞龙 优质创作者: 人工智能、数据科学与机器学习技术领域 优质创作者: 人工智能、数据科学与机器学习技术领域
博客等级 码龄15年 4万+粉丝 2万+原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值