惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
V
V2EX
GbyAI
GbyAI
Recent Announcements
Recent Announcements
Microsoft Security Blog
Microsoft Security Blog
阮一峰的网络日志
阮一峰的网络日志
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
Y
Y Combinator Blog
C
Check Point Blog
爱范儿
爱范儿
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
美团技术团队
雷峰网
雷峰网
IT之家
IT之家
WordPress大学
WordPress大学
V
Visual Studio Blog
Microsoft Azure Blog
Microsoft Azure Blog
MyScale Blog
MyScale Blog
N
News and Events Feed by Topic
罗磊的独立博客
S
SegmentFault 最新的问题
S
Security Affairs
aimingoo的专栏
aimingoo的专栏
F
Fortinet All Blogs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
H
Hacker News: Front Page
Google DeepMind News
Google DeepMind News
B
Blog
O
OpenAI News
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
The Last Watchdog
The Last Watchdog
Hacker News: Ask HN
Hacker News: Ask HN
博客园_首页
人人都是产品经理
人人都是产品经理
C
Cybersecurity and Infrastructure Security Agency CISA
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Help Net Security
Help Net Security
月光博客
月光博客
J
Java Code Geeks
L
LangChain Blog
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
Apple Machine Learning Research
Apple Machine Learning Research
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 哥本哈士奇(aspnetx)

Raw Data Vault vs Business Data Vault Neo4j 多跳查询实战:从社交网络场景理解图遍历 Git 本地版本管理学习笔记 看完《低智商犯罪》,学习Cypher构建知识图谱 LangChain DeepAgents 学习笔记 LangChain Deepagent 版本0.6.1中间件一个bug Neo4j笔记(五):查询的处理流程 微软 SQL Server 版本演进史:从诞生到 SQL Server 2025 提升 Text2SQL 准确率 SQLServer Management Studio(SSMS) 22 Copilot 最佳实践学习笔记 SQLServer RAG笔记4:从服务层到前端交互 SQLServer RAG笔记5:为SQLServer 2025配置Ollama SQL Server RAG 笔记3:SQLServer2025 向量数据库 详解传统RAG、Text2SQL、Graph RAG:适用场景与问题示例汇总 SQL Server RAG 笔记2:图数据库服务层与前端可视化构建 SQL Server RAG 笔记1:图数据库构建 Neo4j 笔记(四):一篇文章如何入库的 数据仓库笔记 第六篇:PSA 层 SCD2 处理方式 数据仓库笔记 第五篇:Data Mart 层(数据集市) 数据仓库笔记 第四篇:Star Schema 层(维度建模) 数据仓库笔记 第三篇:常用缓慢变化维处理方式介绍 数据仓库笔记 第二篇:PSA 层(持久化暂存区)详解 数据仓库笔记 第一篇:数据仓库的定义、历史与意义 Neo4j 笔记(三):数据建模与程序连接实战 Neo4j 基础教程(二):Cypher CRUD 完全指南 Neo4j 基础教程(一):安装与快速入门 Power BI学习笔记第20篇:面试题汇总 · 第三篇:高级应用与最佳实践篇 Power BI学习笔记第19篇:面试题汇总 · 第二篇:数据建模与 DAX 篇 Power BI学习笔记第18篇:面试题汇总 · 第一篇:基础概念篇 Power BI学习笔记第15篇:企业级报表开发与最佳实践 Power BI学习笔记第13篇:高级可视化与自定义图表 Power BI学习笔记第14篇:Power Query 高级数据处理 Power BI学习笔记第12篇:DAX 高级计算与性能优化 Power BI学习笔记第11篇:高级数据建模与关系设计 Power BI学习笔记第10篇:实战案例 — 销售数据分析仪表板 Power BI学习笔记第08篇:报表交互与筛选器 Power BI学习笔记第09篇:Power BI Service 发布与共享 Power BI学习笔记第07篇:可视化图表设计与最佳实践 Power BI学习笔记第06篇:DAX 进阶:时间智能与复杂计算 Power BI学习笔记第05篇:DAX 基础:计算列与度量值 Power BI学习笔记第04篇:数据建模与关系管理 Power BI学习笔记第03篇:Power Query 数据清洗与转换 Power BI学习笔记第02篇:数据获取与连接数据源 Power BI学习笔记第01篇:Power BI 简介与环境搭建 Power BI Dashboard 常用布局方案推荐 Power BI 示例一览 OpenClaw 核心八大 MD 文件 Microsoft Agent Framework 智能体调用工具 Microsoft Agent Framework 创建智能体 一个简单案例理解OpenClaw的做梦过程 SQLAlchemy 学习笔记 LangChain使用deep agent并且加载SKILL 本地系统对接大模型智能体的若干尝试 财务分析报告 - 常用Power BI DAX公式详解 用SKILL实现请假流程信息收集 使用小龙虾来操作猿编程的遥控车 使用OpenClaw的Skills对接本地系统 OpenClaw必装Skill全指南 Dify Agentic RAG 笔记 # 简单的神经网络计算过程 - 正负判断 使用Gradio构建AI前端 - RAG的QA模块 使用Gradio构建AI前端 - RAG召回测试 Streamlit + LangChain 1.0 简单实现智能问答前后端 利用AI Agent,辅助销售团队制定培训和考试内容 实现AI和BI整合的初步思路和探索-Part3 实现AI和BI整合的初步思路和探索-Part2 实现AI和BI整合的初步思路和探索 以《出师表》作为例子,对比通用分块和父子分块的区别 LangChain RAG 学习笔记:从文档加载到问答服务 记录无法修改OneDrive文件的解决方法 Power BI制作指标达成跟踪器 Power BI学习笔记-周报销售数据分析
LangChain RAG索引与查询 - 学习笔记
哥本哈士奇(aspnet · 2026-04-19 · via 博客园 - 哥本哈士奇(aspnetx)

LangChain RAG索引与查询 - 学习笔记

摘要

此篇的学习笔记来自于B站强哥学编程,记录了关键的代码片段和知识整理,方便后续对相应知识点的复习,这一篇是RAG的关键LangChain代码。
RAG是一种结合了检索和生成的AI技术,通过从外部知识库检索相关信息,增强大语言模型的生成能力,从而提供更准确、更相关的回答。
此篇使用的LangChain版本是1.x,于2026年4月。

RAG索引流程

1. 文档加载

from langchain_community.document_loaders import WebBaseLoader
import bs4

page_url = "https://news.cctv.com/2025/08/07/ARTIwHXTjBUTWQHIhY3pmv7Z250807.shtml"
bs4_strainer = bs4.SoupStrainer()

loader = WebBaseLoader(
    web_paths=(page_url, ),
    bs_kwargs={"parse_only": bs4_strainer}
)

docs = loader.load()
  • 这里演示的是使用WebBaseLoader加载网页内容
  • 返回的是List[Document]类型,每个Document包含页面内容和元数据
  • bs4是python下常用的网页解析库

2. 文本分割

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,     # 每个文本段的字符数
    chunk_overlap=200,   # 文本段之间的重叠字符数
    add_start_index=True # 添加起始索引
)

all_splits = text_splitter.split_documents(docs)
  • 使用RecursiveCharacterTextSplitter将长文本分割成较短的文本段,分段的长度和重叠长度都在这里指定
  • 合理的分割参数可以提高检索精度和相关性

3. 向量化

from langchain_ollama import OllamaEmbeddings

embedding = OllamaEmbeddings(model="nomic-embed-text")
  • 使用OllamaEmbeddings将文本转换为向量,也就是向量模型使用的是本地Ollama部署的
  • 选择了nomic-embed-text模型作为嵌入模型

向量模型通常比常见大模型小很多,将其分离开来也可以有效的降低成本。

4. 向量存储

from langchain_chroma import Chroma

vector_store = Chroma(
    collection_name="rag_collection",
    embedding_function=embedding,
    persist_directory="./chroma_rag_db"
)

ids = vector_store.add_documents(documents=all_splits)
  • 使用Chroma作为向量数据库,所以这里import的是Chroma的模块
  • 指定了集合名称、嵌入函数和持久化目录。后续查询的配置跟这些也都需要匹配的上。
  • 将文本段及其向量存储到向量库中

Note: add_documents是不会对库里已有内容进行排重的,排重需要自己额外的写代码处理。

RAG查询流程

1. 加载向量库

from langchain_ollama import OllamaEmbeddings
from langchain_chroma import Chroma

embedding = OllamaEmbeddings(model="nomic-embed-text")

vector_store = Chroma(
    collection_name="rag_collection",
    embedding_function=embedding,
    persist_directory="./chroma_rag_db"
)
  • 与索引过程使用相同的嵌入模型和向量库配置

2. 定义检索工具

from langchain.tools import tool

@tool(response_format="content_and_artifact")
def retrieve_context(query: str):
    """Retrieve information to help answer a query"""
    retrieved_docs = vector_store.similarity_search(query, k=2)
    content = '\n\n'.join(
        (f"Source:{doc.metadata}\nContent:{doc.page_content}") for doc in retrieved_docs
    )
    return content, retrieved_docs
  • 使用@tool装饰器定义了一个检索工具
  • 通过similarity_search方法根据查询向量检索最相似的文档
  • 返回检索到的文档内容和元数据

3. 创建和使用Agent

from langchain.agents import create_agent

system_prompt = """
    你可以使用信息检索工具,回答用户的问题
"""

agent = create_agent(
    model="deepseek:deepseek-chat",
    tools=[retrieve_context],
    system_prompt=system_prompt
)

results = agent.invoke(
    {"messages":[{"role": "user", "content": "讲一下 3i/Atlas"}]}
)
  • 创建了一个Agent,使用deepseek:deepseek-chat模型,这是调用的Deepseek API,需要付费去购买,这里也可以替换成本地的ollama里部署的模型
  • 配置了检索工具和系统提示,留意创建agent的tools配置,把方法retrieve_context直接配了进去。
  • 执行查询并获取结果,agent会根据向量库里解锁的结果来做总结。

关键技术点分析

1. 文本分割策略

  • chunk_size:控制每个文本段的长度,过小可能导致信息不完整,过大可能降低检索精度
  • chunk_overlap:确保文本段之间有一定重叠,避免语义断裂
  • add_start_index:添加起始索引,有助于定位原始文档中的位置

2. 嵌入模型选择

  • 使用了nomic-embed-text模型,这是一个专门用于文本嵌入的模型
  • 嵌入模型的选择直接影响向量表示的质量和检索的准确性

3. 向量数据库

  • 使用Chroma作为向量数据库,它是一个轻量级的开源向量存储
  • 支持持久化存储,便于后续查询使用

4. 检索策略

  • 使用similarity_search方法,基于余弦相似度进行检索
  • 设置k=2,即返回最相似的2个文档
  • 检索结果包含源信息和内容,便于Agent理解和使用

5. Agent架构

  • 使用create_agent创建了一个能够使用工具的Agent
  • 系统提示指导Agent在回答问题时使用检索工具
  • Agent会根据用户问题自动决定是否需要检索信息

代码优化空间

  1. 错误处理:添加异常处理,例如网络请求失败、向量库操作失败等情况
  2. 参数配置:将关键参数(如chunk_size、k值等)提取为配置项,便于调整和优化
  3. 日志记录:添加日志记录,便于调试和监控
  4. 性能优化:对于大规模文档,可以考虑批量处理和并行操作
  5. 评估指标:添加评估指标,如检索精度、回答质量等,以衡量系统性能

应用场景

  • 问答系统:基于特定领域的文档回答用户问题
  • 信息检索:从大量文档中快速找到相关信息
  • 知识管理:构建企业或个人的知识库,提供智能检索功能
  • 内容生成:结合检索到的信息生成更准确、更相关的内容

总结

RAG技术通过结合检索和生成,有效地解决了大语言模型知识 cutoff 和幻觉问题。本学习笔记基于两个示例代码,详细介绍了RAG的索引和查询流程,包括文档加载、文本分割、向量化、向量存储以及基于Agent的查询实现。通过合理配置参数和选择合适的模型,可以构建一个高效、准确的RAG系统。