如何执行代理信息检索

如何执行代理信息检索

原文:如何执行代理信息检索

信息检索 是一个重要的任务,对于实现今天大量可用内容至关重要。例如,每次你在 Google 搜索某事或向 ChatGPT 提出一个问题的答案时,就是一个信息检索任务。你正在搜索的信息可能是文档的封闭数据集或整个互联网。

在本文中,我将讨论代理信息查找,涵盖信息检索随着 LLM 的发布而发生的改变,特别是随着 AI 代理的兴起,这些代理比我们之前看到的更擅长查找信息。我首先将讨论 RAG,因为这是代理信息查找的基础。然后,我将从高层次上继续讨论 AI 代理如何被用来查找信息。

代理信息检索

这张信息图表突出了本文的主要内容。我将讨论一些不同的传统信息检索方法,如 TF-IDF(关键词搜索),并继续讨论 RAG。然后,我将讨论实现 RAG 的不同方式,要么是自己从头开始使用嵌入模型和向量数据库,要么是使用管理的 RAG 解决方案。然后,我将讨论如何将关键词搜索和 RAG 作为工具提供给您的 AI 代理。图片由 ChatGPT 提供。

为什么我们需要代理信息查找

信息检索是一个相对古老的任务。TF-IDF 是第一个用于在大量文档集中查找信息的算法,它通过根据特定文档中单词的频率以及单词在所有文档中的频率来索引你的文档。

如果用户搜索一个单词,并且该单词在几份文档中频繁出现,但在所有文档中很少出现,这表明这些文档具有强烈的相关性。

信息检索是一项如此关键的任务,因为作为人类,我们如此依赖快速查找信息来解决各种问题。这些问题可能包括:

  • 如何烹饪特定的菜肴

  • 如何实现某个算法

  • 如何从地点 A 到 B


尽管我们已经发现了更强大的查找信息的方法,但 TF-IDF 仍然出奇地有效。检索增强生成(RAG)是一种强大的技术,它依赖于语义相似性来查找有用的文档。

代理信息查找利用不同的技术,如关键词搜索(例如 TF-IDF,但通常是算法的现代版本,如 BM25),以及 RAG,来查找相关文档,搜索它们,并将结果返回给用户。

构建你自己的 RAG

图片

这张图突出了 RAG 的工作原理。你嵌入文档查询,并根据语义相似性从语料库中找到最相似的文档。然后,你将这些相关文档输入到 LLM 中,LLM 在相关文档的基础上为用户提供答案。图片由作者提供。

利用今天所有技术和工具,构建自己的 RAG 出奇地简单。有许多包可以帮助你实现 RAG。然而,它们都依赖于相同的基本底层技术:

  • 嵌入你的文档语料库(你通常也会将文档分块)

  • 将嵌入存储在向量数据库中

  • 用户输入搜索查询

  • 嵌入搜索查询

  • 在文档语料库和用户查询之间找到嵌入相似度,并返回最相似的文档

如果你熟悉操作,这可以在几小时内完成。例如,为了嵌入你的数据和用户查询,你可以使用:

  • 管理服务如

    • OpenAI 的 text-embedding-large-3

    • Google 的 gemini-embedding-001

  • 开源选项如

    • 阿里巴巴的 qwen-embedding-8B

    • Mistral 的 Linq-Embed-Mistral


在嵌入你的文档之后,你可以将它们存储在向量数据库中,例如:

  • Pinecone

  • Weaviate

  • Milvus

之后,你基本上就准备好执行 RAG 了。在下一节中,我还会介绍完全托管的 RAG 解决方案,你只需上传文档,所有分块、嵌入和搜索都会为你处理。

托管 RAG 服务

如果你想要一个更简单的方法,你也可以使用完全托管的 RAG 解决方案。以下是一些选项:

  • Ragie.ai

  • Gemini 文件搜索工具

  • OpenAI 文件搜索工具

这些服务显著简化了 RAG 过程。你可以将这些服务中的任何一个上传文档,服务会自动为你处理分块、嵌入和推理。你所要做的就是上传你的原始文档,并提供你想要运行的搜索查询。然后,服务会为你提供与查询相关的文档,你可以将这些文档输入到 LLM 中以回答用户问题。

尽管托管 RAG 显著简化了过程,但我还想强调一些缺点:

如果你只有 PDF 文件,你可以直接上传。然而,目前有一些文件类型不受托管 RAG 服务的支持。例如,有些不支持 PNG/JPG 文件,这会复杂化处理过程。一个解决方案是对图像进行 OCR 处理,然后上传 txt 文件(这是支持的),但这当然会复杂化你的应用程序,这正是你在使用托管 RAG 时想要避免的事情。

当然,另一个缺点是你必须上传原始文档到服务中。在这样做的时候,你需要确保遵守规定,例如,遵守欧盟的 GDPR 法规。这对一些托管 RAG 服务来说可能是一个挑战,尽管我知道 OpenAI 至少支持欧盟居民。


我还将提供一个使用OpenAI 的文件搜索工具的示例,它自然非常简单易用。

首先,创建一个向量存储并上传文档:

from openai import OpenAI
client = OpenAI()

# Create vector store
vector_store = client.vector_stores.create(        
    name="<your vector store name>",
)

# Upload file and add it to the vector store
client.vector_stores.files.upload_and_poll(        
    vector_store_id=vector_store.id,
    file=open("filename.txt", "rb")
)

在上传和处理文档后,您可以使用以下方式查询它们:

user_query = "What is the meaning of life?"

results = client.vector_stores.search(
    vector_store_id=vector_store.id,
    query=user_query,
)

如您可能注意到的,这段代码比设置嵌入模型和向量数据库来构建 RAG 自己要简单得多。

信息检索工具

现在我们有了现成的信息检索工具,我们可以开始执行代理信息检索。我将从使用 LLM 进行信息查找的初始方法开始,然后继续使用更好和更新的方法。

检索,然后回答

第一种方法是首先检索相关文档,并在回答用户问题之前将这些信息提供给 LLM。这可以通过运行关键词搜索和 RAG 搜索,找到最相关的 X 个文档,并将这些文档输入到 LLM 中来实现。

首先,使用 RAG 找到一些文档:

user_query = "What is the meaning of life?"

results_rag = client.vector_stores.search(
    vector_store_id=vector_store.id,
    query=user_query,
)

然后,通过关键词搜索找到一些文档

def keyword_search(query):
    # keyword search logic ...
    return results

results_keyword_search = keyword_search(query)

然后将这些结果合并在一起,删除重复的文档,并将这些文档的内容输入到 LLM 中进行回答:

def llm_completion(prompt):
   # llm completion logic
   return response

prompt = f"""
Given the following context {document_context}
Answer the user query: {user_query}
"""

response = llm_completion(prompt)

在很多情况下,这种方法非常有效,并能提供高质量的响应。然而,还有更好的方法来进行代理信息查找。

信息检索作为一个工具

最新的前沿 LLM 都是考虑到代理行为进行训练的。这意味着 LLM 在利用工具回答查询方面非常出色。您可以向 LLM 提供一个工具列表,它自己决定何时使用,以及它可以利用哪些工具来回答用户查询。

因此,更好的方法是向您的 LLM 提供 RAG 和关键词搜索作为工具。例如,对于 GPT-5,您可以这样做:

# define a custom keyword search function, and provide GPT-5 with both
# keyword search and RAG (file search tool)
def keyword_search(keywords):
    # perform keyword search
    return results 

user_input = "What is the meaning of life?"

tools = [
    {
        "type": "function",
        "function": {
            "name": "keyword_search",
            "description": "Search for keywords and return relevant results",
            "parameters": {
                "type": "object",
                "properties": {
                    "keywords": {
                        "type": "array",
                        "items": {"type": "string"},
                        "description": "Keywords to search for"
                    }
                },
                "required": ["keywords"]
            }
        }
    },
    {
        "type": "file_search",
        "vector_store_ids": ["<vector_store_id>"],
    }
]

response = client.responses.create(
    model="gpt-5",
    input=user_input,
    tools=tools,
) 

这之所以效果更好,是因为您不是一次性使用 RAG/关键词搜索进行信息查找,然后回答用户问题。它之所以有效,是因为:

  • 代理可以自己决定何时使用工具。例如,有些查询不需要向量搜索

  • OpenAI 会自动进行查询重写,这意味着它会运行并行 RAG 查询,使用基于用户查询的不同版本(这些版本由它自己根据用户查询编写)

  • 如果代理认为信息不足,它可以决定运行更多的 RAG 查询/关键词搜索

列表中最后一点是代理信息查找最重要的点。有时,您可能无法通过初始查询找到所需的信息。代理(GPT-5)可以确定这种情况,并选择在认为需要时发出更多的 RAG/关键词搜索查询。这通常会导致更好的结果,并使代理更有可能找到您所需的信息。

结论

在这篇文章中,我介绍了代理信息检索的基础知识。我首先讨论了为什么代理信息如此重要,强调了我们高度依赖快速获取信息。此外,我还介绍了你可以使用的工具,用于通过关键词搜索和 RAG 进行信息检索。然后,我强调了在将结果输入到 LLM 之前,你可以静态地运行这些工具,但更好的方法是将这些工具输入到 LLM 中,使其成为一个能够查找信息的代理。我认为代理信息查找在未来将变得越来越重要,而了解如何使用 AI 代理将成为在未来的几年中创建强大 AI 应用的重要技能。


👉 我的免费资源

🚀 使用 LLM 提升你的工程能力(免费 3 天电子邮件课程)

📚 获取我的免费视觉语言模型电子书

💻 我的视觉语言模型网络研讨会

👉 在社交平台上找到我:

📩 订阅我的通讯

🧑‍💻 联系我

🔗 LinkedIn

🐦 X / Twitter

✍️ Medium

posted @ 2026-03-28 09:40  布客飞龙II  阅读(6)  评论(0)    收藏  举报