目标

能够熟练把文件载入到系统中,生成Document 对象。


CSV

默认参数

1
2
3
4
5
6
7
loader = CSVLoader(file_path='./test/csv_test.csv')
data = loader.load()
[Document(page_content='姓名: 张三\n年龄: 23\n成绩: 优秀',
metadata={'source': './test/csv_test.csv', 'row': 0}),
Document(page_content='姓名: 里斯\n年龄: 26\n成绩: 良',
metadata={'source': './test/csv_test.csv', 'row': 1}),
Document(page_content='姓名: 王五\n年龄: 34\n成绩: 可', metadata={'source': './test/csv_test.csv', 'row': 2})]

加上参数

1
2
3
4
5
6
7
loader = CSVLoader(file_path='./test/csv_test.csv', csv_args={
'delimiter': ',',
'quotechar': '"',
'fieldnames': ['姓名', '年龄', '成绩']
})

data = loader.load()

每列前面加上fieldname

1
2
3
4
5
6
[Document(page_content='姓名: 姓名\n年龄: 年龄\n成绩: 成绩',
metadata={'source': './test/csv_test.csv', 'row': 0}),
Document(page_content='姓名: 张三\n年龄: 23\n成绩: 优秀',
metadata={'source': './test/csv_test.csv', 'row': 1}),
Document(page_content='姓名: 里斯\n年龄: 26\n成绩: 良', metadata={'source': './test/csv_test.csv', 'row': 2}),
Document(page_content='姓名: 王五\n年龄: 34\n成绩: 可', metadata={'source': './test/csv_test.csv', 'row': 3})]

指定一列来识别文档来源 使用source_column参数为每行创建的文档指定一个来源。否则,file_path将用作从CSV文件创建的所有文档的来源。当使用从CSV文件加载的文档来回答问题时,这很有用,这样可以在链条中使用来源。

1
2
3
4
5
6
7
 loader = CSVLoader(file_path='./test/csv_test.csv', source_column="姓名")
[Document(page_content='姓名: 张三\n年龄: 23\n成绩: 优秀',
metadata={'source': '张三\t', 'row': 0}),
Document(page_content='姓名: 里斯\n年龄: 26\n成绩: 良',
metadata={'source': '里斯', 'row': 1}),
Document(page_content='姓名: 王五\n年龄: 34\n成绩: 可',
metadata={'source': '王五', 'row': 2})]

从文件夹载入

安装

1
2
3
4
5
pip install unstructured
pip install "unstructured[md]"
loader = DirectoryLoader('./test', glob="**/*.md")

docs = loader.load()

显示进度条 show_progress=True

1
loader = DirectoryLoader('../', glob="**/*.md", show_progress=True)

使用多线程 use_multithreading=True 默认情况下,加载操作是在单个线程中进行的。为了利用多个线程,请将use_multithreading标志设置为true。

1
loader = DirectoryLoader('../', glob="**/*.md", use_multithreading=True)

修改loader类, 自动检测编码格式 ‘autodetect_encoding’: True

TXT

1
2
loader = DirectoryLoader('./test/', glob="**/*.txt", loader_cls=TextLoader,loader_kwargs={'autodetect_encoding': True})
docs = loader.load()

出错忽略,不打断整个载入过程 silent_errors=True

1
2
3
4
5
loader = DirectoryLoader('./test/', glob="**/*.txt", 
silent_errors=True
loader_cls=TextLoader,
loader_kwargs={'autodetect_encoding': True})
docs = loader.load()

Html

1
2
3
4
5
loader = UnstructuredHTMLLoader("./test/Langchain.html")
data = loader.load()
print(data)
[Document(page_content='\n\nModules\n\nRetrieval\...ulSoup4',
metadata={'source': './test/Langchain.html'})]

用BeautifulSoup4载入html

注意:需要设置 open_encoding=’utf-8’ 来应对gpk 解码错误

1
2
3
4
5
6
7
8
loader = BSHTMLLoader("./test/Langchain.html",open_encoding='utf-8')
data = loader.load()
print(data)
pass

# 输出
[Document(page_content='\n\nHTML | 🦜️🔗 Langchain... mepageBlogYouTubeCopyright © 2024 LangChain, Inc.\n\n\n',
metadata={'source': './test/Langchain.html', 'title': 'HTML | 🦜️🔗 Langchain'})]

Markdown

1
2
3
4
5
6
7
8
9
# MD
loader = UnstructuredMarkdownLoader('D:\\LLM\\my_projects\\leanr_django_rag\\day_try\\test\\md-test.md')
data = loader.load()
print(data)
pass

# 输出 ------
[Document(page_content='CSV\n\n默认参数\n\nPython\nl...',
metadata={'source': 'D:\\LLM\\my_projects\\leanr_django_rag\\day_try\\test\\md-test.md'})]

细颗粒度文本收集 mode=”elements”

1
2
3
4
5
6
loader = UnstructuredMarkdownLoader('D:\\LLM\\my_projects\\leanr_django_rag\\day_try\\test\\md-test.md',mode="elements")
[Document(page_content='CSV', ...
Document(page_content='默认参数', ..
Document(page_content="Python\nloader ..loader.load()",..
Document(page_content="Python\n[D... "
Document(page_content='加上参数', metadata={'source':

PDF

安装(虚拟环境)

1
2
3
4
5
pip install pypdf
loader = PyPDFLoader("test/pdf_带图带文字.pdf")
pages = loader.load_and_split()
print(pages[0])
pass

输出: 只解析了文字,没有识别图片中的文字

1
[Document(page_content="test pdf loader\n图⽚\x00闻\n午\x00时间\x00\x00吗\x00\n快\x00连锁\x00温\x00( Wendy's )否认\x00有\x00其\x00对其菜单实\x00\x00\x00\x00\x00的报\x00。\x00\x00\x00\x00是 Uber 和其\n他\x00业采⽤的⼀种策略,\x00在需\x00\x00加的任何时\x00提\x00\x00格。这\x00味\x00,\x00果温\x00的  Pretzel\nBaconators 需\x00\x00\x00,顾\x00可\x00需\x00\x00付更\x00的\x00格。\x00⽽,该\x00司\x00\x00说,\x00\x00实\x00的不是\x00\n\x00\x00\x00,⽽是\x00过其\x00的\x00\x00菜单\x00实⾏ “ 动态\x00\x00 ” 。这种动态\x00\x00策略\x00许温\x00在⼀\x00中较\x00的", metadata={'source': 'test/pdf_带图带文字.pdf', 'page': 0}), Document(page_content='时\x00显⽰\x00扣。需\x00\x00\x00的是,动态\x00\x00\x00\x00\x00\x00\x00不同,\x00不\x00\x00基于需\x00的涨\x00。相\x00,\x00使\n\x00业\x00\x00\x00据需\x00变\x00实时调\x00\x00格。这种\x00技术的\x00⽤\x00映\x00\x00\x00\x00业\x00据顾\x00需\x00优\x00\x00\x00策\n略的⽇\x00\x00⻓的趋势。', metadata={'source': 'test/pdf_带图带文字.pdf', 'page': 1})]

咋办 ?安装

1
pip install rapidocr-onnxruntime

带参数 extract_images=True

1
2
loader = PyPDFLoader("test/pdf_带图带文字.pdf",extract_images=True)
[Document(page_content='test pdf loader\n图⽚\x00闻\n午\x00时间\x00\x00吗\x00\n快\x00连锁\x00温\x00( Wendy\'s )否认\x00有\x00其\x00对其菜单实\x00\x00\x00\x00\x00的报\x00。\x00\x00\x00\x00是 Uber 和其\n他\x00业采⽤的⼀种策略,\x00在需\x00\x00加的任何时\x00提\x00\x00格。这\x00味\x00,\x00果温\x00的 Pretzel\nBaconators 需\x00\x00\x00,顾\x00可\x00需\x00\x00付更\x00的\x00格。\x00⽽,该\x00司\x00\x00说,\x00\x00实\x00的不是\x00\n\x00\x00\x00,⽽是\x00过其\x00的\x00\x00菜单\x00实⾏ “ 动态\x00\x00 ” 。这种动态\x00\x00策略\x00许温\x00在⼀\x00中较\x00的Timedforlunch?\nWendy\'s,afast-foodchain\ndeniedreportsthatitwould\nintroducesurgepricingforits\nmenu.Surgepricingisusedby\nUberandotherbusinessesto\nraisepriceswhendemand\nincreasesatanygiventime,so\ncustomersatWendy\'swould\npaymoreiftherewasasurge\nindemandforitsPretzel\nBaconators.Thecompanysaid\nthatinsteaditsnewdigital\nmenuboardswouldbringin\n"dynamicpricing”,whichis\nnotsurgepricing,itinsisted,\nbutallowsittodisplaydis-\ncounts“particularlyinthe\nslowertimesofday"New\ntechnologyisincreasingly\nallowingmanybusinessesto\nadjusttheirpricesinrealtime\ntochangesindemand.', metadata={'source': 'test/pdf_带图带文字.pdf', 'page': 0}), Document(page_content='时\x00显⽰\x00扣。需\x00\x00\x00的是,动态\x00\x00\x00\x00\x00\x00\x00不同,\x00不\x00\x00基于需\x00的涨\x00。相\x00,\x00使\n\x00业\x00\x00\x00据需\x00变\x00实时调\x00\x00格。这种\x00技术的\x00⽤\x00映\x00\x00\x00\x00业\x00据顾\x00需\x00优\x00\x00\x00策\n略的⽇\x00\x00⻓的趋势。', metadata={'source': 'test/pdf_带图带文字.pdf', 'page': 1})]

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import os
import uuid

from langchain.memory import ConversationBufferMemory
from langchain_community.chat_models.azure_openai import AzureChatOpenAI
from langchain_community.chat_models.baidu_qianfan_endpoint import QianfanChatEndpoint
from langchain_community.document_loaders.csv_loader import CSVLoader
from langchain_community.document_loaders.directory import DirectoryLoader
from langchain_community.document_loaders.html import UnstructuredHTMLLoader
from langchain_community.document_loaders.html_bs import BSHTMLLoader
from langchain_community.document_loaders.markdown import UnstructuredMarkdownLoader
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.document_loaders.pdf import MathpixPDFLoader
from langchain_community.document_loaders.text import TextLoader
from langchain_community.embeddings import QianfanEmbeddingsEndpoint
from langchain_community.llms.baidu_qianfan_endpoint import QianfanLLMEndpoint
from langchain_community.vectorstores.chroma import Chroma
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.output_parsers import StrOutputParser, CommaSeparatedListOutputParser
from langchain_core.prompt_values import ChatPromptValue
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnablePassthrough, RunnableParallel, RunnableLambda, ConfigurableField

from operator import itemgetter
from langchain_core.pydantic_v1 import BaseModel, Field


if __name__ == '__main__':

# CSV
loader = CSVLoader(file_path='./test/csv_test.csv')
data = loader.load()

loader = CSVLoader(file_path='./test/csv_test.csv', csv_args={
'delimiter': ',',
'quotechar': '"',
'fieldnames': ['姓名', '年龄', '成绩']
})

data = loader.load()
print(data)

loader = CSVLoader(file_path='./test/csv_test.csv', source_column="姓名")
data = loader.load()
print(data)
pass

# 从文件夹载入
loader = DirectoryLoader('./test', glob="**/*.md")
docs = loader.load()
len(docs)
pass

# 显示进度条
loader = DirectoryLoader('../', glob="**/*.md", show_progress=True)
docs = loader.load()
pass

# 多线程
loader = DirectoryLoader('../', glob="**/*.md", use_multithreading=True)
docs = loader.load()
pass

# 使用不同的loader
loader = DirectoryLoader('./test/', glob="**/*.txt", loader_cls=TextLoader,loader_kwargs={'autodetect_encoding': True})
docs = loader.load()
pass

# HTML
loader = UnstructuredHTMLLoader("./test/Langchain.html")
data = loader.load()
print(data)
pass

loader = BSHTMLLoader("./test/Langchain.html",open_encoding='utf-8')
data = loader.load()
print(data)
pass

# MD
loader = UnstructuredMarkdownLoader('D:\\LLM\\my_projects\\leanr_django_rag\\day_try\\test\\md-test.md')
data = loader.load()
print(data)
pass

loader = UnstructuredMarkdownLoader('D:\\LLM\\my_projects\\leanr_django_rag\\day_try\\test\\md-test.md',mode="elements")
data = loader.load()
print(data)
pass

# PDF
loader = PyPDFLoader("test/pdf_带图带文字.pdf")
pages = loader.load_and_split()
print(pages[0])
pass

loader = PyPDFLoader("test/pdf_带图带文字.pdf",extract_images=True)
pages = loader.load_and_split()
print(pages[0])