实现 RAG 系统:爬取
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. 动作),这会影响结果。
- 嵌入类型选择: 文档通常较长且结构化,而用户查询则短且噪声较多。请选择能够很好处理这种不对称性的嵌入模型。
Similarity Search
一旦用户查询被嵌入,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 系统发展为高性能引擎,未来的工作将重点关注:
- 细化分块(Chunking): 试验不同的块大小和重叠策略。
- 重排序层(Reranking Layer): 引入重排序步骤,以提升检索结果的相关性。
- 精度提升: 优化嵌入模型和相似度阈值。
如果您尚未使用 Agent Development Kit 并想了解更多,请查看 ADK Crash Course – From Beginner to Expert,其中包含获取课程免费 GCP 额度的链接。
Repository
完整的代码和数据已在我的 GitHub 仓库中提供 → 此处。