You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询基于LangChain从PDF提取全量商品信息的最优模型与方法

解决方案

问题1:文档开头条目被跳过的修复方法

  • 替换CharacterTextSplitter为RecursiveCharacterTextSplitter:按换行、段落标记等分隔符分层拆分,避免粗暴切割导致开头条目被截断;
  • 增加chunk_overlap参数:设置100-200字符的块重叠长度,确保跨块的商品条目不会被忽略;
  • 自定义拆分规则:如果商品条目有固定开头(如“商品编号:”),以此作为分隔符拆分文本,从根源避免条目跨块丢失。

问题2:Token限制导致条目提取不全的解决方法

  • 使用Map-Reduce链:先对每个文本块单独提取条目,再合并所有结果,规避单请求Token上限;
  • 分页式增量提取:用集合记录已提取的商品编号,后续块处理时跳过已提取内容;
  • 切换长上下文模型:改用gpt-3.5-turbo-16k或gpt-4-32k,减少文本拆分块数,提升单次提取效率。

代码实现示例

1. 自定义商品条目拆分器

from langchain.text_splitter import RecursiveCharacterTextSplitter

# 以"商品编号:"为分隔符拆分文本
splitter = RecursiveCharacterTextSplitter(
    separators=["\n商品编号:"],
    chunk_size=2000,
    chunk_overlap=200,
    length_function=len
)

# 拆分OCR提取的文本,补回被拆分掉的开头标记
texts = splitter.split_text(ocr_extracted_text)
texts = ["商品编号:" + text if not text.startswith("商品编号:") else text for text in texts]

2. Map-Reduce链批量提取所有条目

from langchain.chat_models import ChatOpenAI
from langchain.chains.summarize import load_summarize_chain
from langchain.docstore.document import Document
from langchain.prompts import PromptTemplate

# 初始化长上下文模型
llm = ChatOpenAI(model_name="gpt-3.5-turbo-16k", temperature=0)

# 转换文本块为Document对象
docs = [Document(page_content=text) for text in texts]

# 定义单块提取提示词
map_prompt = PromptTemplate(
    template="""请从以下文本中提取所有商品信息,每条商品按JSON格式输出,包含字段:商品编号、商品名称、单价、规格。不要遗漏任何条目:\n{text}""",
    input_variables=["text"]
)

# 定义合并结果提示词
combine_prompt = PromptTemplate(
    template="""请合并以下所有商品条目,按商品编号去重,最终输出完整的商品列表JSON:\n{text}""",
    input_variables=["text"]
)

# 加载Map-Reduce链并执行
chain = load_summarize_chain(llm, chain_type="map_reduce", map_prompt=map_prompt, combine_prompt=combine_prompt)
result = chain.run(docs)
print(result)

3. 分页式增量提取(避免重复)

import json
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
extracted_ids = set()
final_items = []

for text in texts:
    prompt = f"""请从以下文本中提取所有未被提取过的商品信息,每条商品按JSON格式输出,包含字段:商品编号、商品名称、单价、规格。已提取的商品编号:{', '.join(extracted_ids)}。文本内容:\n{text}"""
    response = llm.predict(prompt)
    
    # 解析返回结果并去重
    items = json.loads(response)
    for item in items:
        if item["商品编号"] not in extracted_ids:
            extracted_ids.add(item["商品编号"])
            final_items.append(item)

# 输出最终结果
print(json.dumps(final_items, ensure_ascii=False, indent=2))

关键提取指令模板

请从当前文本块中提取所有商品信息,每条商品以JSON格式呈现,必须包含字段:商品编号、商品名称、单价、规格。严格按照文本内容提取,不得遗漏任何条目,即使条目信息不完整也要如实记录。如果当前块无商品信息,输出空数组[]。


内容的提问来源于stack exchange,提问作者Webster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:05:06