摘要
本周学习分为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 对象数据