rag笔记4

摘要

本周学习分为RAG会话记忆和LangChain文档加载器两部分,短时会话记忆只缓存一轮对话、读写快且无需持久化,长时会话记忆完整留存全部对话并持久存储。文档加载器作为RAG的数据入口,能把各类文件转换成标准Document对象,我学习了txt、PDF、CSV、JSON四种文件对应的加载器,掌握了它们各自的适用场景。

abstract

This week covers two parts: RAG session memory and LangChain document loaders. Short-term session memory only caches a single round of dialogue, featuring fast read and write speeds without persistent storage, while long-term session memory retains all dialogue records completely with persistent storage. As the data entry point of RAG, document loaders can convert various files into standard Document objects. I have learned loaders corresponding to four types of files including TXT, PDF, CSV and JSON, and mastered their respective applicable scenarios.

一、Memory会话记忆

短会话记忆

RAG 中的短会话记忆属于临时上下文缓存,仅留存当前一轮对话的交互信息,只抓取用户最新提问与模型上一轮回复,存储生命周期仅限单次问答流程。它不做历史对话持久化,检索文档时仅结合近期少量对话语义,优势是读取速度快、占用资源少,适合单次独立提问、无需追溯过往交流的轻量问答场景,一旦开启全新提问轮次,旧的短时记忆数据就会直接清空。实现代码如下:

python 复制代码
# 创建一个新的链,对原有链增强功能:自动附加历史消息
conversation_chain = RunnableWithMessageHistory(
    base_chain,     # 被增强的原有chain
    get_history,    # 通过会话id获取InMemoryChatMessageHistory类对象
    input_messages_key="input",             # 表示用户输入在模板中的占位符
    history_messages_key="chat_history"     # 表示用户输入在模板中的占位符
)

长会话记忆

长会话记忆用于留存完整多轮对话历史,会持久存储全部用户问题、模型回答、对话时间等完整交互文本,支持跨轮次、跨时段追溯全局对话逻辑。执行 RAG 检索时会把全部历史对话语义融入查询向量,让模型理解贯穿全程的上下文需求,通常依托数据库、向量库落地保存,缺点是对话越多数据量越大、检索耗时会小幅上升,主要适配连续多轮聊天、需要连贯语境的长对话业务。实现代码分为写入和读取两个部分

python 复制代码
    #将数据写入文件
    def add_messages(self, messages: Sequence[BaseMessage]) -> None:
        # Sequence序列 类似list、tuple
        all_messages = list(self.messages)      # 已有的消息列表
        all_messages.extend(messages)           # 新的和已有的融合成一个list
        new_messages = [message_to_dict(message) for message in all_messages]
        # 将数据写入文件
        with open(self.file_path, "w", encoding="utf-8") as f:
            json.dump(new_messages, f)
    
    #将文件从数据中读入
    @property       # @property装饰器将messages方法变成成员属性用
    def messages(self) -> list[BaseMessage]:
        # 当前文件内: list[字典]
        try:
            with open(self.file_path, "r", encoding="utf-8") as f:
                messages_data = json.load(f)    # 返回值就是:list[字典]
                return messages_from_dict(messages_data)
        except FileNotFoundError:
            return []

二、langchain loders

LangChain Loaders(文档加载器)是 LangChain 中专门用于从各种数据源读取、提取原始数据,并将其转换为 LangChain 标准 Document 对象的工具模块,是 RAG 流程的第一步入口组件。常用的有CSVLoader、JSONLoader、PyPDFLoader以及TextLoader。

TextLoader(文本文件加载器)

TextLoader

是读取纯 txt 文件的加载器,输出统一 Document 实例,适配本地无格式文本文档。基础创建代码:

python 复制代码
from langchain_community.document_loaders import TextLoader
loader = TextLoader(
    file_path="./article.txt", encoding="utf-8"
)
docs = loader.load()
  • page_content:txt 文件完整文本内容
  • metadata:字典,默认携带文件路径、文件名信息

PyPDFLoader(PDF 文件加载器)

PyPDFLoader 用于解析 PDF 电子文档,会按 PDF 分页生成多个 Document 对象,每一页对应一条文档实例。基础创建代码:

python 复制代码
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader(
    file_path="./book.pdf"
)
docs = loader.load()
  • page_content:PDF 单页提取出的文字内容
  • metadata:字典,自带 page(当前页码)、source(pdf 文件路径)字段

CSVLoader(表格加载器)

CSVLoader 读取 csv 表格文件,将表格每行数据整合为一段文本,一行生成一个 Document 实例。基础创建代码:

python 复制代码
from langchain_community.document_loaders import CSVLoader
loader = CSVLoader(
    file_path="./data.csv", encoding="utf-8"
)
docs = loader.load()
  • page_content:当前行所有列名 + 对应数值拼接成的文本
  • metadata:字典,记录行号、csv 文件路径、各列原始数据

JSONLoader(JSON 数据加载器)

JSONLoader 读取本地 JSON 文件,依靠 jq 语法筛选目标数组数据,每一条匹配数据生成一个 Document。基础创建代码:

python 复制代码
from langchain_community.document_loaders import JSONLoader
loader = JSONLoader(
    file_path="./info.json", jq_schema=".data[]", text_content_key="content"
)
docs = loader.load()
  • page_content:JSON 中指定字段的文本内容
  • metadata:字典,保存 JSON 文件路径、当前整条原始 JSON 对象数据
相关推荐
Li_RuiQi4 小时前
DAgger方法演进_独立学习笔记
笔记·学习·计算机视觉
Li_RuiQi8 小时前
DAgger与交互式模仿学习_ACT学习笔记
笔记·学习
He BianGu8 小时前
【笔记】C# 中BindingFlags的详细作用
笔记·c#
AI视觉网奇8 小时前
turtle 入门教程笔记
笔记
跨知易知识产权9 小时前
美国专利确权是什么,和专利诉讼有什么不一样?
笔记
杨逢昌工厂6S管理9 小时前
126-杨逢昌6S三环体系:越做越乱的现场熵增机理与基准化治理——一线现场诊断笔记
经验分享·笔记·职场和发展·学习方法
悟道书生9 小时前
若依 RBAC 权限控制学习笔记
java·网络·笔记·sql·学习·vue
陈哈哈111110 小时前
折腾了半天,总算把 Vim 9.2 装明白了
笔记
陈哈哈111110 小时前
折腾了半天,总算把 OpenGL 的开发环境给装明白了
笔记
深圳老胡11 小时前
STM32F103 硬件 SPI 与软件 IO 模拟 SPI 最高速度差异详解
笔记·stm32·单片机·代码规范·1024程序员节