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 对象数据
相关推荐
问心无愧05131 小时前
ctf show web入门58
前端·笔记
俏皮小混子2 小时前
山东大学软件学院项目实训-创新实训-计科智伴(五)——个人博客(从接口对接到边界问题修复的完整记录)
笔记·学习·状态模式·山东大学
Oll Correct2 小时前
计算机二级WPS Office第十四套WPS演示
笔记·计算机二级wps
哇嘎呀2 小时前
OSPF笔记
网络·笔记
Upsy-Daisy2 小时前
IOTA 学习笔记(三):IOTA 的技术演进路线
笔记·学习
有个人神神叨叨2 小时前
Agent Memory 学习笔记-1.0
笔记·学习
一只肥瘫瘫3 小时前
STM32 程序升级学习笔记:Bootloader、IAP 与串口升级流程
笔记·stm32·学习
Wonderful U3 小时前
基于Python+Django的私有化云笔记系统:从痛点分析到完整实现
笔记·python·django
问心无愧05133 小时前
ctf show web 入门66
前端·笔记