使用langchain与你自己的数据对话(一):文档加载与切割_langchain加载word

深入理解RecursiveCharacterTextSplitter:文本分割的递归魔法 阅读详情

LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,以便在不同的应用程序中使用。LangChain可以让LLM来学习您自己的结构化或者非结构化的数据,这些数据包括pdf,text,youtbe,database等,这样就可以很方便的打造一个个性化的智能AI机器人。下面是LangChain可以学习的数据的种类和类型:

Langchain在实现与外部数据对话的功能时需要经历下面的5个阶段,它们分别是:Document Loading->Splitting->Storage->Retrieval->Output,如下图所示:

Document Loading

在检索增强生成(Retrieval augmented generation,RAG)中,Langchain可以让LLM检索外部数据集中内容:

要实现对外部数据的检索,首先需要对各种外部数据的加载且对于不同类型的数据时Langchain提供了不同类型的数据加载器, 不过在实现加载外部数据之前,首先我们还是要做一些基础性工作,比如设置openai的api key:

import os
import openai
import sys
sys.path.append('../..')

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file

openai.api_key  = os.environ['OPENAI_API_KEY']

PDFs

下面我们让langchain加载吴恩达老师的著名课程《机器学习》的课程讲义的pdf文档:

#! pip install pypdf 

from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("docs/cs229_lectures/MachineLearning-Lecture01.pdf")
pages = loader.load()

下面我们查看一下文档的页数:

len(pages)

接下来我们查看该文档第一页的部分内容,由于文本内容太长,所以我们只展示前500个字符的内容:

page = pages[0]

print(page.page_content[0:500])

与实际内容做比对:

下面查看该页的元数据

page.metadata

YouTube

langchain的另外一个重要的功能就是它可以读取youtube视频里的内容,langchain可以读取youtube视频内的音频数据,并将其转换成文本:

# ! pip install yt_dlp
# ! pip install pydub

from langchain.document_loaders.generic import GenericLoader
from langchain.document_loaders.parsers import OpenAIWhisperParser
from langchain.document_loaders.blob_loaders.youtube_audio import YoutubeAudioLoader

#视频链接
url="https://www.youtube.com/shorts/13c99EsNt4M"
#视频保存路径
save_dir="docs/youtube/"

loader = GenericLoader(
    YoutubeAudioLoader([url],save_dir),
    OpenAIWhisperParser()
)
docs = loader.load()

上面我们已经完成了对youtube视频的加载,并且将其中的音频转换成了文本,下面我们查看一下转换好的文本:

docs[0].page_content[0:500]

URLs

除了从youtube中加载数据,Langchain还可以加载web网页的内容,下面我们看一个例子:

from langchain.document_loaders import WebBaseLoader

url="https://mp.weixin.qq.com/s/RhzHa1oMd0WHk0JamdfVRA"

#创建webLoader
loader = WebBaseLoader(url)

#获取文档
docs = loader.load()
#查看文档内容
text=docs[0].page_content
text=text.replace("\n",'')
print(text)

我们对照一下实际网页的内容:

文档分割(Document Splitting)

前面我们简单介绍了通过Langchain来加载和读取各种类型外部数据的方法,当数据被加载以后,接下来就来到了Splitting, 由于外部数据的数据量可能比较大,如pdf、text文档,youtube视频等产生的文档的数量或者说体积比较大,因此需要对外部数据文档进行分割(Splitting),文档被分割成块(chunks)后才能保存到向量数据库中:

Langchain提供了很多文本切割的工具,其中langchain默认使用RecursiveCharacterTextSplitter:

  • CharacterTextSplitter():按字符来分割文本。
  • MarkdownHeaderTextSplitter():基于指定的标题来分割markdown 文件。
  • TokenTextSplitter():按token来分割文本。
  • SentenceTransformersTokenTextSplitter() : 按token来分割文本
  • RecursiveCharacterTextSplitter():按字符串分割文本,递归地尝试按不同的分隔符进行分割文本。
  • Language() - 用于 CPP、Python、Ruby、Markdown 等。
  • NLTKTextSplitter():使用 NLTK(自然语言工具包)按句子分割文本。
  • SpacyTextSplitter() - 使用 Spacy按句子的切割文本。

RecursiveCharacterTextSplitter

RecursiveCharacterTextSplitter是Langchain的默认文本分割器,它按不同的字符递归地分割文档,同时要兼顾被分割文本的长度和重叠字符,RecursiveCharacterTextSplitter默认使用[“\n\n” ,“\n” ," “,”"] 这四个特殊符号作为分割文本的标记,下面对RecursiveCharacterTextSplitter()方法的参数说明如下:

  • chunk_size:被切割的字符串的最大长度
  • chunk_overlap:如果仅仅使用chunk_size来切割时,前后两段字符串重叠的字符数量。

这里需要说明一下chunk_overlap参数,为了保持字符串中语义的连贯性,就需要保持前后两段被分割的字符串有部分重叠,这就好比老师在上课的时候先回顾一下上一节课的内容,这样可以做到温故而知新,这就是设置重叠字符川的意义,下面我们看个例子:

from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter

r_splitter = RecursiveCharacterTextSplitter(
    chunk_size=26, #块长度
    chunk_overlap=4 #重叠字符串长度
)


text1 = 'abcdefghijklmnopqrstuvwxyz'
r_splitter.split_text(text1)

这里我们使用RecursiveCharacterTextSplitter方法来切割字符串a-z,由于我们设置chunk_size的值为26,也就是每26个字符会被切块,但是因为a到z的字符串正好是26个字符,所以没有被切开下面我们在26个字母的后面再加上a到g试一下:

text2 = 'abcdefghijklmnopqrstuvwxyzabcdefg'
r_splitter.split_text(text2)

这里我们看到由于我们在a到z的后面又增加了a到g 8个字符所以现在字符串总长变成了34,但是RecursiveCharacterTextSpliterr还是会在每26个字符串的位置进行切割,所以原字符串被切割成了两段,同时由于我们还设置了chunk_overlap参数为4,所以前一个字符串的最后4个字符串会被加到后一个字符串的开头,这样做的目的是为了增强语义的连贯性。下面我们再看一个例子,这次我们在原来a到z的字符串中间,在字母和字母中间加入空格,所以字符串长度由原来的26变成了51:

text3 = "a b c d e f g h i j k l m n o p q r s t u v w x y z"
r_splitter.split_text(text3)

这里我们发现字符串被切割成了3段,前2段每段都只有25个字母,这是因为前两段字符串其实还有一个空格,我们设置的chunk_size参数是26,所以它只会在每26个字符的位置进行切割,所以当第26个字符是空格的时候,该空格会被扔掉,不会被保留下来,所以造成前两个字符串都只有25个字母,但是在计算重叠字符时改空格仍然会保留下来,这就造成后一个字符串的开头包含了前一个字符串的最后四个字符(包括空格在内)。

CharacterTextSplitter

上面我们解释了RecursiveCharacterTextSplitter文档切割器,它是Langchain默认的文档切割器,接下来我们还可以来尝试另外一款文档切割器CharacterTextSplitter,这是一款比较的简单的按字符数来切割文档的文档切割组件,下面我们看一个例子,在下面的例子中我们任然设置了chunk_size为26和chunk_overlap为4这两个参数:

c_splitter = CharacterTextSplitter(
    chunk_size=26,
    chunk_overlap=4
)

text3 = "a b c d e f g h i j k l m n o p q r s t u v w x y z"
c_splitter.split_text(text3)

我们看到,默认情况下CharacterTextSplitter是忽略空格的,也就是说在默认情况下CharacterTextSplitter不会把空格当初字符,所以没有切割原来的字符串,任然输出包含空格在内的26个字母。我们再看下面的例子:

c_splitter = CharacterTextSplitter(
    chunk_size=26,
    chunk_overlap=4,
    separator = ' '
)
text3 = "a b c d e f g h i j k l m n o p q r s t u v w x y z"
c_splitter.split_text(text3)

当我们在CharacterTextSplitter的参数中增加一个separator = ’ '的参数,此时空格将不会被忽略,空格会被当成字符来对待,所以原字符串最后被切割成个3段,这类似于RecursiveCharacterTextSplitter。

递归分割细节

前面我们介绍了RecursiveCharacterTextSplitter,它是Langchain默认使用的文本切割器,也是Langchain推荐使用的文本切割器,它可以根据特定的标记,如双换行符(\n\n),单换行符(\n)等来分割文本,因此它可以将完整的语义保留在一个段落中,同时设置了重叠字符确保了语义的连贯性。下面我们来看一个例子,在这段文本中存在一个双换行符\n\n:

some_text = """When writing documents, writers will use document structure to group content. \
This can convey to the reader, which idea's are related. For example, closely related ideas \
are in sentances. Similar ideas are in paragraphs. Paragraphs form a document. \n\n  \
Paragraphs are often delimited with a carriage return or two carriage returns. \
Carriage returns are the "backslash n" you see embedded in this string. \
Sentences have a period at the end, but also, have a space.\
and words are separated by space."""

下面我们看一下文本的总长度:

该段文本的中长度为496个字符。下面我们分别用CharacterTextSplitter和RecursiveCharacterTextSplitter来切割该段文本:

c_splitter = CharacterTextSplitter(
    chunk_size=450,
    chunk_overlap=0,
    separator = ' '
)
r_splitter = RecursiveCharacterTextSplitter(
    chunk_size=450,
    chunk_overlap=0, 
    separators=["\n\n", "\n", " ", ""] #默认
)

这里需要说明的是CharacterTextSplitter默认的字分割符是双换行符即\n\n, 这里我们将分隔符改成了空格,而RecursiveCharacterTextSplitter的默认字分割符是一个列表即[“\n\n”, “\n”, " ", “”],因此它会用分割符列表中从左至右的顺序的分割符依次去搜索目标文档中的分割符,然后再分割文档,比如先搜索目标文档中的双换行符\n\n,如果存在,则切割文档,然后依次搜索单分隔符\n,空格等,下面我们首先尝试用CharacterTextSplitter来切割文档,这里我们CharacterTextSplitter的chunk_overlap值设置为0,也就是不设置重叠字符的意思:

c_splitter.split_text(some_text)

这里我们看到,CharacterTextSplitter按字符串长度将切割成了2段,因为我们设置了separator 为空格,所以它一定是在空格处来切割文本,并且长度要尽量满足我们设置的chunk_size=450的长度,所以第一段的长度应该是<=450的最大值:

ds=c_splitter.split_text(some_text)
len(ds[0])

这里我们看到第一段的长度是448,满足不大于450的要求。下面我们用RecursiveCharacterTextSplitter来切割文本:

r_splitter.split_text(some_text)

这里我们看到RecursiveCharacterTextSplitter也将文本分割成了两段,只不过它是在原文本中的双换行符处切割的,这是因为RecursiveCharacterTextSplitter的分割符是一个列表,其中的双换行符\n\n优先级最大,因此凡事在文本中出现双换行符的位置都会被分割,并且被分割的文本长度不能大于chunk_size的设定值。接下来我们在RecursiveCharacterTextSplitter的分隔符列表中增加一个句号作为分隔符,我们再来看看分割的结果。

r_splitter = RecursiveCharacterTextSplitter(
    chunk_size=150,
    chunk_overlap=0,
    separators=["\n\n", "\n", "\. ", " ", ""]
)
r_splitter.split_text(some_text)

这里我们看到文本被分割成了5段,并且是按双换行符\n\n和句号这两个分割符来分割的,只是句号出现在了各段的句首位置,这明显是错误的,句号应该是出现在上一段的句尾才对。下面我们调整一下分隔符列表中的正则表达式:

r_splitter = RecursiveCharacterTextSplitter(
    chunk_size=150,
    chunk_overlap=0,
    separators=["\n\n", "\n", "(?<=\. )", " ", ""]
)
r_splitter.split_text(some_text)

我们在分隔符列表中增加了正则表达式"(?<=\. )",它的意思是保证句号前面一定会存在字符,这样就避免了句号被保留在句首的情况。

接下来我们使用一个现实的pdf文件来实际测试一下文档分割功能:

from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("docs/cs229_lectures/MachineLearning-Lecture01.pdf")
pages = loader.load()

这里我们使用langchain的PyPDFLoader文档加载器来加载pdf文件,它是按页来加载pdf文件的,也就是说如果原来pdf文件中一共有10页,那么在执行load()后生成的pages也包含了这10页:

len(pages)

这里我们看到原pdf文档里一共有22页,我们加载好以后生成的pages对象的长度也是22。下面我们用CharacterTextSplitter来分割这个文档并设置如下参数:

  • separator=“\n” : 设置单换行符作为分隔符
  • chunk_size=1000:设置块的大小为1000个字符
  • chunk_overlap=150:设置重叠字符为150个字符
  • length_function=len :长度函数设置为python的len函数
from langchain.text_splitter import CharacterTextSplitter

#创建分割器
text_splitter = CharacterTextSplitter(
    separator="\n",
    chunk_size=1000,
    chunk_overlap=150,
    length_function=len
)

#分割文档
docs = text_splitter.split_documents(pages)

下面我们看看分割好的文档docs包含多少段文档:

len(docs)

我们看到原来22页的pdf文档经过分割后变成了77段的文档。

Token 分割

除了按字符分割以为,Langchain还提供了按token来分割文本的方法,所谓token可以理解为含义简单的最小词语单位,这里一个token大约由4个字符组成。因为大型语言模型(LLM),通常是以token的数量作为其计量(或收费)的依据。所以采用token分割也有助于我们在使用像chatGPT这样的LLM的同时更好的控制成本。下面我们看一个例子:

from langchain.text_splitter import TokenTextSplitter

text_splitter = TokenTextSplitter(chunk_size=1, chunk_overlap=0)

text1 = "foo bar bazzyfoo"

text_splitter.split_text(text1)

在使用token分割文本时英语中的一些非常用单词如这里的bazzyfoo会被分割成多个token,如这里将bazzyfoo分割成了4个token,它们分别是b, az, zy, foo。再看一个例子:

text2="what can I do for you ?"
text_splitter.split_text(text2)

基本上常用的英语单词都会被分割成单独的token.下面我们将之前的pdf文档进行token分割:

text_splitter = TokenTextSplitter(chunk_size=10, chunk_overlap=0)

docs = text_splitter.split_documents(pages)

len(docs)

这里我们将chunk_size设置为10,也就是说每一段里最多只保留10个token, 最后docs中包含了1557个chunk,且每个chunk中的token数量<=10. 下面我们查看一下docs中的内容:

docs[0]

docs[100]

这里我们看到docs里面的内容都很短,都不超过10个token。

上下文感知分割(Context aware splitting)

对文本分割的目的旨在将具有共同语义的上下文的文本放在一起。文本分割通常使用句子或其他分隔符将相关文本保持在一起,但许多文档(例如 Markdown)具有可以在拆分中显式的结构(如标题)。我们可以使用 MarkdownHeaderTextSplitter 来保留块中的标题元数据:

from langchain.document_loaders import NotionDirectoryLoader
from langchain.text_splitter import MarkdownHeaderTextSplitter

markdown_document = """# Title\n\n \
## Chapter 1\n\n \
Hi this is Jim\n\n Hi this is Joe\n\n \
### Section \n\n \
Hi this is Lance \n\n 
## Chapter 2\n\n \
Hi this is Molly"""

headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
    ("###", "Header 3"),
]

markdown_splitter = MarkdownHeaderTextSplitter(
    headers_to_split_on=headers_to_split_on
)

md_header_splits = markdown_splitter.split_text(markdown_document)

这里我们设置了抽取指定标题(如标题1, 标题2,标题3) ,且同一标题内的的数据他们被放置在同一个块内.

md_header_splits[0]

md_header_splits[1]

这里我们可以看到MarkdownHeaderTextSplitter将同一标题下的文本放在了同一个块(chunk)中,而文本对应的标题信息则被存储在块的元数据中了。

总结

今天我们学习了文本的加载与分割,Langchain提供了丰富的外部数据加载器,这些外部数据可以是结构化的,也可以是非结构化的,其中我们还介绍了从网页和youtube视频中加载文本的方法,这个挺有意思的,大家可以尝试一下,由于外部数据量可能比较大,如pdf, text文档等,因此当我们加载了外部数据以后,我们还需要对数据进行分割处理,我们介绍了几种文本分割的方法,其中有按字符分割的CharacterTextSplitter分割器,和递归分割的RecursiveCharacterTextSplitter分割器。以及token分割器和markdown分割器,这里langchain默认使用RecursiveCharacterTextSplitter分割器,其中RecursiveCharacterTextSplitter默认使用一个分割符列表来分割数据,同时还要兼顾块的大小和重叠字符。

​

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

Langchain使用之 - 文本分割Splitter 通过实际代码例子介绍如何使用Lanchain的文本分割器对文本进行分割 阅读详情

相关推荐

使用langchain与你自己的数据对话(一):文档加载与切割

今天我们学习了文本的加载与分割,Langchain提供了丰富的外部数据加载器,这些外部数据可以是结构化的,也可以是非结构化的,其中我们还介绍了从网页和youtube视频中加载文本的方法,这个挺有意思的,大家可以尝试一下,由于外部数据量可能比较大,如pdf, text文档等,因此当我们加载了外部数据以后,我们还需要对数据进行分割处理,我们介绍了几种文本分割的方法,其中有按字符分割的CharacterTextSplitter分割器,和递归分割的RecursiveCharacterTextSplitter分割器。

weixin_42608414的博客 1万+

RAG系统文档处理实战:从基础切割到多粒度存储策略详解

在构建基于大语言模型的应用时,检索增强生成(RAG)技术通过结合外部知识库来提升模型回答的准确性与可靠性。其核心原理在于将非结构化文档转化为向量表示并进行语义检索,从而为生成过程提供精准的上下文信息。这项技术的工程价值在于,它能有效解决模型幻觉问题,并支持私有化知识的高效利用。在实际应用场景中,无论是构建智能客服、企业知识库还是专业文档问答系统,RAG都扮演着关键角色。其中,文档的存储与切割策略是决定系统效果的基础环节,它直接关系到向量检索的召回质量与生成答案的准确性。本文聚焦于**文档切割**与**向量数

weixin_33788244的博客 322

从零构建金融RAG问答机器人:基于LangChain与Qwen的实战指南

最近在后台收到不少私信,很多刚接触AI大模型的朋友都表示,面对海量的开源模型、复杂的部署流程和眼花缭乱的技术栈,感觉无从下手,学习曲线陡峭。确实,从零开始构建一个能跑起来、能对话、甚至能解决实际问题的AI应用,涉及环境、模型、框架、工程化等多个环节,任何一个环节卡住都可能让人放弃。 本文正是为了解决这个问题而生。我将以“金融大模型问答机器人”这个极具代表性的项目为蓝本,为你拆解一套从零到一的完整实战路径。无论你是想入门AI应用开发的在校学生,还是希望将大模型能力集成到现有业务中的开发者,都能从这篇教程中找到

weixin_30675247的博客 314

大语言模型分词的 chunk_size 和 chunk_overlap 说明和验证

大语言模型分词的 chunk_size 和 chunk_overlap 说明和验证

engchina的专栏 1万+

(17-3-01)检索增强生成(RAG):Recursively文本分割器

文本分割器(Text Splitters)是 LangChain 中用于处理和转换文档的工具,可以帮助开发者将长文档分割成更小的、语义上有意义的块,以适应我们的应用程序或模型的上下文窗口。

码农三叔 2638

Python验证码识别神器ddddocr:5分钟搞定网站登录自动化(附完整代码)

本文详细介绍了如何使用Python开源库ddddocr快速实现验证码识别,结合Selenium完成网站登录自动化。ddddocr作为轻量级OCR工具,支持多种验证码类型,识别速度快且准确率高,特别适合自动化测试和爬虫开发。文章包含完整代码示例,从环境配置到实战应用,帮助开发者5分钟内实现验证码破解。

sprite的博客 798

进阶篇-LangChain篇-9--文档加载与分割(Loaders & Splitters)——数据清洗的艺术

本文深入探讨了RAG系统中的文档加载与分割技术,通过厨房做菜的类比形象阐述了数据预处理的重要性。文章系统性地介绍了Loader和Splitter的核心功能,将Loader比作"买菜"(获取不同格式文档),Splitter比作"切菜"(将文档分割为适合模型处理的块)。重点分析了文档分割的艺术,强调需要在保留语义完整性和适合模型处理之间取得平衡,并推荐使用RecursiveCharacterTextSplitter工具。文章还提供了10+种主流Loader的实战代码,涵盖

weisian的博客 5744

开关电源环路学习笔记(1)-为啥要知道传递函数?

做硬件都会接触到开关电源,或多或少会接触到环路补偿。很多兄弟们也提出来让我说说这个,说明大家也都很关心,也说明这个好像有点难。 就我个人而言,我也想搞明白环路这一块,也查了一些资料,视频,不过说实话,一直都还是懵的,感觉很困难。 具体感觉就是,看资料或视频的时候,感觉好像是那么回事。但是撇开之后,就又云里雾里的感觉,总有一些想法没有找到答案。 问题 比如下面我想过的问题: 开关电源有开关,根本就不是一个线性系统,传递函数是咋弄出来的? 系统环路框图的输入量为什么不是Vin,而是参考电压V

weixin_42005993的博客 1万+

基于LangChain的大模型学习手册之Embedding(保姆级)

时至今日,经过2年的“攻城拔寨”,大模型显然吹进了“寻常百姓家”。如果你还不了解ChatGPT,不了解通义、文心、混元等国内任意一款大模型产品,那么请来博主这里坐坐,我们“边看边聊”。随着ChatGPT的问世,仿佛一夜间,把AI的门槛从金字塔顶端拉至了腰身,甚至脚跟处,神不神奇?当然神奇,这个领域曾经是机器学习擅长的圈子,除非你具备相当的基础、甚至专业能力,否则可以说“与你无关”。如今呢,AIGC遍天下,工具化浪潮代替了原始的生产方式,你不需要懂数学、懂计算机,什么算法、数据都可以抛在脑后。

splendid_java的专栏 2280

SimpleITK图像基础(一)——3D Resampling

文章目录前言基于SimpleITK进行实现 前言 进入深度学习网络之前需要进行统一数据集,这个时候需要对这些数据集进行重新采样,即假设各向同性体素并重新定向它们,以便可以读取所有图像的像素矩阵。 在将方位变换成一致时,可以用DICOMOrientImageFilter过滤器,可以将 DesiredCoordinateOrientation设置为你想要变换的方位,它将计算出所需的置换顺序并根据需要执行翻转以接近所需方向。 基于SimpleITK进行实现 workflow如下: step 1:首先运行DICOM

YYY_77的博客 2019

微信支付接口「系统繁忙 SYSTEM_ERROR」/「文件不存在」报错分析与解决方案 接口开发实现SDK

微信支付的“平台证书模式”只有5年的有效期,过期后微信支付将不再签发新的平台证书,转而要求开发者使用“微信支付公钥”来处理敏感信息加密及回调签名验证。然而,由于以下几点原因,许多开发者在调用 获取平台证书。尽管微信支付在技术迭代上有其必要性,但报错设计过于不友好。诸如“系统繁忙”这样的提示很难直接关联到平台证书失效或公钥切换问题。这样的信息表达,开发者不仅看不懂,还需要花费大量时间分析排查,非常影响效率。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 780

LangChain文档加载与文本分割:构建高效RAG应用的数据预处理基石

在构建基于大语言模型的应用时,文档加载与文本分割是数据处理流程中的关键预处理步骤。其核心原理在于将海量、多格式的原始文档(如PDF、Word、网页内容)转化为模型可处理的标准化文本单元。这一过程的技术价值在于解决模型有限上下文窗口与长文档之间的矛盾,通过智能切割保证语义完整性,从而为后续的向量化表示与高效检索奠定基础。在工程实践中,这直接关系到检索增强生成(RAG)应用的效果,是确保智能问答、知识库分析等场景下答案准确性与相关性的地基。针对不同的文档类型,如技术文档或法律合同,需要采用差异化的分割策略,并合

weixin_30231327的博客 325

Linux系统安装部署Redis完整教程(图文详解)

最近需要在Linux服务器安装部署Redis,参考了网上很多的文章,比较零碎,所以我自己写了一篇完整的Redis安装部署文档,在部署Redis之前重装了我的华为服务器,就是为了给大家一步步阐述我的操作过程,配合图文进行讲解更加通俗易懂!

黄团团的个人博客 6693

LangChain文档处理实战:从Document对象到高质量RAG数据准备

在构建基于大语言模型的智能应用时,文档预处理是决定系统效果的关键基础环节。其核心原理是将非结构化文本数据转化为机器可理解和处理的标准化格式,这一过程直接影响到后续检索增强生成(RAG)系统的准确性和可靠性。从技术价值角度看,高质量的文档处理能够显著提升信息检索的精准度,降低模型生成幻觉的概率,是构建可信AI应用的地基。在实际应用场景中,无论是企业知识库问答、技术文档分析还是智能客服系统,都需要对PDF、网页、Word等多种格式的原始文档进行加载、分割和向量化处理。本文聚焦于LangChain框架中的Docu

weixin_34413802的博客 375

【报错解决】OpenClaw 报错 Unsupported engine: requires node >=22.0.0 —— Node.js 版本过低的完整排查与解决实录

在国产操作系统环境下部署OpenClaw时遇到"Unsupported engine: requires node >=22.0.0"报错,分析表明该工具要求Node.js 22+以支持fetch API等新特性。解决方案包括:1) 使用nvm升级Node至22+版本;2) Docker环境中改用node:22-alpine镜像;3) 不推荐强制忽略引擎检查。文章强调遵循引擎要求的重要性,指出环境版本是工程化体系稳定运行的关键,建议通过规范升级解决兼容性问题。(149字)

博客 608

使用 Simulink + Simscape Electrical 实现一个变压器耦合式单相全波整流器的仿真模型

本文介绍了基于Simulink的变压器耦合式单相全波整流器建模与仿真方法。详细说明了从项目创建、模块添加、电路搭建到参数配置的完整建模过程,重点分析了整流器的效率与损耗特性,包括变压器损耗和二极管导通损耗。通过仿真展示了输入输出波形特征,并提出了选用高效元件、优化变压器设计等改进建议。该案例为电力电子系统建模提供了实用参考,有助于深入理解整流电路工作原理和性能优化方法。

amy_mhd的博客 187

LangChain入门:从Document对象掌握数据处理基石

在构建基于大语言模型的应用时,数据处理是决定项目成败的关键环节。其核心原理在于将非结构化文本转化为模型可理解和高效利用的格式。这一过程的技术价值在于,它直接影响了后续检索增强生成(RAG)的准确性和Agent决策的可靠性。无论是构建智能客服、知识库问答还是文档分析系统,良好的数据预处理都是实现预期效果的基础。实践中,Document对象作为承载文本与元数据的基本单元,是LangChain框架中处理数据的起点。通过文档加载器(Loader)从PDF、网页等多元数据源获取内容,并利用文本分割器(Text Spl

weixin_33851604的博客 467

SOUL.md 人格定制的 7 个高阶技巧:Hermes Agent 精准控制 AI 行为模式

揭示 SOUL.md 的本质是行为契约而非人格设定,介绍7个围绕边界约束的高阶技巧,包括用上下文锚点(INPUT SCOPE/OUTPUT TARGET/CONSTRAINTS)替代角色描述、动态渲染锚点适配CI流程等,显著降低token消耗与人工review耗时。

weixin_42520239的博客 251

Langchain-Chatchat文档解析流程全解析:结构化你的非结构数据

深入解析Langchain-Chatchat如何将PDF、Word等非结构化文档转化为可问答的知识库,涵盖文本切片、中文语义嵌入、向量检索与RAG生成全过程,实现本地化、安全可控的企业知识管理。

weixin_35671843的博客 987

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LangChain RAG Agent实战:从零构建智能文档问答与任务执行系统

检索增强生成(RAG)通过结合外部知识库与大语言模型,有效缓解了模型幻觉与知识陈旧问题,其核心原理是将用户查询与向量化文档进行语义匹配,检索最相关片段作为生成依据。Agent智能体则基于规划-执行框架,通过工具调用完成多步骤复杂任务。将RAG与Agent结合,形成了能主动利用私有知识进行决策与执行的RAG Agent系统,在智能客服、数据分析助手等场景中价值显著。本文聚焦于LangChain框架下的RAG Agent落地实践,详细拆解了知识库构建、工具封装、Agent组装等关键环节,并提供了针对检索质量优化

weixin_33857230的博客 483

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

基于InternLM与LangChain构建私有化智能知识库:从原理到实践

在信息爆炸的时代,如何高效管理和利用海量非结构化文档(如PDF、Word、会议纪要)成为技术团队和个人知识工作者面临的普遍挑战。传统全文搜索技术依赖于关键词匹配,难以理解语义和上下文,无法应对复杂的自然语言查询。向量化技术和语义搜索应运而生,其核心原理是将文本转换为高维空间中的向量表示,通过计算向量间的相似度来检索语义相近的内容。这项技术的价值在于,它能将大语言模型的通用知识与特定领域的私有数据相结合,构建出能够“理解”文档内容并智能对话的系统。典型的应用场景包括企业内部的技术文档问答、智能客服、个人学习笔

weixin_30323631的博客 493

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LangChain RAG实战:从文档加载到检索增强生成的完整指南

检索增强生成(RAG)是一种将外部知识库与大语言模型结合的技术范式,旨在解决模型幻觉和知识更新问题。其核心原理是通过向量化技术将文档转换为语义向量,利用相似度检索从知识库中获取相关信息,再将这些信息作为上下文输入给大模型进行答案生成。这项技术的核心价值在于能够为模型提供实时、准确的外部知识参考,显著提升回答的准确性和可信度。在应用场景上,RAG广泛适用于智能客服、企业知识库问答、文档分析等需要基于特定文档进行回答的领域。本文以LangChain框架为例,深入剖析了RAG流水线的四个关键环节:文档加载、文本分

weixin_30954265的博客 426

RAG技术实战:从零搭建基于LangChain与向量数据库的智能问答系统

检索增强生成(RAG)是一种将信息检索与大型语言模型生成能力相结合的技术范式。其核心原理是通过向量化技术将外部知识库转换为语义向量,在用户提问时先进行相似性检索,再将检索到的相关上下文与问题一同提交给大语言模型生成答案。这项技术的核心价值在于有效缓解了大语言模型的幻觉问题,并使其能够利用最新、最准确的私有或领域特定数据。在工程实践中,RAG系统通常涉及文档加载、文本切片、向量化索引构建以及检索-生成流水线等关键环节。典型的应用场景包括企业知识库问答、智能客服系统和技术文档助手等。本文将以rag实战项目为例,

chutisun0039的博客 381

LangChain入门核心:从Document处理到RAG应用实战

在构建基于大语言模型的智能应用时,文档处理是至关重要的基础环节。其核心原理是将非结构化文本数据转化为机器可理解、可检索的标准化格式,这一过程直接决定了后续检索增强生成(RAG)系统的效果上限。从技术价值看,高质量的文档处理流水线能显著提升私有知识库的利用率、答案的准确性与可追溯性。典型的应用场景包括企业知识库问答、智能合同分析与自动化报告生成等。本文聚焦LangChain框架中的Document对象,深入探讨了文档加载器(Loader)、文本分割器(Splitter)的选择与调优,并结合BGE等嵌入模型,阐

weixin_34203832的博客 424

AI Agent从无到有44: RAG 文档切分策略深度解析——从长度切割到语义边界

本文介绍了RAG(检索增强生成)系统中文档切分的四种主流策略:基于长度切分、基于文本架构切分、基于文档格式切分和基于语义切分。重点分析了LangChain提供的RecursiveCharacterTextSplitter等切分工具的特点及适用场景,并提供了可本地运行的代码示例。文章指出,合理的文档切分对提升检索精度、控制嵌入成本至关重要,建议根据文档类型和需求选择适当的切分方法,其中RecursiveCharacterTextSplitter因其平衡性成为通用首选方案。

Wang的专栏 295

LangChain核心模块解析与本地知识库问答机器人实战

大语言模型(LLM)作为当前人工智能领域的关键技术,通过其强大的自然语言理解和生成能力,正在重塑人机交互方式。其核心原理是基于海量文本数据训练的Transformer架构,能够捕捉复杂的语言模式。这一技术价值在于,它使得机器能够理解和生成接近人类水平的文本,极大地推动了智能对话、内容创作和自动化决策等应用场景的发展。然而,直接使用LLM API构建复杂应用时,开发者常面临上下文管理、工具集成和知识检索等工程挑战。为此,以LangChain为代表的开发框架应运而生,它通过模块化设计将LLM应用开发中的通用模式

weixin_30784501的博客 366
上一篇: LangChain技术解密:构建大模型应用的全景指南
下一篇: 使用langchain与你自己的数据对话(二):向量存储与嵌入_langchain chat with your data
AI大模型_学习君
博客等级 码龄3年 6137粉丝 551原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值