← 返回首页
RAG的文本加载
发表时间:2025-05-16 03:24:41
RAG的文本加载

1.RAG的文本加载

langchain提供了一些文本加载器,使用文档加载器可以从源加载数据转换为Document。Document包含两个属性page_content(文本)和metadata=(元数据,即来源、标题等等)。

langchain支持以下类型文本的加载:

2.RAG文本加载实例

# """加载TXT"""

from langchain_community.document_loaders import TextLoader

txt_loader = TextLoader("./assets/test.txt", encoding="UTF-8")
txt_data = txt_loader.load()
print(txt_data)

# """加载CSV"""
from langchain_community.document_loaders import CSVLoader

csv_loader = CSVLoader(file_path="./assets/test.csv", encoding="UTF-8")
csv_data = csv_loader.load()
print(csv_data)

# """加载PDF"""
# pip install pypdf
from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("./assets/test.pdf")
pages = loader.load_and_split()  # 按页面分割 PDF
print(pages)

"""加载markdown"""
# pip install unstructured
# pip install markdown
from langchain_community.document_loaders import UnstructuredMarkdownLoader

loader = UnstructuredMarkdownLoader(file_path="./assets/lesson.md", mode="elements")
data = loader.load()
print(data)

# """加载JSON"""
# pip install jq
from langchain_community.document_loaders import JSONLoader

loader = JSONLoader(file_path="./assets/test.json", jq_schema=".skills")
data = loader.load()
print(data)

"""加载HTML"""

from langchain_community.document_loaders import UnstructuredHTMLLoader

loader = UnstructuredHTMLLoader("./assets/test.html", encodings="UTF-8")
data = loader.load()
print(data)

from langchain_community.document_loaders import BSHTMLLoader

loader1 = BSHTMLLoader("./assets/test.html", open_encoding="UTF-8")
data1 = loader1.load()
print(data1)

运行效果:

[Document(metadata={'source': './assets/test.txt'}, page_content='第一章\n\n在西天取经的几百年前,黑风山上有一只黑熊精占山为王,自称黑风大王。\n\n有一天,黑熊精碰到了一个小和尚。他觉得这个小和尚蛮有趣,于是给了他一些金银财宝,又教给他一些长生的法门。这个小和尚就是后来的金池长老,二人从此结缘。\n\n在这之后,金池也给黑熊精讲一些佛法,黑熊精也有点兴趣,二人也算是有共同话题的朋友。\n\n金池一路坐到观音禅院的长老(毕竟学过长生术,活的最久),受人顶礼膜拜,欲望也随之膨胀。\n\n黑熊精手下有一个是苍狼精,起了个道号叫凌虚子。还有一个是白花蛇怪,一般称呼为白衣秀士。二人虽都和黑熊精结拜,但二者各有派别。凌虚子管着一群狼妖,而白衣秀士则管着一群蛇妖。\n\n凌虚子手下有个小狼妖,想修习佛教。凌虚子是个心地善良的妖怪,有心成全他,就和黑熊精提,黑熊精把这小狼妖介绍到了观音禅院。金池给他起了个法名叫“广谋”。广谋变化作一个小和尚,在禅院里修行得挺安稳。\n\n这事儿传到了白衣秀士耳中。那白衣秀士是个心思缜密之人,生怕凌虚子和金池在暗地里研究些什么,怕对自己不利,因此也找了个小蛇精变成人形,送进了观音禅院。这个小蛇精法名“广智”。\n\n之后取经队伍到了,金池贪图唐僧的袈裟,广谋虽然想修佛,但毕竟是妖怪,对杀人越货的勾当完全不当回事,出了个主意杀掉唐僧。广智则心思缜密,提出放火更容易掩人耳目。于是金池照办,全禅院都搬柴放火。\n\n可是隔墙有耳,他们的计谋被孙悟空听见了。孙悟空将计就计,借了防火罩护住唐僧,又添了把风把观音禅院付之一炬,很多众被焚烧致死。金池长老撞墙自杀(所以游戏里的幽魂,头部是弱点,头部受重击就倒地),广谋、广智逃离。\n\n黑熊精本来是来救火,结果顺走了袈裟,并因此和取经团队发生了冲突。最后被观音套上金箍圈后收去,当了守山大神。至于凌虚子和白衣秀士则被打死了。\n\n西天取经后,序章故事发生,观音菩萨派黑熊精参与了围剿孙悟空。其实黑熊精不想去,反而善财童子(红孩儿)挺想去的,只是观音指名,黑熊精不敢违背。\n\n孙悟空死后,作为报酬,黑熊精终于摘掉了金箍咒,得到了悟空的六根之一,回到了黑风山。\n\n黑熊精试图炼化孙悟空的遗物,但却因法力不够始终无法炼化,于是把遗物供奉在塔顶,用来吸引妖怪做他手下。\n\n这时的黑风山已有百年的时间群龙无首,黑熊精知道光靠蛮力和吸引力很难统合这些妖怪,于是做了一系列举动。不过因为他智力不高,所以这些主意效果也不是很好。\n\n首先他用南海学来的法术把凌虚子复活——但这个法术需要用凌虚子的同族活祭,而且凌虚子以后都要吸食同族的鲜血过活。凌虚子复活后接受不了,上吊自尽了。避火罩本来被黑熊精找到送给凌虚子,也就当给凌虚子陪葬了。\n\n黑熊精见这招不合适,又扶持了一个够强的狼妖,给他起名灵虚子(和凌虚子音同字不同,可能也是黑熊精没啥文化)。但这灵虚子是从狮驼国跑过来的外来户,而且修炼法门过于血腥暴力,引起黑风山本地狼妖的不满,并最终差点引起灵虚子对本地狼妖的大屠杀。不过最终被新任蛇妖统领白衣秀士阻止。\n\n黑熊精对这些事有种无力感,于是重建观音禅院,想用复活凌虚子的法术复活金池长老,以解寂寞。没想到金池的魂魄依然惦记着他生前藏着的财物,没有复活到肉身之上,而是复活到了财物上,成了一个精神不正常的大头怪物。\n\n这期间还发生了一件小事:\n\n黑风山的土地遇到一个老道士。老道士和土地相谈甚欢,然后教了土地定身法和聚形散气等技能。\n\n土地问你为什么教我这个?老道士说,将来会有一个天命人路过此地,我不方便见他,请你代我把这两招传授给他。说完就架云飞走了。\n\n飞走的时候,掉下了一片菩提叶。')]
[Document(metadata={'source': './assets/test.csv', 'row': 0}, page_content='\ufeff章节: 第一章\n内容: 在西天取经的几百年前,黑风山上有一只黑熊精占山为王,自称黑风大王。\n\n有一天,黑熊精碰到了一个小和尚。他觉得这个小和尚蛮有趣,于是给了他一些金银财宝,又教给他一些长生的法门。这个小和尚就是后来的金池长老,二人从此结缘。\n\n在这之后,金池也给黑熊精讲一些佛法,黑熊精也有点兴趣,二人也算是有共同话题的朋友。\n\n金池一路坐到观音禅院的长老(毕竟学过长生术,活的最久),受人顶礼膜拜,欲望也随之膨胀。\n\n黑熊精手下有一个是苍狼精,起了个道号叫凌虚子。还有一个是白花蛇怪,一般称呼为白衣秀士。二人虽都和黑熊精结拜,但二者各有派别。凌虚子管着一群狼妖,而白衣秀士则管着一群蛇妖。\n\n凌虚子手下有个小狼妖,想修习佛教。凌虚子是个心地善良的妖怪,有心成全他,就和黑熊精提,黑熊精把这小狼妖介绍到了观音禅院。金池给他起了个法名叫“广谋”。广谋变化作一个小和尚,在禅院里修行得挺安稳。\n\n这事儿传到了白衣秀士耳中。那白衣秀士是个心思缜密之人,生怕凌虚子和金池在暗地里研究些什么,怕对自己不利,因此也找了个小蛇精变成人形,送进了观音禅院。这个小蛇精法名“广智”。\n\n之后取经队伍到了,金池贪图唐僧的袈裟,广谋虽然想修佛,但毕竟是妖怪,对杀人越货的勾当完全不当回事,出了个主意杀掉唐僧。广智则心思缜密,提出放火更容易掩人耳目。于是金池照办,全禅院都搬柴放火。\n\n可是隔墙有耳,他们的计谋被孙悟空听见了。孙悟空将计就计,借了防火罩护住唐僧,又添了把风把观音禅院付之一炬,很多众被焚烧致死。金池长老撞墙自杀(所以游戏里的幽魂,头部是弱点,头部受重击就倒地),广谋、广智逃离。\n\n黑熊精本来是来救火,结果顺走了袈裟,并因此和取经团队发生了冲突。最后被观音套上金箍圈后收去,当了守山大神。至于凌虚子和白衣秀士则被打死了。\n\n西天取经后,序章故事发生,观音菩萨派黑熊精参与了围剿孙悟空。其实黑熊精不想去,反而善财童子(红孩儿)挺想去的,只是观音指名,黑熊精不敢违背。\n\n孙悟空死后,作为报酬,黑熊精终于摘掉了金箍咒,得到了悟空的六根之一,回到了黑风山。\n\n黑熊精试图炼化孙悟空的遗物,但却因法力不够始终无法炼化,于是把遗物供奉在塔顶,用来吸引妖怪做他手下。\n\n这时的黑风山已有百年的时间群龙无首,黑熊精知道光靠蛮力和吸引力很难统合这些妖怪,于是做了一系列举动。不过因为他智力不高,所以这些主意效果也不是很好。\n\n首先他用南海学来的法术把凌虚子复活——但这个法术需要用凌虚子的同族活祭,而且凌虚子以后都要吸食同族的鲜血过活。凌虚子复活后接受不了,上吊自尽了。避火罩本来被黑熊精找到送给凌虚子,也就当给凌虚子陪葬了。\n\n黑熊精见这招不合适,又扶持了一个够强的狼妖,给他起名灵虚子(和凌虚子音同字不同,可能也是黑熊精没啥文化)。但这灵虚子是从狮驼国跑过来的外来户,而且修炼法门过于血腥暴力,引起黑风山本地狼妖的不满,并最终差点引起灵虚子对本地狼妖的大屠杀。不过最终被新任蛇妖统领白衣秀士阻止。\n\n黑熊精对这些事有种无力感,于是重建观音禅院,想用复活凌虚子的法术复活金池长老,以解寂寞。没想到金池的魂魄依然惦记着他生前藏着的财物,没有复活到肉身之上,而是复活到了财物上,成了一个精神不正常的大头怪物。\n\n这期间还发生了一件小事:\n\n黑风山的土地遇到一个老道士。老道士和土地相谈甚欢,然后教了土地定身法和聚形散气等技能。\n\n土地问你为什么教我这个?老道士说,将来会有一个天命人路过此地,我不方便见他,请你代我把这两招传授给他。说完就架云飞走了。\n\n飞走的时候,掉下了一片菩提叶。'), Document(metadata={'source': './assets/test.csv', 'row': 1}, page_content='\ufeff章节: 第二章\n内容: 西方有个流沙国,据说是极西日落之处。每到日落之时,太阳落在海里,声音巨大,震杀小儿。于是灵山赐了一个大鼓给他们,让他们每日申酉时分擂鼓,以鼓声抵御,于是流沙国得以平安,百姓纷纷塑金身敬佛。\n\n流沙国国王发现百姓敬佛不敬王,心生恐惧,于是颁布禁佛令,并在这期间把国名改为斯哈哩国。\n\n灵山对此很不高兴,于是灵吉菩萨派了巨虫蝜蝂到斯哈哩国边境。不擂鼓方罢,一旦擂鼓,蝜蝂就出来大闹一场。意思也很明确:你既然不信我,就别用我给你的鼓。要用我就收拾你。\n\n斯哈哩国派兵前往,却根本无法与之对抗。\n\n就在斯哈哩国有灭国之危时,黄风怪带着手下虎先锋路过斯哈哩国,发现蝜蝂身上似有无上佛力,加上觉得当地百姓凄惨,于是出手与蝜蝂大战。不过蝜蝂身上有定风丹,这玩意克制黄风怪,也让黄风怪颇为棘手才顺利搞定它。\n\n斯哈哩国国王非常感谢黄风怪,并邀请他留在斯哈哩国。正好黄风怪缺一个修炼的地方,就同意了。国王尊黄风怪为国师。\n\n黄风怪本为貂鼠,对鼠类的遭遇深感同情(但貂鼠应该是貂类而非鼠类,我怀疑游戏科学是故意混淆了这点,要么就是考虑到古代人分不清),于是向国王提议善待鼠类。国王同意,并颁布了“敬鼠令”。\n\n敬鼠令一颁布,其他国家的鼠妖都搬过来居住。之后难免和斯哈哩国的人发生冲突,但因为敬鼠令,人们敢怒不敢言。\n\n斯哈哩国国王有三个儿子,大儿子官拜将军,十分勇猛,性格刚强。三儿子文武全才。只有二儿子天性蠢笨。\n\n大儿子和三儿子心想,如此敬鼠,只怕国将亡矣。于是联合多名大臣,向国王求肯废除敬鼠令。\n\n国王怕得罪了黄风怪,不仅不同意,还因为争执而杀了很多大臣。大儿子激烈反抗,被捕。三儿子(小张太子)远逃,拜了国师王菩萨为师。\n\n几年后,灵吉菩萨见斯哈哩国敬鼠不敬佛,又降下神罚,把国民全都变成了鼠妖。大王子因受不了刺激,疯了。\n\n黄风怪自觉这是自己惹的祸,连累了斯哈哩国,于是和虎先锋一起离开斯哈哩国,到了黄风岭。\n\n然而在黄风怪离开之后,蝜蝂又出现了,斯哈哩国因此被灭,国王以及剩余国民迁走了。\n\n黄风岭本不太平,当地石怪很多,且石怪之间以及当地土地又发生过各种争斗(剧情与主线关系不大,不赘述)。但黄风怪来了之后给摆平了,算是统一了黄风岭的妖怪,让当地和平了不少。于是当地生灵尊黄风怪为“黄风大圣”。\n\n之后进入西游记剧情:唐僧取经路过,虎先锋去抓了唐僧来。黄风怪知道虎先锋打不过孙悟空,却阻拦不住。虎先锋被孙悟空打死,留下两个儿子。\n\n孙悟空去救唐僧时又与黄风怪大战,但对付不了他的三昧神风,于是找灵吉菩萨求助。灵吉菩萨收服了黄风怪。\n\n虎先锋的两个儿子还在黄风岭。二子得虎先锋所传本事,勉强凑合活着。\n\n后来黄风岭有凡人迁入,建立了“沙门村”。这个村子信佛(沙门本就是佛教用语),所以在黄风岭雕刻了很多佛像。\n\n大儿子震慑当地妖邪不得作乱,帮助当地百姓,吃掉坏人,被百姓们尊称为“虎神”,还建了一座寺庙。二儿子对此心生嫉妒,但也没表现出来。\n\n取经之后,发生了序章的故事。\n\n黄风怪虽然得了六根之一,却和黑熊精一样无法炼化。\n\n在灵吉菩萨这里待了百年,黄风怪深知自己没实力是不行的,斯哈哩国就因为得罪了灵吉菩萨被收拾得灭国,说不定哪一天就轮到自己,于是愈加着急。\n\n可能是因为怕被阻碍,也可能是因为报被擒之恨,更可能是因为想盗用灵吉菩萨的法力,总之最终黄风怪割掉了灵吉菩萨的头颅带走,又回到了黄风岭。还捎带上了斯哈哩国的流民一起去。\n\n(这里同时象征着“灵吉菩萨的头被鼠辈拿走了”,懂的都懂)\n\n然而黄风岭此时已被虎先锋两个儿子占领,二虎认为当年父亲的死,就是因为黄风怪派他去送死。大虎深以为然,于是与黄风怪开战。然而黄风怪很轻松就打晕了二虎。大虎为保弟弟性命,急忙放下武器投降。\n\n黄风怪深感欣慰,封大虎为新任虎先锋。大虎又引荐了一个大石精为石先锋。黄风怪让二者拿好山门钥匙,不让别人打扰自己修炼。自己则在山门之中开启黄风大阵,试图炼化孙悟空遗物。\n\n二虎醒后,发现自己兄长投降敌人,无法接受,于是出走了,流落到沙门村一口井里养伤,便是支线任务的疯虎了。\n\n沙门村有一名刀客,是从外面寻访而来。刀客的家乡染了瘟疫,妻子病故,儿子也命不久长。刀客想找个神仙菩萨给孩子治病续命。有一天他无意间寻到了井里,遇到了疯虎。\n\n疯虎把哥哥的经历安到了自己身上,自称虎神,刀客四处寻访虎神事迹,还真对得上,于是就信了,带孩子来看病。\n\n虎神用一个有法力的葫芦给孩子喝水,孩子喝完之后果然精神了不少,更让刀客深信不疑。\n\n之后疯虎提出,自己需要吃人才能养好伤,治好孩子。刀客为了孩子只好隐忍答应。\n\n但村庄的人逐渐发现了端倪,于是把孩子打死了。刀客暴怒,提刀把满村的人都屠了,之后成为了虎伥。\n\n沙门村从此没有一个凡人,之后被妖怪们占了。\n\n再说新任虎先锋大虎,他虽然投降了黄风怪,实际上心里也不服。但打不过,于是就总拿鼠妖出气,声称自己爱吃老鼠,逼着斯哈哩国国王(以下简称沙国王)每天给自己送几只。\n\n沙国王的两个儿子,沙老大虽然魁梧勇猛,但是心智已失,连亲爹都不认识,也没办法帮他对付虎先锋。沙老二虽有把力气,但也不是虎先锋对手。好在虎先锋因为忌惮黄风怪,不敢赶尽杀绝。只吃老鼠骂骂人出出气便罢。鼠类又比较能生,勉强相安无事。\n\n却说那灵吉菩萨失了头,化作一个无头和尚,到黄风岭寻访,期待着碰到天命人,趁天命人打败黄风怪时拿回自己的头。')]
[Document(metadata={'source': './assets/test.pdf', 'page': 0}, page_content='第一章 \n \n在西天取经的几百年前,黑风山上有一只黑熊精占山为王,自称黑风大王。 \n \n有一天,黑熊精碰到了一个小和尚。他觉得这个小和尚蛮有趣,于是给了他一些金银财宝,\n又教给他一些长生的法门。这个小和尚就是后来的金池长老,二人从此结缘。 \n \n在这之后, 金池也给黑熊精讲一些佛法, 黑熊精也有点兴趣, 二人也算是有共同话题的朋友。 \n \n金池一路坐到观音禅院的长老(毕竟学过长生术,活的最久) ,受人顶礼膜拜,欲望也随之\n膨胀。 \n \n黑熊精手下有一个是苍狼精,起了个道号叫凌虚子。还有一个是白花蛇怪,一般称呼为白衣\n秀士。二人虽都和黑熊精结拜,但二者各有派别。凌虚子管着一群狼妖,而白衣秀士则管着\n一群蛇妖。 \n \n凌虚子手下有个小狼妖,想修习佛教。凌虚子是个心地善良的妖怪,有心成全他,就和黑熊\n精提,黑熊精把这小狼妖介绍到了观音禅院。金池给他起了个法名叫“广谋”。广谋变化作一\n个小和尚,在禅院里修行得挺安稳。 \n \n这事儿传到了白衣秀士耳中。那白衣秀士是个心思缜密之人, 生怕凌虚子和金池在暗地里研\n究些什么,怕对自己不利,因此也找了个小蛇精变成人形,送进了观音禅院。这个小蛇精法\n名“广智”。 \n \n之后取经队伍到了,金池贪图唐僧的袈裟,广谋虽然想修佛,但毕竟是妖怪,对杀人越货的\n勾当完全不当回事,出了个主意杀掉唐僧。广智则心思缜密,提出放火更容易掩人耳目。于\n是金池照办,全禅院都搬柴放火。 \n \n可是隔墙有耳,他们的计谋被孙悟空听见了。孙悟空将计就计,借了防火罩护住唐僧,又添\n了把风把观音禅院付之一炬, 很多众被焚烧致死。 金池长老撞墙自杀 (所以游戏里的幽魂,\n头部是弱点,头部受重击就倒地) ,广谋、广智逃离。 \n \n黑熊精本来是来救火,结果顺走了袈裟,并因此和取经团队发生了冲突。最后被观音套上金\n箍圈后收去,当了守山大神。至于凌虚子和白衣秀士则被打死了。 \n \n西天取经后,序章故事发生,观音菩萨派黑熊精参与了围剿孙悟空。其实黑熊精不想去,反\n而善财童子(红孩儿)挺想去的,只是观音指名,黑熊精不敢违背。 \n \n孙悟空死后, 作为报酬, 黑熊精终于摘掉了金箍咒, 得到了悟空的六根之一, 回到了黑风山。 \n \n黑熊精试图炼化孙悟空的遗物,但却因法力不够始终无法炼化,于是把遗物供奉在塔顶,用\n来吸引妖怪做他手下。 \n \n这时的黑风山已有百年的时间群龙无首,黑熊精知道光靠蛮力和吸引力很难统合这些妖怪,'), Document(metadata={'source': './assets/test.pdf', 'page': 1}, page_content='于是做了一系列举动。不过因为他智力不高,所以这些主意效果也不是很好。 \n \n首先他用南海学来的法术把凌虚子复活——但这个法术需要用凌虚子的同族活祭, 而且凌虚\n子以后都要吸食同族的鲜血过活。凌虚子复活后接受不了,上吊自尽了。避火罩本来被黑熊\n精找到送给凌虚子,也就当给凌虚子陪葬了。 \n \n黑熊精见这招不合适,又扶持了一个够强的狼妖,给他起名灵虚子(和凌虚子音同字不同,\n可能也是黑熊精没啥文化) 。但这灵虚子是从狮驼国跑过来的外来户,而且修炼法门过于血\n腥暴力,引起黑风山本地狼妖的不满,并最终差点引起灵虚子对本地狼妖的大屠杀。不过最\n终被新任蛇妖统领白衣秀士阻止。 \n \n黑熊精对这些事有种无力感,于是重建观音禅院,想用复活凌虚子的法术复活金池长老,以\n解寂寞。没想到金池的魂魄依然惦记着他生前藏着的财物,没有复活到肉身之上,而是复活\n到了财物上,成了一个精神不正常的大头怪物。 \n \n这期间还发生了一件小事: \n \n黑风山的土地遇到一个老道士。 老道士和土地相谈甚欢, 然后教了土地定身法和聚形散气等\n技能。 \n \n土地问你为什么教我这个?老道士说,将来会有一个天命人路过此地,我不方便见他,请你\n代我把这两招传授给他。说完就架云飞走了。 \n \n飞走的时候,掉下了一片菩提叶。')]
[Document(metadata={'source': './assets/lesson.md', 'category_depth': 1, 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'category': 'Title', 'element_id': '352241103606397b48357f9d34290086'}, page_content='1.IP摄像头安装'), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': '352241103606397b48357f9d34290086', 'category': 'UncategorizedText', 'element_id': '2f21c9e1bff21d48ef83d57b1613bc41'}, page_content='Android版的IP摄像头apk下载地址:'), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': '352241103606397b48357f9d34290086', 'category': 'UncategorizedText', 'element_id': 'de25eca750512e8622c698f71ba21976'}, page_content='通过网盘分享的文件:IP摄像头 链接: https://pan.baidu.com/s/1A-N-6wiWrFYRPzcmq7CvZg?pwd=9527 提取码: 9527'), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': '352241103606397b48357f9d34290086', 'category': 'UncategorizedText', 'element_id': '59e7666d6f6334e64dc2bc9aa1ab3270'}, page_content='在手机上安装好App,启动后确认PC端和移动端连接到同一个WIFI,并且记住局域网服务器IP和端口。'), Document(metadata={'source': './assets/lesson.md', 'image_url': 'https://img.simoniu.com/IP摄像头实现目标检测001.jpg', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'category': 'Image', 'element_id': 'cdd6a4d634a762d36be8236017005aef'}, page_content=''), Document(metadata={'source': './assets/lesson.md', 'category_depth': 1, 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'category': 'Title', 'element_id': '83d1d706e7d1ce59f149026042758a54'}, page_content='2.WIFI摄像头+Yolov8实现目标检测'), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': '83d1d706e7d1ce59f149026042758a54', 'category': 'UncategorizedText', 'element_id': 'dbb773b2ab9001347b730492c80bd1d5'}, page_content='代码实现:'), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': '83d1d706e7d1ce59f149026042758a54', 'category': 'NarrativeText', 'element_id': '8ceaf9e8c11965a3759ac9bf3a38bff6'}, page_content='```python import cv2 import ultralytics from ultralytics import YOLO'), Document(metadata={'source': './assets/lesson.md', 'category_depth': 0, 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'category': 'Title', 'element_id': '30d95a8a7467ffea05f50f51d91249bf'}, page_content='播放视频'), Document(metadata={'source': './assets/lesson.md', 'category_depth': 0, 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'category': 'Title', 'element_id': '2d225ad9e19f7d969935f90205f19426'}, page_content='加载一下模型'), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': '2d225ad9e19f7d969935f90205f19426', 'category': 'UncategorizedText', 'element_id': '92b449d023df48382f2b9ee276306b40'}, page_content="model = YOLO('./model/yolov8n.pt')"), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': '2d225ad9e19f7d969935f90205f19426', 'category': 'NarrativeText', 'element_id': '4ed054366efe7d2be432316f5b3d8879'}, page_content='video = cv2.VideoCapture("http://admin:admin@192.168.0.67:8081/video")'), Document(metadata={'source': './assets/lesson.md', 'category_depth': 0, 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'category': 'Title', 'element_id': 'f524da4c992bdda98ce8195afc63ffab'}, page_content='读取视频的帧率'), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': 'f524da4c992bdda98ce8195afc63ffab', 'category': 'UncategorizedText', 'element_id': '42944df38fb6d7dcf015ee3bd92efb6d'}, page_content='fps = video.get(cv2.CAP_PROP_FPS)'), Document(metadata={'source': './assets/lesson.md', 'category_depth': 0, 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'category': 'Title', 'element_id': 'b18d7feefdc9aaf076f32b6383171a25'}, page_content='print(fps)'), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': 'b18d7feefdc9aaf076f32b6383171a25', 'category': 'NarrativeText', 'element_id': '46ffbc5539c5202d69e03e212d310a58'}, page_content='while video.isOpened(): # 读取视频中的一帧 ret, frame = video.read() # 视频播放完成退出循环 if ret != True: break # 获取每一帧的图片的宽度和高度 height, width = frame.shape[:2]'), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': 'b18d7feefdc9aaf076f32b6383171a25', 'category': 'NarrativeText', 'element_id': 'ebef0e07d5b9b15337447f20777f8089'}, page_content='# 图像进行缩放\n#resized_frame = cv2.resize(frame, (int(width), int(height)), interpolation=cv2.INTER_AREA)\nresized_frame = frame\n# 在帧上运行YOLOv8推理\n# results = model(resized_frame)\n# verbose=False 控制台是否输出检测信息,True显示,False不显示\nresults = model.predict(resized_frame, verbose=False)\n# 获取检测结果\nboxes = results[0].boxes\nnames = results[0].names\n\n# 手动绘制检测框和标签\nannotated_frame = resized_frame.copy()\nfor box in boxes:\n    # 获取检测框的坐标\n    x1, y1, x2, y2 = box.xyxy[0].tolist()\n    x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)\n\n    # 获取类别ID和置信度\n    cls_id = int(box.cls[0])\n    conf = box.conf[0].item()\n\n    # 绘制检测框(线条粗细设置为1,更细)\n    cv2.rectangle(annotated_frame, (x1, y1), (x2, y2), (0, 255, 0), thickness=1)\n\n    # 绘制标签\n    label = f"{names[cls_id]}: {conf:.2f}"\n    (label_width, label_height), _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)\n    cv2.rectangle(annotated_frame, (x1, y1 - label_height - 5), (x1 + label_width + 5, y1), (0, 255, 0), -1)\n    cv2.putText(annotated_frame, label, (x1 + 2, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1)\n\n# 显示标注后的帧\ncv2.imshow("yolo_demo", annotated_frame)\n\n#cv2.imshow("video", frame)\n# 按q键退出\nif cv2.waitKey(int(1000/fps)) == ord(\'q\'):\n    break'), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': 'b18d7feefdc9aaf076f32b6383171a25', 'category': 'UncategorizedText', 'element_id': '4ccafe6b1cf7e965a87bda83c7483761'}, page_content='video.release() cv2.destroyAllWindows()'), Document(metadata={'source': './assets/lesson.md', 'languages': ['eng'], 'file_directory': './assets', 'filename': 'lesson.md', 'filetype': 'text/markdown', 'last_modified': '2025-04-21T21:20:48', 'parent_id': 'b18d7feefdc9aaf076f32b6383171a25', 'category': 'UncategorizedText', 'element_id': 'd8c2e95e53c74e1f292ab45a92c36d0d'}, page_content='```')]
[Document(metadata={'source': 'E:\\langchain_project\\dataloader\\assets\\test.json', 'seq_num': 1}, page_content='Python')]
[Document(metadata={'source': './assets/test.html'}, page_content='表格标签\n\n星期/时间 星期一 星期二 星期三 星期四 星期五 上午 1 英语 化学 语文 代数 物理 2 英语 化学 语文 代数 物理 3 英语 化学 语文 代数 物理 4 英语 化学 语文 代数 物理 下午 5 英语 化学 语文 代数 物理 6 英语 化学 语文 代数 物理 7 英语 化学 语文 代数 物理')]
[Document(metadata={'source': './assets/test.html', 'title': '表格标签'}, page_content='\n\n\n表格标签\n\n\n\n\n表格标签\n\n\n我的课程表\n\n星期/时间\n星期一\n星期二\n星期三\n星期四\n星期五\n\n\n上午\n1\n英语\n化学\n语文\n代数\n物理\n\n\n2\n英语\n化学\n语文\n代数\n物理\n\n\n3\n英语\n化学\n语文\n代数\n物理\n\n\n4\n英语\n化学\n语文\n代数\n物理\n\n\n下午\n5\n英语\n化学\n语文\n代数\n物理\n\n\n6\n英语\n化学\n语文\n代数\n物理\n\n\n7\n英语\n化学\n语文\n代数\n物理\n\n\n\n\n')]