使用 LlamaIndex ReadwiseReader 将阅读高亮数据导入 RAG 流水线
【免费下载链接】llama_indexLlamaIndex is the leading document agent and OCR platform项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index
本指南围绕 LlamaIndex 官方集成包llama-index-readers-readwise展开,介绍如何通过 ReadwiseReader 读取 Readwise 平台上的全部高亮笔记(highlights),并将其转化为 LlamaIndex 的Document后接入索引与问答流程。读完本文,你将掌握安装方式、API Token 配置、全量加载与增量同步两种加载策略,以及该 Reader 底层基于 Readwise Export API 的分页实现原理。
一、ReadwiseReader 是什么
Readwise 是一款聚合阅读工具,可以把来自网页文章、电子书(epub)、PDF、Kindle、YouTube 等来源的高亮内容统一收集起来。ReadwiseReader是 LlamaIndex 官方提供的数据加载器(Loader),它调用 Readwise 的 Export API 将上述来源的高亮导出为纯文本,再交给 LLM 构建索引与检索问答。
该 Reader 的核心实现在仓库 base.py 中,模块结构如下:
llama-index-integrations/readers/llama-index-readers-readwise/ ├── llama_index/readers/readwise/ │ ├── __init__.py # 导出 ReadwiseReader │ └── base.py # Reader 核心实现 ├── tests/ │ └── test_readers_readwise.py ├── README.md # 官方使用说明 └── pyproject.tomlReadwiseReader继承自 LlamaIndex Core 的 BaseReader,其职责是"把外部数据源读成统一的Document列表",因此它天然可以与其他 LlamaIndex 组件(VectorStoreIndex、查询引擎等)无缝衔接。
二、安装
Readwise Reader 作为独立集成包发布,执行:
pip install llama-index-readers-readwise从 pyproject.toml 可以看到其运行依赖为llama-index-core>=0.13.0,<0.15,并要求 Python 版本>=3.10,<4.0。也就是说安装该包时 LlamaIndex Core 会作为依赖一并安装。
三、获取 Readwise API Token
使用前需要先拿到 Readwise 的访问令牌:
- 登录 Readwise 账号;
- 在账号设置页面生成 Access Token(官方入口为 readwise.io/access_token);
- 将 Token 写入环境变量
READWISE_API_KEY,或在代码中直接传入。
推荐将 Token 放入环境变量,避免硬编码到源码中:
export READWISE_API_KEY="你的_token"四、基本用法:加载全部高亮并构建索引
官方 README 给出的标准用法如下:
import os from llama_index.core import VectorStoreIndex from llama_index.readers.readwise import ReadwiseReader token = os.getenv("READWISE_API_KEY") loader = ReadwiseReader(api_key=token) documents = loader.load_data() index = VectorStoreIndex.from_documents(documents) index.query("What was the paper 'Attention is all you need' about?")关键步骤拆解:
- 实例化:
ReadwiseReader(api_key=token)保存 API Token,供后续请求使用; - 加载:
loader.load_data()调用 Readwise Export API,将返回结果包装为Document列表; - 建索引:
VectorStoreIndex.from_documents(documents)完成切分与向量化; - 问答:
index.query(...)基于已建索引执行检索增强生成(RAG)。
五、增量加载:只同步指定时间之后的高亮
Readwise 的高亮会随时间不断累积。每次全量拉取既慢又浪费 Token,官方为此提供了updated_after参数,只加载某时间点之后更新过的高亮,非常适合用来"定时增量更新索引"。
import os import datetime from llama_index.core import VectorStoreIndex from llama_index.readers.readwise import ReadwiseReader token = os.getenv("READWISE_API_KEY") loader = ReadwiseReader(api_key=token) # 只取最近 7 天更新过的高亮 seven_days_ago = datetime.datetime.now() - datetime.timedelta(days=7) documents = loader.load_data(updated_after=seven_days_ago) index = VectorStoreIndex.from_documents(documents) index.query("What has Elon Musk done this time?")updated_after是datetime.datetime类型。在实践中,你可以把上次成功同步的时间记录下来,下次同步时传入,实现真正的增量更新:
# 记录上次同步时间 last_sync = datetime.datetime.now() - datetime.timedelta(days=7) docs = loader.load_data(updated_after=last_sync) # 同步完成后更新游标 cursor = datetime.datetime.now()六、底层实现解析:Export API 的分页拉取
从 base.py 的源码可以看到,加载过程由模块级辅助函数_get_readwise_data完成,其核心逻辑如下:
def _get_readwise_data(api_key: str, updated_after: Optional[datetime.datetime] = None): result = [] next_page = None while True: response = requests.get( url="https://readwise.io/api/v2/export/", params={ "pageCursor": next_page, "updatedAfter": updated_after.isoformat() if updated_after else None, }, headers={"Authorization": f"Token {api_key}"}, ) response.raise_for_status() result.extend(response.json()["results"]) next_page = response.json().get("nextPageCursor") if not next_page: break return result几个值得注意的实现细节:
- 认证方式:请求头使用
Authorization: Token {api_key},即 Readwise 的 Token 认证; - 分页机制:通过
pageCursor请求参数传入当前游标,响应中读取nextPageCursor判断是否还有下一页;当nextPageCursor为空时终止循环。这意味着即使高亮数量很多,也会全量拉取完毕; - 时间过滤:
updatedAfter参数接受 ISO 8601 格式的时间字符串(updated_after.isoformat()),由 Readwise 服务端按更新时间过滤,避免把全量数据下载到本地再过滤; - 错误处理:
response.raise_for_status()保证在请求失败(如 Token 无效、触发限流)时直接抛出异常,不会静默返回部分数据。
随后load_data将每条高亮记录序列化为 JSON 字符串并包装成Document:
return [Document(text=json.dumps(d)) for d in readwise_response]也就是说,每条高亮对应一个Document,其正文是整条高亮记录(含标题、作者、来源 URL、高亮文本、标签等字段)的 JSON 序列化字符串。这样的设计保留了原始结构化信息,但也意味着后续切分(NodeParser)会直接作用在这段 JSON 文本上,对高亮内容做相似度检索时效果取决于原始字段的语义密度。
七、单元测试验证
仓库在 tests/test_readers_readwise.py 中提供了针对该 Reader 的测试,验证其类继承关系:
from llama_index.core.readers.base import BaseReader from llama_index.readers.readwise import ReadwiseReader def test_class(): names_of_base_classes = [b.__name__ for b in ReadwiseReader.__mro__] assert BaseReader.__name__ in names_of_base_classes该测试通过__mro__(方法解析顺序)断言ReadwiseReader确实是BaseReader的子类,从侧面印证了它与 LlamaIndex Core 数据读取抽象的一致性:任何接受BaseReader的 LlamaIndex 流程都可以直接替换为ReadwiseReader。
八、应用场景与注意事项
典型场景
- 个人知识库(PKM)检索:把 Kindle、网页、PDF 中的高亮汇总后建立索引,用自然语言提问"我读过的某本书里对 X 是怎么说的";
- 定期增量同步:配合
updated_after实现定时任务,只同步新增/变更的高亮,控制 Token 消耗与索引体积; - 多来源聚合:Readwise 天然聚合了多种阅读来源,一次拉取即可覆盖文章、书籍、视频等多种内容形态。
注意事项
- API Token 安全:Token 应通过环境变量或密钥管理服务注入,不要提交到版本库;
- 数据量:全量加载会一次性拉取所有历史高亮,首次建索引耗时较长,建议先用
updated_after限定范围; - Document 粒度:每个
Document是一条高亮记录的 JSON 序列化文本,若高亮数量极大,生成的 Document 数量也会很多,可结合 LlamaIndex 的文档后处理(如去重、Metadata 提取)优化索引质量; - 网络依赖:Reader 运行时需要访问 Readwise 的
api/v2/export/端点,离线环境无法使用。
九、参考文件
- 集成包说明文档:README.md
- Reader 源码实现:base.py
- 模块导出:init.py
- 单元测试:test_readers_readwise.py
- API 参考索引页:docs/api_reference/api_reference/readers/readwise.md
【免费下载链接】llama_indexLlamaIndex is the leading document agent and OCR platform项目地址: https://gitcode.com/GitHub_Trending/ll/llama_index
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考