咨询基于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
相关产品推荐
相关产品推荐

