实现 RAG 系统:爬取

发布: (2026年3月25日 GMT+8 02:00)
6 分钟阅读
原文: Dev.to

Source: Dev.to

Introduction

我将开启一个 “Crawl, walk, run” 系列文章,涵盖各种主题,首先从检索增强生成(Retrieval‑Augmented Generation,RAG)开始。在本阶段,我们将介绍 RAG 系统的核心概念,并使用不列颠哥伦比亚省政府的人力资源政策 PDF 作为知识库,进行一个简单示例。我们会对文档进行处理、切块并嵌入到本地向量数据库中,使得智能体能够直接从摄取的 BC 政府政策中提供有依据的答案。

RAG 是一种常见的设计模式,可将标准的大语言模型(LLM)转变为具备信息支撑的 AI 智能体。标准模型像是一个“黑箱”,而 RAG 为你的智能体提供“开卷考试”,通过直接链接到你的文档来绕过知识截止点,提供事实依据和引用。无需微调,数据也可以快速更新,形成 LLM 与你的数据之间的实时桥梁。

分块与拆分

将所有信息在每次查询时全部输入给 AI 并不可行。相反,文本会被拆分成更小、更易管理的片段,称为 chunks,AI 可以高效地处理和检索这些片段。

代码:使用 LangChain 拆分 PDF

from langchain_community.document_loaders import PyPDFLoader, DirectoryLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

loader = DirectoryLoader(
    DATA_DIR,
    glob="./**/*.pdf",
    loader_cls=PyPDFLoader
)
docs = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=100
)
chunks = text_splitter.split_documents(docs)

递归字符分块通过确保重叠来改进固定大小的分块,防止在分块边界处丢失部分句子。

嵌入

嵌入过程将文本块转换为向量——一组浮点数数组,用于捕捉语义含义。更高的维度 并不 总是能带来更好的结果;对于简单文档来说,它可能会增加延迟和计算开销,却并未提升搜索准确度。

关键要点

  • 模型一致性: 索引和检索时使用相同的嵌入模型。不同模型对词语的关注点不同(例如,侧重主题 vs. 动作),这会影响结果。
  • 嵌入类型选择: 文档通常较长且结构化,而用户查询则短且噪声较多。请选择能够很好处理这种不对称性的嵌入模型。

一旦用户查询被嵌入,RAG 系统会对向量数据库执行相似度搜索,以找到最相关的片段。大多数向量数据库使用 cosine similarity,它衡量的是向量之间的夹角,而不是它们的大小。这使得系统能够在不同长度和词频的文本之间匹配意图。

Agent Implementation

为了处理人力资源问题,我使用 Google 的 Agent Development Kit (ADK) 构建了一个代理,直接连接到 RAG 系统。

Code: Defining the HR Agent

from .tools import query_hr
from langchain.tools import FunctionTool
from langchain.agents import LlmAgent

hr_rag_tool = FunctionTool(func=query_hr)

hr_agent = LlmAgent(
    name="hr_agent",
    model="gemini-3.1-pro-preview",
    description="Specialist in company HR policies and procedures.",
    instruction=(
        "You are a professional HR assistant. Your goal is to answer questions "
        "using ONLY the information retrieved from the 'query_hr' tool. "
        "When calling the 'query_hr' tool, ensure all string arguments are properly formatted as standard JSON strings with double quotes.\n\n"
        "RULES:\n"
        "1. If the tool returns relevant information, summarize it clearly.\n"
        "2. You MUST cite your sources using the format: (Source: [Source Name], Page: [Page Number]).\n"
        "3. If the tool results do not contain the answer, state: 'I'm sorry, I couldn't find that in our HR documents.'\n"
        "4. Do not use outside knowledge or make up facts about company policy."
    ),
    tools=[query_hr],
)

通过为代理提供明确的指令并使用正确的工具搜索向量数据库,它可以在几秒钟内为用户提取精准答案。

下一步

原型可用,但仍有大量改进空间。为了将这个简单的 RAG 系统发展为高性能引擎,未来的工作将重点关注:

  1. 细化分块(Chunking): 试验不同的块大小和重叠策略。
  2. 重排序层(Reranking Layer): 引入重排序步骤,以提升检索结果的相关性。
  3. 精度提升: 优化嵌入模型和相似度阈值。

如果您尚未使用 Agent Development Kit 并想了解更多,请查看 ADK Crash Course – From Beginner to Expert,其中包含获取课程免费 GCP 额度的链接。

Repository

完整的代码和数据已在我的 GitHub 仓库中提供 → 此处

0 浏览
Back to Blog

相关文章

阅读更多 »

RAG(检索增强生成)简介

生成式 AI 与 LLM 的局限性 如果你曾经使用过大型语言模型(LLMs),你可能已经遇到它们最大的痛点: - 知识陈旧 –...

为什么你的 AI Agent 需要记忆

核心问题:大多数 agent 框架把 memory 视为事后考虑。它们为你的 agent 提供 tools、prompts 和 orchestration patterns——但当你重新启动时……