RAG 中的数据导入
2026/5/15 6:27:11 网站建设 项目流程

数据导入是 RAG 系统是否能够成功的前提,这篇文章先介绍对简单的数据加载,后续着重介绍 pdf 和 表格 等数据的加载。

1. 纯文本读取为 Document

importosfromlangchain_community.document_loadersimportTextLoader script_dir=os.path.dirname(__file__)file_dir=os.path.join(script_dir,'../../*.txt')loader=TextLoader(file_dir)documents=loader.load()

2. 手动创建 document 对象

fromlangchain_core.documentsimportDocument documents=[Document(page_content="悟空是大师兄",metadata={"source":"师徒四人.txt"}),Document(page_content="八戒是二师兄",metadata={"source":"师徒四人.txt"}),]

3. 读取目录下面不同格式的所有文件

importosfromlangchain_community.document_loadersimportDirectoryLoader script_dir=os.path.dirname(__file__)data_dir=os.path.join(script_dir,'../../data')loader=DirectoryLoader(data_dir)docs=loader.load()print(f"文档数:{len(docs)}")

可以设置 DirectoryLoader 的参数
loader = DirectoryLoader(data_dir, glob="**/*.md", use_multithreading=True, show_progress=True)
“**/*.md” 的意思是:递归地找出该目录下所有 Markdown 文件
也可以指定加载器:
loader = DirectoryLoader(data_dir, glob="**/*.md", loader_cls=TextLoader)# 强制所有匹配到的文件都使用纯文本加载器来读取
避免不可避免的错误:silent_errors=True

4. 查看文件的元数据

fromunstructured.partition.textimportpartition_text elements=partition_text("90-文档-Data/*/设定.txt")fori,elementinenumerate(elements):print(f"\n--- Element{i+1}---")print(f"类型:{type(element)}")print(f"元素类型:{element.__class__.__name__}")print(f"文本内容:{element.text}")# 元数据展示ifhasattr(element,'metadata'):print("元数据:")metadata=vars(element.metadata)# metadata_dict = element.metadata.__dict__ # 两种方式valid_metadata={k:vfork,vinmetadata.items()ifnotk.startswith('_')andvisnotNone}forkey,valueinvalid_metadata.items():print(f"{key}:{value}")""" --- Element 3 --- 类型: <class 'unstructured.documents.elements.Title'> 元素类: Title 文本内容: 游戏的设定融合了中国的文化和自然地标。例如重庆的大足石刻、山西省的小西天、南禅寺、铁佛寺、广胜寺和鹳雀楼等,都在游戏中出现。游戏也融入了佛教和道教的哲学元素。 元数据: last_modified: 2026-05-14T08:56:02 languages: ['zho'] file_directory: 90-文档-Data/黑悟空 filename: 设定.txt filetype: text/plain """

5. 加载 json 文件

fromlangchain_community.document_loadersimportTextLoader,JSONLoader# 将 json 视为纯文本加载print("=== TextLoader 加载结果 ===")text_loader=TextLoader("90-文档-Data/灭神纪/人物角色.json")text_documents=text_loader.load()print(text_documents)# 结构化的加载方式print("=== JSONLoader 加载结果 ===")print("1. 主角信息:")main_loader=JSONLoader(file_path="90-文档-Data/灭神纪/人物角色.json",jq_schema='.mainCharacter | "姓名:" + .name + ",背景:" + .backstory',text_content=True)main_char=main_loader.load()print(main_char)print("\n2. 支持角色信息:")support_loader=JSONLoader(file_path="90-文档-Data/灭神纪/人物角色.json",jq_schema='.supportCharacters[] | "姓名:" + .name + ",背景:" + .background',text_content=True)support_chars=support_loader.load()print(support_chars)

6. 加载网页内容

# 使用WebBaseLoader加载网页importbs4fromlangchain_community.document_loadersimportWebBaseLoader# 只解析文章的主体部分loader=WebBaseLoader(web_paths=["https://blog.csdn.net/weixin_42019995/article/details/161080139?spm=1011.2415.3001.5331"],bs_kwargs={"parse_only":bs4.SoupStrainer(id="blogHuaweiyunAdvert"),},# bs_get_text_kwargs={"separator": " | ", "strip": True},)docs=[]docs=loader.load()

7. 加载 markdown 格式

fromlangchain_community.document_loadersimportUnstructuredMarkdownLoader loader=UnstructuredMarkdownLoader("90-文档-Data/黑悟空/黑悟空版本介绍.md",mode="elements")data=loader.load()print(data[0].page_content[:250])# data[0] 就是文章的完整版print(f"Number of documents:{len(data)}\n")

8. 非结构化加载(用于加载网页文件、图像)

# UnstructuredLoaderfromlangchain_unstructuredimportUnstructuredLoader loader=UnstructuredLoader(web_url="https://baike.baidu.com/item/%E9%BB%91%E7%A5%9E%E8%AF%9D%EF%BC%9A%E6%82%9F%E7%A9%BA/53303078?fromModule=lemma_search-box")docs=loader.load()fordocindocs[:5]:print(f'{doc.metadata["category"]}:{doc.page_content}')# image 加载fromlangchain_community.document_loadersimportUnstructuredImageLoader loader=UnstructuredImageLoader("90-文档-Data/黑悟空/黑悟空英文.jpg")data=loader.load()# 会自动下载 yolox_l0.05.onnx# ppt 加载""" Q: 在使用 unstructured 解析 PPT 等 Office 文件时,如果出现 FileNotFoundError: soffice command was not found 错误怎么办? A: 这是因为系统中缺少 libreoffice。unstructured 需要调用 libreoffice 的 soffice 命令来处理 Office 文档。 解决方案是在系统中安装 libreoffice。 在 Debian/Ubuntu 系统中,可以使用以下命令安装: sudo apt-get update && sudo apt-get install -y libreoffice """fromunstructured.partition.pptimportpartition_ppt# 解析 PPT 文件ppt_elements=partition_ppt(filename="90-文档-Data/黑悟空/黑神话悟空.pptx")fromlangchain_core.documentsimportDocument# 转换为 Documents 数据结构documents=[Document(page_content=element.text,metadata={"source":"data/黑神话悟空PPT.pptx"})forelementinppt_elements]]

9. 加载 pdf 的一种方式–多模态大模型

先使用 pdf2image 将 pdf 逐页转成 image 然后使用 base64 将图片转成 base64 格式;最后传入多模态大模型即可。

frompdf2imageimportconvert_from_pathimportbase64importosfromopenaiimportOpenAIfromdotenvimportload_dotenv load_dotenv()# 初始化 OpenAI 客户端client=OpenAI(base_url="http://localhost:11434/v1",# Ollama 本地地址api_key="ollama"# 任意非空字符串即可)output_dir="temp_images"# 1. PDF 转图片ifnotos.path.exists(output_dir):os.makedirs(output_dir)images=convert_from_path("90-文档-Data/黑悟空/黑神话悟空.pdf")image_paths=[]fori,imageinenumerate(images):image_path=os.path.join(output_dir,f'page_{i+1}.jpg')image.save(image_path,'JPEG')image_paths.append(image_path)print(f"成功转换{len(image_paths)}页")# 2. GPT-4o 分析图片print("\n开始分析图片...")results=[]forimage_pathinimage_paths:withopen(image_path,"rb")asimage_file:base64_image=base64.b64encode(image_file.read()).decode('utf-8')response=client.chat.completions.create(model="llava:13b",# 换成你拉取的模型名messages=[{"role":"user","content":[{"type":"text","text":"请详细描述这张PPT幻灯片的内容,包括标题、正文和图片内容。"},{"type":"image_url","image_url":{"url":f"data:image/jpeg;base64,{base64_image}"}}]}],max_tokens=300)results.append(response.choices[0].message.content)# 3. 转换为 LangChain 的 Document 数据结构fromlangchain_core.documentsimportDocument documents=[Document(page_content=result,metadata={"source":"data/黑悟空/黑神话悟空.pdf","page_number":i+1})fori,resultinenumerate(results)]# 输出所有生成的 Document 对象print("\n分析结果:")fordocindocuments:print(f"内容:{doc.page_content}\n元数据:{doc.metadata}\n")print("-"*80)# 清理临时文件forimage_pathinimage_paths:os.remove(image_path)os.rmdir(output_dir)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询