wordpress積分券網(wǎng)站的seo
前言
RAG(檢索增強(qiáng)生成)是一種創(chuàng)建基于大語言模型(LLM)應(yīng)用的高效方式。它有助于生成對用戶查詢的準(zhǔn)確回答。為了創(chuàng)建一個基于 RAG 的應(yīng)用程序,我們需要執(zhí)行一些操作,例如文檔加載、將大文檔拆分為多個小塊、嵌入、嵌入索引,并將它們存儲在向量數(shù)據(jù)庫中。然后根據(jù)用戶查詢,系統(tǒng)從向量數(shù)據(jù)庫中提取相關(guān)上下文并傳遞給提示詞以及用戶查詢。然后 LLM 將用戶查詢和內(nèi)容結(jié)合起來,生成適當(dāng)?shù)捻憫?yīng)。這是 RAG 系統(tǒng)的整體流程。
文本分割器 在 LangChain 中有助于將大文檔分解為較小的塊。在大文檔或文本中,很難根據(jù)用戶查詢找到相關(guān)的上下文。此外,我們無法將整個大文檔傳遞給 LLM 模型。每個 LLM 模型能處理的 Token 是有限的,因此必須將大文本拆分為較小部分。這樣我們就可以輕松地從這些小塊中找到相關(guān)的上下文,并將其作為輸入傳遞給 LLM,確保輸入量低于模型的最大輸入大小。因此,文本分割器的 關(guān)鍵使用場景 如下:
-
? 處理超過 LLM 模型 Token 限制的大文檔,文本分割技術(shù)有助于將文檔劃分為較小的部分,以便模型處理。
-
? 在問答任務(wù)中,較小的文本塊在查詢、索引和檢索方面更有效,而大文檔則效率較低。
-
? 它通過在適當(dāng)?shù)狞c(diǎn)拆分段落或句子數(shù)量,幫助將上下文保留在較小的部分中。這樣每個塊都包含適當(dāng)?shù)闹R。
-
? LLM 在上下文窗口大小上有 Token 數(shù)量限制。即使上下文大小是無限的,更多的輸入 Token 也會導(dǎo)致更高的成本,而金錢不是 無限的。
LangChain 中的文本分割技術(shù)
LangChain 提供了許多文本分割技術(shù)來適應(yīng)不同類型的數(shù)據(jù)。今天我們將探索不同的文本分割技術(shù),例如字符文本分割器、遞歸字符文本分割器、Token 文本分割器、Markdown 標(biāo)題文本分割器、Python 代碼文本分割器、HTML 文本分割器、Spacy 文本分割器、Latex 文本分割器、遞歸 JSON 文本分割器。如果你有興趣探索更多的分割技術(shù),請訪問這個 LangChain 頁面。建議你在自己的系統(tǒng)上運(yùn)行代碼,深入理解這些概念。
首先,安裝執(zhí)行分割技術(shù)所需的庫。打開命令提示符或終端并運(yùn)行以下命令。
pip install langchain spacy langchain_text_splitter langchain_core
字符文本分割器
這是最基本的文本分割技術(shù),它根據(jù)特定的字符數(shù)來劃分文本。它適用于簡單且統(tǒng)一的文本分割任務(wù)。參數(shù) separator 表示文本將只在換行符處拆分,因為使用了 “\n” 作為分隔符。它避免在段落中間拆分。我們可以使用其他分隔符,如空格。塊大小表示每個塊中的最大字符數(shù),而塊重疊表示從前一個塊中取多少字符到下一個塊中。我們要注意,每個塊應(yīng)該包含有用的知識。
from langchain.text_splitter importCharacterTextSplittertext ="你的長文檔文本在這里..."splitter =CharacterTextSplitter(separator="\n\n",chunk_size=10,chunk_overlap=2
)chunks = splitter.split_text(text)
print(chunks)
遞歸字符文本分割器
它使用字符分隔符將大文檔分解為較小的塊。它遞歸地嘗試使用分隔符層次結(jié)構(gòu)(如段落 \n\n
、句子 \n
和字符 .
、,
)來拆分文本。它優(yōu)先進(jìn)行較高級別的拆分(如段落),如果需要則向下移動層次結(jié)構(gòu)。當(dāng)你需要靈活且分層的方法時,可以嘗試這種技術(shù)。
from langchain.text_splitter importRecursiveCharacterTextSplittertext ="你的長文檔文本在這里..."splitter =RecursiveCharacterTextSplitter(separators=["\n\n","\n"," ",""],chunk_size=1000,chunk_overlap=200,length_function=len
)chunks = splitter.split_text(text)
print(chunks)
Token 文本分割器
它根據(jù) Token 而不是字符或單詞來拆分文本。對于有 Token 限制的語言模型來說,這是必要的。它使用模型的 Token 化方法將大文檔分割成塊。這里我們使用了 OpenAI 的編碼來對文檔進(jìn)行 Token 化。
from langchain.text_splitter import TokenTextSplittertext = "你的長文檔文本在這里..."splitter = TokenTextSplitter(encoding_name="cl100k_base", chunk_size=100,chunk_overlap=20
)chunks = splitter.split_text(text)
print(chunks)
Markdown 標(biāo)題文本分割器
這種方法用于根據(jù)標(biāo)題級別(如 #、##、### 等)拆分 Markdown 文檔。它使用分層方法,例如將特定標(biāo)題及其子標(biāo)題下的文本分開。當(dāng)你想組織 Markdown 文件中的內(nèi)容(如技術(shù)文檔)時,可以嘗試這種分割方法。
from langchain.text_splitter importMarkdownHeaderTextSplittermarkdown_text ="""
# 標(biāo)題
## 部分 1
部分 1 的內(nèi)容
## 部分 2
部分 2 的內(nèi)容
### 子部分 2.1
子部分 2.1 的內(nèi)容
"""headers_to_split_on =[
("#","Header 1"),
("##","Header 2"),
("###","Header 3"),
]splitter =MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
chunks = splitter.split_text(markdown_text)
print(chunks)
Python 代碼文本分割器
當(dāng)你想將 Python 代碼分解為較小的邏輯塊時,這種技術(shù)非常有用。它基于 Python 特定的分隔符(如函數(shù)、類等)來拆分代碼。
from langchain.text_splitter importPythonCodeTextSplitterpython_code ="""
def function1():print("Hello,World!")class MyClass:def __init__(self):self.value = 42def method1(self):return self.value
"""splitter =PythonCodeTextSplitter(chunk_size=100,chunk_overlap=20
)chunks = splitter.split_text(python_code)
print(chunks)
HTML 文本分割器
當(dāng)你處理網(wǎng)頁時,想要基于 HTML 層次結(jié)構(gòu)進(jìn)行分割而不破壞文檔結(jié)構(gòu)。你可以使用這種技術(shù),它根據(jù)文檔的結(jié)構(gòu)來拆分 HTML 內(nèi)容。它識別常見的 HTML 標(biāo)簽,如 <p>、<div>、<h1>
等,并根據(jù)文檔結(jié)構(gòu)拆分文本。
from langchain_text_splitters importHTMLSectionSplitterhtml_text ="""
<html>
<body>
<h1>主標(biāo)題</h1>
<p>這是一個段落。</p>
<div><h2>子部分</h2><p>另一個段落。</p>
</div>
</body>
</html>
"""headers_to_split_on =[("h1","Header 1"),("h2","Header 2")]
splitter =HTMLSectionSplitter(headers_to_split_on=headers_to_split_on,chunk_size=100,chunk_overlap=20
)chunks = splitter.split_text(html_text)
chunks
Spacy 文本分割器
它使用 Spacy NLP 管道來分割文本,利用 Spacy 的 Token 化和句子分割能力,基于語言規(guī)則來拆分文本。當(dāng)語言細(xì)微差別(如句子邊界)很重要時,可以嘗試這種方法。
from langchain.text_splitter import SpacyTextSplittertext = "你的長文檔文本在這里。它可以是多種語言的。SpaCy 將處理語言的細(xì)微差別。"splitter = SpacyTextSplitter(chunk_size=100,chunk_overlap=20
)chunks = splitter.split_text(text)
chunks
Latex 文本分割器
當(dāng)你處理科學(xué)論文、數(shù)學(xué)文檔或任何 LaTex 格式的文本時,可以使用這種技術(shù),它在保留其結(jié)構(gòu)的同時拆分文本。它使用 latex 特定的分隔符,如 \\documentclass{}
、\\begin{}
等,將文本拆分為塊。
from langchain.text_splitter importLatexTextSplitterlatex_text = r"""
\documentclass{article}
\begin{document}
\section{引言}
這是引言部分。
\section{方法}
這是方法部分。
\end{document}
"""splitter =LatexTextSplitter(chunk_size=100,chunk_overlap=20
)chunks = splitter.split_text(latex_text)
chunks
遞歸 JSON 文本分割器
你可以使用它將大型或嵌套的 JSON 對象分割為較小的可管理部分。它遞歸地拆分 JSON,并通過遍歷鍵和值保持層次結(jié)構(gòu)的順序。
from langchain_text_splitters importRecursiveJsonSplitterjson_data ={
"company":{
"name":"TechCorp",
"location":{
"city":"Metropolis",
"state":"NY"
},
"departments":[
{
"name":"Research",
"employees":[
{"name":"Alice","age":30,"role":"Scientist"},
{"name":"Bob","age":25,"role":"Technician"}
]
},
{
"name":"Development",
"employees":[
{"name":"Charlie","age":35,"role":"Engineer"},
{"name":"David","age":28,"role":"Developer"}
]
}
]
},
"financials":{
"year":2023,
"revenue":1000000,
"expenses":750000
}
}splitter =RecursiveJsonSplitter(max_chunk_size=200, min_chunk_size=20)chunks = splitter.split_text(json_data, convert_lists=True)for chunk in chunks:
print(len(chunk))
print(chunk)
選擇合適的文本分割器
我們之前討論過遞歸字符文本分割技術(shù)。你也可以使用這種技術(shù)遞歸地分割編程語言。編程語言的結(jié)構(gòu)不同于純文本,我們可以根據(jù)特定語言的語法來拆分代碼。
from langchain_text_splitters importRecursiveCharacterTextSplitter,LanguagePYTHON_CODE ="""
def add(a, b):return a + bclass Calculator:def __init__(self):self.result = 0def add(self, value):self.result += valuereturn self.resultdef subtract(self, value):self.result -= valuereturn self.result# 調(diào)用函數(shù)
def main():calc = Calculator()print(calc.add(5))print(calc.subtract(2))if __name__ == "__main__":main()
"""python_splitter =RecursiveCharacterTextSplitter.from_language(language=Language.PYTHON, chunk_size=100, chunk_overlap=0)python_docs = python_splitter.create_documents([PYTHON_CODE])
python_docs
如果你不確定哪種分割技術(shù)最適合你的 RAG 應(yīng)用程序,可以選擇遞歸字符文本分割器技術(shù)。它作為通用的默認(rèn)選項,也可以執(zhí)行專門的分割器,如 MarkdownHeaderTextSplitter、PythonCodeTextSplitter 等,它們?yōu)樘囟ǖ奈臋n格式提供解決方案。
最后的最后
感謝你們的閱讀和喜歡,我收藏了很多技術(shù)干貨,可以共享給喜歡我文章的朋友們,如果你肯花時間沉下心去學(xué)習(xí),它們一定能幫到你。
因為這個行業(yè)不同于其他行業(yè),知識體系實在是過于龐大,知識更新也非???。作為一個普通人,無法全部學(xué)完,所以我們在提升技術(shù)的時候,首先需要明確一個目標(biāo),然后制定好完整的計劃,同時找到好的學(xué)習(xí)方法,這樣才能更快的提升自己。
這份完整版的大模型 AI 學(xué)習(xí)資料已經(jīng)上傳CSDN,朋友們?nèi)绻枰梢晕⑿艗呙柘路紺SDN官方認(rèn)證二維碼免費(fèi)領(lǐng)取【保證100%免費(fèi)
】

大模型知識腦圖
為了成為更好的 AI大模型 開發(fā)者,這里為大家提供了總的路線圖。它的用處就在于,你可以按照上面的知識點(diǎn)去找對應(yīng)的學(xué)習(xí)資源,保證自己學(xué)得較為全面。
經(jīng)典書籍閱讀
閱讀AI大模型經(jīng)典書籍可以幫助讀者提高技術(shù)水平,開拓視野,掌握核心技術(shù),提高解決問題的能力,同時也可以借鑒他人的經(jīng)驗。對于想要深入學(xué)習(xí)AI大模型開發(fā)的讀者來說,閱讀經(jīng)典書籍是非常有必要的。
實戰(zhàn)案例
光學(xué)理論是沒用的,要學(xué)會跟著一起敲,要動手實操,才能將自己的所學(xué)運(yùn)用到實際當(dāng)中去,這時候可以搞點(diǎn)實戰(zhàn)案例來學(xué)習(xí)。
面試資料
我們學(xué)習(xí)AI大模型必然是想找到高薪的工作,下面這些面試題都是總結(jié)當(dāng)前最新、最熱、最高頻的面試題,并且每道題都有詳細(xì)的答案,面試前刷完這套面試題資料,小小offer,不在話下
640套AI大模型報告合集
這套包含640份報告的合集,涵蓋了AI大模型的理論研究、技術(shù)實現(xiàn)、行業(yè)應(yīng)用等多個方面。無論您是科研人員、工程師,還是對AI大模型感興趣的愛好者,這套報告合集都將為您提供寶貴的信息和啟示。
這份完整版的大模型 AI 學(xué)習(xí)資料已經(jīng)上傳CSDN,朋友們?nèi)绻枰梢晕⑿艗呙柘路紺SDN官方認(rèn)證二維碼免費(fèi)領(lǐng)取【保證100%免費(fèi)
】
