尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
被LangChain的Document对象坑了3小时,我总结了两种解法,建议收藏
你是不是也遇到过这种情况明明只是想把PDF解析后的文本拼起来结果发现输出根本不是JSONjson.loads直接报错事情是这样的最近在做LangChain项目用PDF解析器把一份公司员工手册拆成了多个Document对象准备把内容按页码拼成完整文本。逻辑很简单对吧遍历列表、取page_content、拼接就完事了。但问题来了——输出长这样[Document(metadata{pk: 12, page: 2}, page_content2. 费用报销业务活动中产生的费用...), Document(metadata{pk: 27, page: 2}, page_content...), Document(metadata{pk: 14, page: 3}, page_content...)]乍一看像JSON仔细一看——Document()是Python类实例单引号字典\n转义符混杂其中。我第一反应是json.loads()结果JSONDecodeError: Expecting value: line 1 column 2 (char 1)报错了。因为JSON标准只认双引号、[]、{}根本不认识Document()这种Python对象写法。坑在哪里90%的人第一步就走错了很多人包括我第一反应是用正则硬拆或者eval()一把梭。千万别用eval()。eval()会执行任意Python代码如果字符串里有恶意内容你的系统就直接裸奔了。这不是技术风格问题是安全问题。解法一ast.literal_eval强烈推荐Python标准库里有个被严重低估的模块——ast。ast.literal_eval()可以安全地解析Python字面量字符串只认列表、字典、元组、字符串、数字这些基本类型不会执行任何代码。import ast from langchain.schema import Document ​ # 原始字符串 raw_str [Document(metadata{pk: 12, page: 2}, page_content...)] ​ # 一步到位安全解析 doc_list ast.literal_eval(raw_str) ​ # 遍历提取 all_pages [] all_content ​ for doc in doc_list: page_num doc.metadata[page] content doc.page_content all_pages.append(page_num) all_content content \n\n ​ print(所有页码, all_pages) print(拼接文本\n, all_content)输出结果所有页码[2, 2, 3] 拼接文本 2. 费用报销业务活动中产生的费用... ...为什么推荐这个方案优势说明安全性不执行任意代码生产环境可用完整性得到完整的Document对象metadata、page_content随便取零依赖Python标准库不需要额外安装兼容性只要字符串是合法的Python字面量就能解析解法二正则提取轻量无依赖如果你的环境装不了LangChain或者只需要提取文本和页码不需要完整的Document对象正则也能搞定。import re ​ raw_str [Document(metadata{pk: 12, page: 2}, page_content...)] ​ # 提取页码 page_pattern re.compile(rpage: (\d)) page_nums [int(m.group(1)) for m in page_pattern.finditer(raw_str)] ​ # 提取内容 content_pattern re.compile(rpage_content(.*?), re.S) content_list [m.group(1) for m in content_pattern.finditer(raw_str)] ​ # 拼接 full_text \n\n.join(content_list) ​ print(页码列表, page_nums) print(拼接全文\n, full_text)适用场景不想装LangChain的轻量项目只需要文本内容不关心metadata其他字段字符串格式不标准ast.literal_eval也解析不了时进阶技巧按页码去重仔细看上面的数据你会发现page2出现了两次pk12和pk27内容一模一样——这是PDF解析时常见的重复分块问题。直接拼接会导致内容重复解决办法是按页码去重page_content_map {} ​ for doc in doc_list: p doc.metadata[page] if p not in page_content_map: page_content_map[p] doc.page_content ​ # 按页码排序后拼接 sorted_text \n\n.join([ page_content_map[p] for p in sorted(page_content_map.keys()) ])这样每页只保留一份内容按顺序拼成完整文本干净利落。三种方案的对比场景推荐方案原因本地LangChain项目ast.literal_eval完整保留Document对象字段随取随用无第三方依赖环境正则提取零依赖轻量灵活有重复数据需要清洗ast.literal_eval 去重先解析再清洗逻辑最清晰写在最后LangChain的Document对象输出格式是个经典坑。很多人第一次遇到都会下意识用json.loads()然后碰壁。记住这个判断逻辑看到Document(metadata{...}, page_content...)这种格式 → 不是JSON → 用ast.literal_eval简单、安全、可靠。如果你也在做RAG项目、文档解析、知识库搭建这篇文章建议收藏。早晚用得上。你有遇到过类似的解析坑吗评论区聊聊你的解法。关注我持续分享LangChain实战中的踩坑经验和高效解法。
RELATED

相关推荐

深入解析大语言模型推理内核:从Transformer原理到KV Cache优化实践

深入解析大语言模型推理内核:从Transformer原理到KV Cache优化实践

1. 从“黑箱”到“白盒”:为什么我们需要拆解LLM的运行内核如果你和我一样,在过去一年里频繁地与各种大语言模型打交道,无论是用它们写代码、分析文档,还是进行创意对话,一个挥之不去的疑问可能会时常浮现:…

📅 2026/9/8 0:10:51
王者荣耀百姓杯战术复盘:从BP到风暴龙王的团队决策博弈

王者荣耀百姓杯战术复盘:从BP到风暴龙王的团队决策博弈

这次我们来看一场《王者荣耀》全民赛事“百姓杯”的精彩对决,分析AAA战队与LOST星战队的战术博弈。对于想提升游戏理解、学习团队配合的玩家来说,职业或半职业比赛的复盘是最高效的教材。本文将深度解析这场对局,从BP(禁选英雄&am…

📅 2026/8/25 9:35:37
OpenClaw智能体架构解析:从大模型驱动到自动化流程引擎的实践

OpenClaw智能体架构解析:从大模型驱动到自动化流程引擎的实践

1. 从“智能体”热潮到OpenClaw:我们到底在交互什么?最近几个月,AI圈子里“Agent”这个词的热度,几乎要盖过大模型本身了。从各种“AutoGPT”的变种,到宣称能自动完成复杂任务的智能体框架,再到像OpenClaw这…

📅 2026/9/20 21:13:54
MORE NEWS

更多资讯

📰

大脑的预知时刻:海马体如何在看见之前提前编码视觉信息

第一次在颅内电极记录里看到海马体在视觉刺激出现之前就已经出现选择性放电时,我揉了揉眼睛。海马体不是记忆系统的主角吗?它怎么会在“看见”之前就提前动作?这篇发表于Science Advances的工作,核心就是这件事——研究者通过记录…

📰

大模型驱动分支定界自动化:搜索树语义理解与策略生成

1. 项目概述:这不是在调参,是在给优化器装上“AI大脑”ICML2026上这篇题为《利用大模型自动设计分支定界模块》的工作,表面看是个算法工程问题,实则踩中了运筹优化与大模型交叉领域的关键命门——我们终于开始让大模型不只当“答题…

📰

大脑的预测引擎:海马体如何提前生成视觉预期

海马体这个区域,以前我在做记忆研究时几乎天天和它打交道,但坦白说,当时更多人把它当成“情景记忆的仓库”。直到后来接触到预测编码这一整套理论,才意识到海马体在“预测即将看到的事物”这件事上扮演的角色,可能比我…

📰

Java常用工具类实战:集合、字符串与日期处理指南

做开发这些年,我有个习惯:看别人家的代码好不好,先看他怎么处理字符串、集合、空对象这些“小事”。很多看起来高大上的业务代码,最后都栽在没用好常用工具类上。这里的“常用工具类”不是指某个神秘框架,而是那些每天…

📰

在线课堂微信小程序管理系统:毕业设计选题与全栈实现指南

1. 选题的第一课:为什么"在线课堂"比"直播平台"更适合毕业设计每年带毕设我都会遇到一批把题目定得特别大的学生,什么"基于大数据的智能学习平台""AI驱动的一体化教育系统",听起来很唬人&#xff0c…

📰

Flask实现汽车用品进销存系统:数据库设计、业务闭环与部署实战

做过一阵子汽车用品批发门店的系统,最大的感受是:这种业务看着简单,真做起来全是细节。进销存这三个字,往小说是管商品、管进出、管库存,往大了做要管采购订单、销售单据、往来账款、盘点调拨,甚至每个SKU的…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬