91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文讀懂RAG基礎(chǔ)以及基于langchain的RAG實(shí)戰(zhàn)

京東云 ? 來(lái)源:京東科技 蔡欣彤 ? 作者:京東科技 蔡欣彤 ? 2025-04-02 15:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者:京東科技 蔡欣彤

本文參與神燈創(chuàng)作者計(jì)劃 - 前沿技術(shù)探索與應(yīng)用賽道

內(nèi)容背景

隨著大模型應(yīng)用不斷落地,知識(shí)庫(kù),RAG是現(xiàn)在繞不開(kāi)的話題,但是相信有些小伙伴和我一樣,可能會(huì)一直存在一些問(wèn)題,例如:

?什么是RAG

?上傳的文檔怎么就能檢索了,中間是什么過(guò)程

?有的知道中間會(huì)進(jìn)行向量化,會(huì)向量存儲(chǔ),那他們具體的含義和實(shí)際過(guò)程產(chǎn)生效果是什么

?還有RAG = 向量化 + 向量存儲(chǔ) + 檢索 么?

?向量化 + 向量存儲(chǔ) 就只是RAG 么?

為了解決這些困惑,我查找了langchain的官方文檔,并利用文檔中提供的方法進(jìn)行了實(shí)際操作。這篇文章是我的學(xué)習(xí)筆記,也希望為同樣存在相同困惑的伙伴們能提供一些幫助。

最后代碼都上傳到coding了,地址是: https://github.com/XingtongCai/langchain_project/tree/main/translatorAssistant/basic_knowledge

一. RAG的基本概念

檢索增強(qiáng)生成(Retrieval Augmented Generation, RAG) 通過(guò)將語(yǔ)言模型與外部知識(shí)庫(kù)結(jié)合來(lái)增強(qiáng)模型的能力。RAG 解決了模型的一個(gè)關(guān)鍵限制:模型依賴于固定的訓(xùn)練數(shù)據(jù)集,這可能導(dǎo)致信息過(guò)時(shí)或不完整。

審核編輯 黃宇

wKgZPGfs4J2AWE9lAAI-X-mEuAE493.png

??

RAG大致過(guò)程如圖:

?接收用戶查詢 (Receive an input query)

?使用檢索系統(tǒng)根據(jù)查詢尋找相關(guān)信息 (Use the retrieval system to search for relevant information based on the query.)

?將檢索到的信息合并到提示詞,然后發(fā)送給LLM(Incorporate the retrieved information into the prompt sent to the LLM.)

?模型利用提供的上下文生成對(duì)查詢的響應(yīng)(Generate a response that leverages the retrieved context.)

二. 關(guān)鍵技術(shù)

示例代碼地址: rag.ipynb ,用jupyter工具可以直接看并且調(diào)試

一個(gè)完整的 RAG流程 通常包含以下核心環(huán)節(jié),每個(gè)環(huán)節(jié)都有明確的技術(shù)目標(biāo)和實(shí)現(xiàn)方法:

?文檔加載和預(yù)處理

?文本分割

?數(shù)據(jù)向量化

?向量存儲(chǔ)與索引構(gòu)建

?內(nèi)容檢索

wKgZPGfs4J-AXtJnAAHixr6cgzE207.png

2.1 Document Loaders 數(shù)據(jù)加載

具體文檔: document_loaders?

整個(gè)langchain支持多種形式的數(shù)據(jù)源加載,這里面以加載pdf為例嘗試:

# document loader
from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("./DeepSeek_R1.pdf")

pages = []
# 異步加載前 11 頁(yè)
i = 0  # 手動(dòng)維護(hù)計(jì)數(shù)器
async for page in loader.alazy_load():
    if i >= 11:  # 只加載前 11 頁(yè)
        break
    pages.append(page)
    i+=1
    
print(f"{pages[0].metadata}n") // pdf的信息
print(pages[0].page_content) // 第一頁(yè)的內(nèi)容

2.2 Text splitters 文本分割

參考文檔: Text splitters

文本分割器將文檔分割成更小的塊以供下游應(yīng)用程序使用。

wKgZO2fs4KCAbMLjAAGP5DLX7No660.png

2.2.1 分割策略 - 基于長(zhǎng)度(Length-based)

基于長(zhǎng)度的分割是最直觀的策略是根據(jù)文檔的長(zhǎng)度進(jìn)行拆分。它的分割類型如下:

?Token-based :Splits text based on the number of tokens, which is useful when working with language models.

?Character-based: Splits text based on the number of characters, which can be more consistent across different types of text

常見(jiàn)CharacterTextSplitter用法,

from langchain_text_splitters import CharacterTextSplitter
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
    encoding_name="cl100k_base", chunk_size=20, chunk_overlap=0
)
texts = text_splitter.split_text(pages[0].page_content)
print(texts[0])

擴(kuò)展補(bǔ)充: token和character的區(qū)別: token 是語(yǔ)言模型處理文本時(shí)的基本單位,通常是一個(gè)詞、子詞或符號(hào)。 Character 是文本的最小單位,例如英文字母、中文字符、標(biāo)點(diǎn)符號(hào)等。 # 示例 from transformers import GPT2Tokenizer tokenizer = GPT2Tokenizer.from_pretrained("gpt2") text = "Hello,world!" tokens = tokenizer.tokenize(text) print(tokens) # ['Hello', ',', 'world', '!'] chunk_size = 5 chunks = [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)] print(chunks) # ['Hello', ',worl', 'd!']

2.1.2 分割策略 - 基于文本結(jié)構(gòu)(Text-structured based )

文本自然地被組織成層次化的單元,例如段落、句子和單詞。可以利用這種固有結(jié)構(gòu)來(lái)指導(dǎo)分割策略,創(chuàng)建能夠保持自然語(yǔ)言流暢性、在分割中保持語(yǔ)義連貫性并適應(yīng)不同文本粒度級(jí)別的分割。RecursiveCharacterTextSplitter 支持這個(gè)方式。

from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,  # 每個(gè)片段的最大字符數(shù)
    chunk_overlap=100,  # 片段之間的重疊字符數(shù)
    separators=["nn", "n"]  # 分割符(按段落、句子、標(biāo)點(diǎn)等)
)
chunks = text_splitter.split_documents(pages)
print(f"文檔被分割成 {len(chunks)} 個(gè)塊") # 文檔被分割成 37 個(gè)塊

2.1.3 分割策略 - 基于文檔結(jié)構(gòu)(Document-structured based)

某些文檔具有固有的結(jié)構(gòu),例如 HTMLMarkdownJSON 文件。在這些情況下,基于文檔結(jié)構(gòu)進(jìn)行分割是有益的,因?yàn)樗ǔW匀坏胤纸M了語(yǔ)義相關(guān)的文本。

# Markdown 文檔的分割
from langchain_community.document_loaders import UnstructuredMarkdownLoader
from langchain.text_splitter import MarkdownHeaderTextSplitter

# 加載 Markdown 文檔
loader = UnstructuredMarkdownLoader("example.md")
documents = loader.load()

# 使用 MarkdownHeaderTextSplitter 分割
splitter = MarkdownHeaderTextSplitter(headers_to_split_on=["#", "##", "###"])
chunks = splitter.split_text(documents[0].page_content)

# 打印分割結(jié)果
for chunk in chunks:
    print(chunk)

2.1.4 分割策略 - 基于語(yǔ)義的分割(semantic-based splitting)

與之前的方法不同,基于語(yǔ)義的分割實(shí)際上考慮了文本的內(nèi)容。雖然其他方法使用文檔或文本結(jié)構(gòu)作為語(yǔ)義的代理,但這種方法直接分析文本的語(yǔ)義。核心方法是基于NLP模型,使用句子嵌入(Sentence-BERT)計(jì)算語(yǔ)義邊界,通過(guò)文本相似度突變檢測(cè)分割點(diǎn)

2.3 Embedding 向量化

參考文檔: Embedding models

嵌入模型(embedding models)是許多檢索系統(tǒng)的核心。嵌入模型將人類語(yǔ)言轉(zhuǎn)換為機(jī)器能夠理解并快速準(zhǔn)確比較的格式。這些模型以文本作為輸入,生成一個(gè)固定長(zhǎng)度的數(shù)字?jǐn)?shù)組。嵌入使搜索系統(tǒng)不僅能夠基于關(guān)鍵詞匹配找到相關(guān)文檔,還能夠基于語(yǔ)義理解進(jìn)行檢索。主要應(yīng)用之一是rag.

wKgZPGfs4KGAWs2CAAL9JNNPMCM632.png

LangChain 提供了一個(gè)通用接口,用于與嵌入模型交互,并為常見(jiàn)操作提供了標(biāo)準(zhǔn)方法。這個(gè)通用接口通過(guò)兩個(gè)核心方法簡(jiǎn)化了與各種嵌入提供商的交互:

?embed_documents:用于嵌入多個(gè)文本(文檔)。

?embed_query:用于嵌入單個(gè)文本(查詢)。

from langchain_openai import OpenAIEmbeddings

# 初始化 OpenAI 嵌入模型
embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")

# 這里取第一個(gè)片段進(jìn)行embedding,省token
document_embeddings = embeddings.embed_documents(chunks[0].page_content)
print("文檔嵌入:", document_embeddings[0]) # 文檔嵌入: [0.0063153719529509544, -0.00667550228536129,...]
print(len(document_embeddings)) # 935
# 單個(gè)查詢
query = "這篇文章介紹DeepSeek的什么版本"
# 使用 embed_query 嵌入單個(gè)查詢
query_embedding = embeddings.embed_query(query)
print("查詢嵌入:", query_embedding)
# 查詢嵌入:[-0.0036168822553008795, 0.0056339893490076065,...]

?

2.4 Vector stores 向量存儲(chǔ)

參考文檔: Vector stores

其實(shí)langchain支持embedding和vector 的種類有很多,具體支持類型見(jiàn) full list of LangChain vectorstore integrations.

其中, 向量存儲(chǔ)(Vector Stores) 是一種專門的數(shù)據(jù)存儲(chǔ),支持基于向量表示的索引和檢索。這些向量捕捉了被嵌入數(shù)據(jù)的語(yǔ)義意義。

向量存儲(chǔ)通常用于搜索非結(jié)構(gòu)化數(shù)據(jù)(如文本、圖像和音頻),以基于語(yǔ)義相似性而非精確的關(guān)鍵詞匹配來(lái)檢索相關(guān)信息。主要應(yīng)用場(chǎng)景之一是rag。

wKgZO2fs4KOAZEh8AAPjOKecqsQ122.png

??

??

LangChain 提供了一個(gè)標(biāo)準(zhǔn)接口,用于與向量存儲(chǔ)交互,使用戶能夠輕松切換不同的向量存儲(chǔ)實(shí)現(xiàn)。

該接口包含用于在向量存儲(chǔ)中寫入、刪除和搜索文檔的基本方法。

關(guān)鍵方法包括:

1.add_documents:將一組文本添加到向量存儲(chǔ)中。

2.delete:從向量存儲(chǔ)中刪除一組文檔。

3.similarity_search:搜索與給定查詢相似的文檔。

# vector store
from langchain_core.vectorstores import InMemoryVectorStore
# 實(shí)例化向量存儲(chǔ)
vector_store = InMemoryVectorStore(embeddings)
# 將已經(jīng)轉(zhuǎn)為向量的文檔存儲(chǔ)到向量存儲(chǔ)中
ids =vector_store.add_documents(documents=chunks)
print(ids) # ['b5b11014-7702-45f6-aa0d-7272042c5d4d', '93ed319a-5110-40ac-8bf4-117a220ed0cb', '63b92a2f-bf47-4a10-b66b-cd39776995f7',...]

vector_store.delete(ids=["93ed319a-5110-40ac-8bf4-117a220ed0cb"])
vector_store.similarity_search('What is the model introduced in this paper?',k=4)

額外補(bǔ)充一句:

向量化嵌入和向量存儲(chǔ)不僅限于檢索增強(qiáng)生成(RAG)系統(tǒng),它們有更廣泛的應(yīng)用場(chǎng)景:
其他應(yīng)用領(lǐng)域包括:
1.語(yǔ)義搜索系統(tǒng) - 基于內(nèi)容含義而非關(guān)鍵詞匹配的搜索
2.推薦系統(tǒng) - 根據(jù)內(nèi)容或用戶行為的相似性推薦項(xiàng)目
3.文檔聚類 - 自動(dòng)組織和分類大量文檔
4.異常檢測(cè) - 識(shí)別與正常模式偏離的數(shù)據(jù)點(diǎn)
5.多模態(tài)系統(tǒng) - 連接文本、圖像、音頻等不同模態(tài)的內(nèi)容
6.內(nèi)容去重 - 識(shí)別相似或重復(fù)的內(nèi)容
7.知識(shí)圖譜 - 構(gòu)建實(shí)體之間的語(yǔ)義關(guān)聯(lián)
8.情感分析 - 捕捉文本的情感特征
RAG是向量嵌入技術(shù)的一個(gè)重要應(yīng)用,但這些技術(shù)的價(jià)值遠(yuǎn)不止于此,它們?yōu)楦鞣N需要理解內(nèi)容語(yǔ)義關(guān)系的AI系統(tǒng)提供了基礎(chǔ)。

2.5 Retriever 檢索

參考文檔: retrievers

目前存在許多不同類型的檢索系統(tǒng),包括 向量存儲(chǔ)(vectorstores)、圖數(shù)據(jù)庫(kù)(graph databases)關(guān)系數(shù)據(jù)庫(kù)(relational databases)。

wKgZPGfs4KOAW-b6AAEaq2q5bzo504.png

??

LangChain 提供了一個(gè)統(tǒng)一的接口,用于與不同類型的檢索系統(tǒng)交互。LangChain 的檢索器接口非常簡(jiǎn)單:

?輸入:一個(gè)查詢(字符串)。

?輸出:一組文檔(標(biāo)準(zhǔn)化的 LangChain Document 對(duì)象)。

而且LangChain的retriever是runnable類型,runnable可用方法他都可以調(diào)用,比如:

docs = retriever.invoke(query)

2.5.1 基礎(chǔ)檢索器的幾種類型說(shuō)明

在 LangChain 中,as_retriever() 方法的 search_type 參數(shù)決定了向量檢索的具體算法和行為。以下是三種搜索類型的詳細(xì)解釋和對(duì)比:

retriever = vector_store.as_retriever(
    search_type="similarity",  # 可選 "similarity"|"mmr"|"similarity_score_threshold"
    search_kwargs={
        "k": 5,  # 返回結(jié)果數(shù)量
        "score_threshold": 0.7,  # 僅當(dāng)search_type="similarity_score_threshold"時(shí)有效
        "filter": {"source": "重要文檔.pdf"},  # 元數(shù)據(jù)過(guò)濾
        "lambda_mult": 0.25  # 僅MMR搜索有效(控制多樣性)
    }
)

search_kwargs: 搜索條件

search_type可選 "similarity"|"mmr"|"similarity_score_threshold"

?similarity(默認(rèn))-標(biāo)準(zhǔn)相似度搜索

原理:直接返回與查詢向量最相似的 k 個(gè)文檔(基于余弦相似度或L2距離)

特點(diǎn)

?結(jié)果完全按相似度排序

?適合精確匹配場(chǎng)景

?

?mmr-最大邊際相關(guān)性

原理:在相似度的基礎(chǔ)上增加多樣性控制,避免返回內(nèi)容重復(fù)的結(jié)果

核心參數(shù)

?lambda_mult:0-1之間的值,越小結(jié)果越多樣

?接近1:更偏向相似度(類似similarity)

?接近0:更偏向多樣性

特點(diǎn)

?檢索結(jié)果需要覆蓋不同子主題時(shí)

?避免返回內(nèi)容雷同的文檔

?

similarity_score_threshold-帶分?jǐn)?shù)閾值的相似度搜索

?原理:只返回相似度超過(guò)設(shè)定閾值的文檔

?關(guān)鍵參數(shù)

?score_threshold:相似度閾值(余弦相似度范圍0-1)

?k:最大返回?cái)?shù)量(但實(shí)際數(shù)量可能少于k)

?特點(diǎn):

?適合質(zhì)量?jī)?yōu)先的場(chǎng)景

?結(jié)果數(shù)量不固定(可能返回0個(gè)或多個(gè))

?

類型 核心目標(biāo) 結(jié)果數(shù)量 是否控制多樣性 典型應(yīng)用場(chǎng)景
similarity 精確匹配 固定k個(gè) ? 事實(shí)性問(wèn)題回答
mmr 平衡相關(guān)性與多樣性 固定k個(gè) ? 生成綜合性報(bào)告
similarity_score_threshold 質(zhì)量過(guò)濾 動(dòng)態(tài)數(shù)量 ? 高精度篩選

2.5.2 高級(jí)檢索工具

1.MultiQueryRetriever - 提升模糊查詢召回率

設(shè)計(jì)目標(biāo):通過(guò)查詢擴(kuò)展提升檢索質(zhì)量 核心思想

?對(duì)用戶輸入問(wèn)題生成多個(gè)相關(guān)查詢(如同義改寫、子問(wèn)題拆解

?合并多查詢結(jié)果并去重

關(guān)鍵特點(diǎn)

?提升模糊查詢的召回率

?依賴LLM生成優(yōu)質(zhì)擴(kuò)展查詢(需控制生成成本)

?

2.MultiVectorRetriever -多向量檢索

設(shè)計(jì)目標(biāo):處理單個(gè)文檔的多種向量表示形式 核心思想

?對(duì)同一文檔生成多組向量(如全文向量、摘要向量、關(guān)鍵詞向量等)

?通過(guò)多角度表征提升召回率

關(guān)鍵特點(diǎn)

?適用于文檔結(jié)構(gòu)復(fù)雜場(chǎng)景(如技術(shù)論文含正文/圖表/代碼)

?存儲(chǔ)開(kāi)銷較大(需存多組向量)

?

3.RetrievalQA

設(shè)計(jì)目標(biāo):端到端的問(wèn)答系統(tǒng)構(gòu)建 核心思想

?將檢索器與LLM答案生成模塊管道化

?支持多種鏈類型(stuff/map_reduce/refine等)

使用方法:

# 構(gòu)建一個(gè)高性能問(wèn)答系統(tǒng)
from langchain.chains import RetrievalQA
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.retrievers.multi_vector import MultiVectorRetriever
# 1. 多向量存儲(chǔ)
# 假設(shè)已生成不同視角的向量
vectorstore = FAISS.from_texts(documents, embeddings)

mv_retriever = MultiVectorRetriever(
    vectorstore=vectorstore,
    docstore=standard_docstore,  # 存儲(chǔ)原始文檔
    id_key="doc_id"  # 關(guān)聯(lián)不同向量與原始文檔
)

# 2. 多查詢擴(kuò)展
mq_retriever = MultiQueryRetriever.from_llm(
    retriever=mv_retriever,
    llm=ChatOpenAI(temperature=0.3)
)

# 3. 問(wèn)答鏈
qa = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(temperature=0),
    chain_type="refine",
    retriever=mq_retriever,
    chain_type_kwargs={"verbose": True}
)

# 執(zhí)行
answer = qa.run("請(qǐng)對(duì)比Transformer和CNN的優(yōu)缺點(diǎn)")

?

4.TimeWeightedVectorStoreRetriever - 時(shí)間加權(quán)檢索

?設(shè)計(jì)目標(biāo):專門用于在向量檢索中引入時(shí)間衰減因子,使系統(tǒng)更傾向于返回近期文檔

? 典型使用場(chǎng)景

1. 新聞/社交媒體應(yīng)用 -優(yōu)先展示最新報(bào)道而非歷史文章

2. 技術(shù)文檔系統(tǒng) - 優(yōu)先推薦最新API文檔版本

3. 實(shí)時(shí)監(jiān)控告警 - 使最近的事件告警排名更高

?

2.5.3 混合檢索

EnsembleRetriever - 集合檢索器

?場(chǎng)景:結(jié)合語(yǔ)義+關(guān)鍵詞搜索

ContextualCompressionRetriever-上下文壓縮

?場(chǎng)景:過(guò)濾低相關(guān)性片段

三. 代碼實(shí)戰(zhàn)

說(shuō)完了技術(shù),接下來(lái)就真正嘗試兩個(gè)個(gè)例子,走一遍RAG全流程。

3.1 構(gòu)建一個(gè)簡(jiǎn)單的員工工作指南檢索系統(tǒng)

需求背景:我現(xiàn)在要給一個(gè)企業(yè)做員工工作指南的檢索系統(tǒng),方便員工查閱最新資訊。里面包含.pdf,.docx,.txt三種文件。

技術(shù)點(diǎn)

?使用FAISS做向量存儲(chǔ),MultiQueryRetriever和RetrievalQA做增強(qiáng)檢索

?構(gòu)建一個(gè)chain做問(wèn)答

代碼地址: https://github.com/XingtongCai/langchain_project/tree/main/translatorAssistant/basic_knowledge/%E5%91%98%E5%B7%A5%E6%89%8B%E5%86%8C%E7%9A%84%E6%A3%80%E7%B4%A2%E7%B3%BB%E7%BB%9F

目錄結(jié)構(gòu)

wKgZO2fs4KmAIpCJAAD07TFYQ64773.png

??

三個(gè)需要加載的文檔, index.faiss和index.pkl是我已經(jīng)做好向量化的文件,如果不想自己做向量化或者想省一些token,可以直接讀取這兩個(gè)文件。代碼段如下:

# 如果已經(jīng)有embedding文件,直接加載,不要重新處理了,節(jié)省token
embedding = OpenAIEmbeddings(model="text-embedding-ada-002",chunk_size=1000)
vector_store_1 = FAISS.load_local(
    folder_path="./docs",       # 存放index.faiss和index.pkl的目錄路徑
    embeddings=embedding,      # 必須與創(chuàng)建時(shí)相同的嵌入模型
    index_name="index",          # 可選:若文件名不是默認(rèn)的"index",需指定前綴
    allow_dangerous_deserialization=True  # 顯式聲明信任
)
print(f"已加載 {len(vector_store_1.docstore._dict)} 個(gè)文檔塊")
print(vector_store_1)

運(yùn)行方式2種:

1.用 jupyter工具,直接運(yùn)行Langchain_QA.ipynb 這個(gè)文件,可以單步調(diào)試。我運(yùn)行的結(jié)果也可以直接看到

2.用python腳本,直接運(yùn)行Langchain_QA.py這個(gè)文件

cd translatorAssistant/basic_knowledge/員工手冊(cè)的檢索系統(tǒng)

python Langchain_QA.py

示例問(wèn)題可以嘗試:
"應(yīng)聘人員須提供什么資料"
"Rose的花語(yǔ)是什么"

結(jié)果界面

wKgZPGfs4KqAAMqfAACk0kqFvDY519.png

??

wKgZO2fs4KqAcmaRAAEFCISPDRc751.png

??

3.2 讀取網(wǎng)頁(yè)的blog并進(jìn)行多輪對(duì)話來(lái)查詢

需求背景:我現(xiàn)在要讀取 https://lilianweng.github.io/posts/2023-06-23-agent/ 這個(gè)blog的內(nèi)容,并對(duì)里面內(nèi)容進(jìn)行多輪對(duì)話的檢索

技術(shù)點(diǎn)

?使用WebBaseLoader來(lái)加載網(wǎng)頁(yè)內(nèi)容

?使用rlm/rag-prompt來(lái)構(gòu)建rag的prompt提示詞模版

?使用ConversationBufferMemory來(lái)做記憶存儲(chǔ),進(jìn)行多輪對(duì)話

?構(gòu)建stream_generator支持流式輸出

代碼地址: https://github.com/XingtongCai/langchain_project/tree/main/translatorAssistant/basic_knowledge/%E5%A4%9A%E8%BD%AE%E5%AF%B9%E8%AF%9D%E7%9A%84%E6%A3%80%E7%B4%A2%E7%B3%BB%E7%BB%9F

目錄結(jié)構(gòu)

和上面結(jié)構(gòu)差不多,docs里面是向量化好的文件,.ipynb可以單步調(diào)試并且能看我運(yùn)行的每一步結(jié)果,.py是最后整個(gè)python文件

運(yùn)行方式:和上面示例一樣

運(yùn)行結(jié)果

多輪對(duì)話的的prompt:

最后結(jié)果

wKgZPGfs4KuAJqbzAAIfRhDKYzk327.png

??

?

四.企業(yè)級(jí)RAG

上面的內(nèi)容是作為RAG的基礎(chǔ)知識(shí),但是想做企業(yè)級(jí)別的RAG,尤其是要做 產(chǎn)品資訊助手 這種基于知識(shí)庫(kù)和用戶進(jìn)行問(wèn)答式的交流還遠(yuǎn)遠(yuǎn)不夠。總流程沒(méi)有區(qū)別,但是每一塊都有自己特殊處理地方:

我通過(guò)讀取一些企業(yè)級(jí)RAG的文章,大致整理一下這種流程,但是真實(shí)使用時(shí)候,還是需要根據(jù)我們自己業(yè)務(wù)文檔,使用的場(chǎng)景和對(duì)于回答準(zhǔn)確率要求的情況來(lái)酌情處理。

4.1 文本加載和文本清洗

企業(yè)級(jí)知識(shí)庫(kù)構(gòu)建在 預(yù)處理 這部分的處理是重頭戲。因?yàn)槲覀兾臋n是多樣性的,有不同類型文件,文件里面還有圖片,圖片里面內(nèi)容有時(shí)候也是需要識(shí)別的。另外文檔基本都是產(chǎn)品或者運(yùn)營(yíng)來(lái)寫,里面有很多口頭語(yǔ)的表述,過(guò)多不合適的分段/語(yǔ)氣詞,多余的空格,這些問(wèn)題都會(huì)影響最后分割的效果。一般文本清洗需要做一下幾步:

?去除雜音:去掉文本中的無(wú)關(guān)信息或者噪聲,比如多余的空格、HTML 標(biāo)簽和特殊符號(hào)等。

?標(biāo)準(zhǔn)化格式:將文本轉(zhuǎn)換為統(tǒng)一的格式,如將所有字符轉(zhuǎn)為小寫,或者統(tǒng)一日期、數(shù)字的表示。

?處理標(biāo)點(diǎn)符號(hào)和分詞:處理或移除不必要的標(biāo)點(diǎn)符號(hào),并對(duì)文本進(jìn)行適當(dāng)?shù)姆衷~處理。

?去除停用詞:移除那些對(duì)語(yǔ)義沒(méi)有特別貢獻(xiàn)的常用詞匯,例如“的”、“在”、“而”等。

?拼寫糾錯(cuò):糾正文本中的拼寫錯(cuò)誤,以確保文本的準(zhǔn)確性和一致性。

?詞干提取和詞形還原:將詞語(yǔ)簡(jiǎn)化為詞干或者詞根形式,以減少詞匯的多樣性并保持語(yǔ)義的一致性。

4.2 文本分割

除了采取上面的基本分割方式,然后還可以結(jié)合層次分割優(yōu)化不同粒度的索引結(jié)構(gòu),提高檢索匹配度。

補(bǔ)充一下多級(jí)索引結(jié)構(gòu):

wKgZO2fs4KyAOv3mAAC9lswAhMc727.png

??

from langchain.text_splitter import MarkdownHeaderTextSplitter

headers = [
    ("#", "Header 1"),
    ("##", "Header 2"),
    ("###", "Header 3")
]
splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers)
chunks = splitter.split_text(markdown_doc)

4.3 向量存儲(chǔ)

在企業(yè)級(jí)存儲(chǔ)一般數(shù)據(jù)量都很大,用內(nèi)存緩存是不現(xiàn)實(shí)的,基本都是需要存在數(shù)據(jù)庫(kù)中。至于用什么數(shù)據(jù)庫(kù),怎么存也根據(jù)文本類型有變化,例如:

?向量數(shù)據(jù)庫(kù):向量存儲(chǔ)庫(kù)非常適合存儲(chǔ)文本、圖像、音頻等非結(jié)構(gòu)化數(shù)據(jù),并根據(jù)語(yǔ)義相似性搜索數(shù)據(jù)。

?圖數(shù)據(jù)庫(kù):圖數(shù)據(jù)庫(kù)以節(jié)點(diǎn)和邊的形式存儲(chǔ)數(shù)據(jù)。它適用于存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù),如表格、文檔等,并使用數(shù)據(jù)之間的關(guān)系搜索數(shù)據(jù)。

4.4 向量檢索

在很多情況下,用戶的問(wèn)題可能以口語(yǔ)化形式呈現(xiàn),語(yǔ)義模糊,或包含過(guò)多無(wú)關(guān)內(nèi)容。將這些模糊的問(wèn)題進(jìn)行向量化后,召回的內(nèi)容可能無(wú)法準(zhǔn)確反映用戶的真實(shí)意圖。此外,召回的內(nèi)容對(duì)用戶提問(wèn)的措辭也非常敏感,不同的提問(wèn)方式可能導(dǎo)致不同的檢索結(jié)果。因此,如果計(jì)算能力和響應(yīng)時(shí)間允許,可以先利用LLM對(duì)用戶的原始提問(wèn)進(jìn)行改寫和擴(kuò)展,然后再進(jìn)行相關(guān)內(nèi)容的召回。

4.5 內(nèi)容緩存

在一些特定場(chǎng)景中,對(duì)于用戶的問(wèn)答檢索需要做緩存處理,以提高響應(yīng)速度??梢砸杂脩鬷d,時(shí)間順序,信息權(quán)重作為標(biāo)識(shí)進(jìn)行存儲(chǔ)。

還有一些關(guān)于將檢索信息和prompt結(jié)合時(shí)候,如何處理等其他流程,這里不多講,講多了頭疼。。。

總結(jié)

本文介紹了RAG的基礎(chǔ)過(guò)程,在langchain框架下如何使用,再到提供兩個(gè)個(gè)例子進(jìn)行了代碼實(shí)踐,最后又簡(jiǎn)要介紹了企業(yè)級(jí)別RAG構(gòu)建的內(nèi)容。最后希望大家能有所收獲。

碼字不易,如果喜歡,請(qǐng)給作者一個(gè)小小的贊做鼓勵(lì)吧~~

參考文獻(xiàn)

1. https://mp.weixin.qq.com/s/_tfc6qBIJkWXHe40lrbSbw

2. https://mp.weixin.qq.com/s/jDSSt6MB1QeQuft0ZNeGDg

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4803

    瀏覽量

    90092
  • Docs
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    7425
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4877

    瀏覽量

    90110
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RAG(檢索增強(qiáng)生成)原理與實(shí)踐

    引言 在大語(yǔ)言模型(LLM)蓬勃發(fā)展的今天,如何讓AI更準(zhǔn)確地回答特定領(lǐng)域的問(wèn)題成為了個(gè)關(guān)鍵挑戰(zhàn)。RAG(Retrieval-Augmented Generation,檢索增強(qiáng)生成)技術(shù)應(yīng)運(yùn)而生
    發(fā)表于 02-11 12:46

    使用NVIDIA Nemotron模型構(gòu)建語(yǔ)音驅(qū)動(dòng)RAG智能體

    構(gòu)建智能體不僅僅是“調(diào)用 API”,而是需要將檢索、語(yǔ)音、安全和推理組件整合在起,使其像個(gè)統(tǒng)并互相協(xié)同的系統(tǒng)樣運(yùn)行。每層都有自己的
    的頭像 發(fā)表于 01-14 09:28 ?461次閱讀
    使用NVIDIA Nemotron模型構(gòu)建語(yǔ)音驅(qū)動(dòng)<b class='flag-5'>RAG</b>智能體

    基于NVIDIA DGX Spark的RAG系統(tǒng)實(shí)戰(zhàn)

    在大量企業(yè)級(jí)場(chǎng)景中,工程師和技術(shù)人員需要快速定位關(guān)鍵信息。他們查找的往往是內(nèi)部資料,比如硬件規(guī)格說(shuō)明、項(xiàng)目文檔、技術(shù)筆記等。但現(xiàn)實(shí)情況是,這些資料通常分散在不同系統(tǒng)和位置,導(dǎo)致傳統(tǒng)的關(guān)鍵詞搜索效率低下,體驗(yàn)也并不理想。
    的頭像 發(fā)表于 12-28 16:20 ?806次閱讀
    基于NVIDIA DGX Spark的<b class='flag-5'>RAG</b>系統(tǒng)<b class='flag-5'>實(shí)戰(zhàn)</b>

    使用NVIDIA Nemotron RAG和Microsoft SQL Server 2025構(gòu)建高性能AI應(yīng)用

    搜索和調(diào)用外部 AI 模型的 SQL 原生 API。NVIDIA 與微軟共同將 SQL Server 2025 與 NVIDIA Nemotron RAG 開(kāi)放模型集合無(wú)縫連接,這使您能夠在云端或本地環(huán)境中基于自己的數(shù)據(jù)構(gòu)建高性能、安全的 AI 應(yīng)用。
    的頭像 發(fā)表于 12-01 09:31 ?823次閱讀
    使用NVIDIA Nemotron <b class='flag-5'>RAG</b>和Microsoft SQL Server 2025構(gòu)建高性能AI應(yīng)用

    亞馬遜云科技上線Amazon Nova多模態(tài)嵌入模型

    Embeddings多模態(tài)嵌入模型現(xiàn)已在Amazon Bedrock上線,這是款專為Agentic RAG與語(yǔ)義搜索應(yīng)用打造的頂尖多模態(tài)嵌入模型。該模型是首個(gè)通過(guò)單模型支持文本、文檔、圖像、視頻與音頻
    的頭像 發(fā)表于 10-29 17:15 ?278次閱讀
    亞馬遜云科技上線Amazon Nova多模態(tài)嵌入模型

    RAG實(shí)踐:掌握大模型RAG過(guò)程

    RAG(Retrieval-Augmented Generation,檢索增強(qiáng)生成), 種AI框架,將傳統(tǒng)的信息檢索系統(tǒng)(例如數(shù)據(jù)庫(kù))的優(yōu)勢(shì)與生成式大語(yǔ)言模型(LLM)的功能結(jié)合在起。不再
    的頭像 發(fā)表于 10-27 18:23 ?1575次閱讀
    <b class='flag-5'>RAG</b>實(shí)踐:<b class='flag-5'>一</b><b class='flag-5'>文</b>掌握大模型<b class='flag-5'>RAG</b>過(guò)程

    讀懂:CWDM和DWDM的核心差異

    光纖通信里的“兩兄弟”CWDM和DWDM,名字只差個(gè)字母,差別可大了去!今天講透核心差異,小易幫你快速分清~
    的頭像 發(fā)表于 09-17 18:19 ?1244次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>:CWDM和DWDM的核心差異

    什么是服務(wù)器虛擬化?讀懂原理、優(yōu)勢(shì)與實(shí)戰(zhàn)部署

    什么是服務(wù)器虛擬化?當(dāng)企業(yè)服務(wù)器CPU利用率長(zhǎng)期低于15%,卻仍需不斷采購(gòu)新硬件應(yīng)對(duì)業(yè)務(wù)增長(zhǎng)時(shí),場(chǎng)基礎(chǔ)設(shè)施領(lǐng)域的革命早已悄然發(fā)生——服務(wù)器虛擬化。這項(xiàng)技術(shù)通過(guò)將物理服務(wù)器劃分為多個(gè)獨(dú)立、安全的虛擬環(huán)境,實(shí)現(xiàn)了資源利用率的質(zhì)的飛躍。本文將深入解析服務(wù)器虛擬化的核心原理、技術(shù)優(yōu)勢(shì)與
    的頭像 發(fā)表于 08-25 10:52 ?1229次閱讀
    什么是服務(wù)器虛擬化?<b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>讀懂</b>原理、優(yōu)勢(shì)與<b class='flag-5'>實(shí)戰(zhàn)</b>部署

    使用 llm-agent-rag-llamaindex 筆記本時(shí)收到的 NPU 錯(cuò)誤怎么解決?

    使用 conda create -n ov-nb-demos python=3.11 創(chuàng)建運(yùn)行 llm-agent-rag-llamaindex notebook 的環(huán)境。 執(zhí)行“創(chuàng)建
    發(fā)表于 06-23 06:26

    潤(rùn)和軟件亮相鯤鵬昇騰開(kāi)發(fā)者大會(huì)2025

    發(fā)布“鯤鵬RAG解決方案”、深度解讀“基于鯤鵬RAG+openGauss智能體方案”,并展示潤(rùn)和軟件AI創(chuàng)新成果矩陣、企業(yè)級(jí)AI升級(jí)路徑。
    的頭像 發(fā)表于 06-03 16:20 ?1175次閱讀

    軟通動(dòng)力發(fā)布智慧園區(qū)RAG解決方案

    近日,鯤鵬昇騰開(kāi)發(fā)者大會(huì)2025(KADC 2025)在北京正式啟幕。軟通動(dòng)力作為鯤鵬路線堅(jiān)定的擁護(hù)者與實(shí)踐者,受邀出席大會(huì),正式發(fā)布軟通動(dòng)力智慧園區(qū)RAG(Retrieval Augmented Generation 檢索增強(qiáng)生成)解決方案。
    的頭像 發(fā)表于 05-29 10:00 ?909次閱讀
    軟通動(dòng)力發(fā)布智慧園區(qū)<b class='flag-5'>RAG</b>解決方案

    在Cherry Studio中快速使用markitdown MCP Server?

    作者:算力魔方創(chuàng)始人/英特爾創(chuàng)新大使劉力 Cherry Studio是款跨平臺(tái)的集成了AI大模型和知識(shí)庫(kù)、網(wǎng)絡(luò)搜索、MCP服務(wù)器等相關(guān)工具桌面客戶端應(yīng)用程序,方便用戶配置出自己的AI智能體助手
    的頭像 發(fā)表于 05-15 10:39 ?1522次閱讀
    在Cherry Studio中快速使用markitdown MCP Server?

    如何在基于Arm Neoverse平臺(tái)的Google Axion處理器上構(gòu)建RAG應(yīng)用

    你是否好奇如何防止人工智能 (AI) 聊天機(jī)器人給出過(guò)時(shí)或不準(zhǔn)確的答案?檢索增強(qiáng)生成 (Retrieval-Augmented Generation, RAG) 技術(shù)提供了種強(qiáng)大的解決方案,能夠顯著提升答案的準(zhǔn)確性和相關(guān)性。
    的頭像 發(fā)表于 04-28 14:34 ?1098次閱讀
    如何在基于Arm Neoverse平臺(tái)的Google Axion處理器上構(gòu)建<b class='flag-5'>RAG</b>應(yīng)用

    DevEco Studio AI輔助開(kāi)發(fā)工具兩大升級(jí)功能 鴻蒙應(yīng)用開(kāi)發(fā)效率再提升

    開(kāi)發(fā)者的喜愛(ài)。 應(yīng)廣大開(kāi)發(fā)者的需求建議,我們最近又對(duì)CodeGenie進(jìn)行了次升級(jí),不僅針對(duì)DeepSeek-R1新增支持鴻蒙知識(shí)RAG能力,還上線了代碼解釋功能,持續(xù)拓展AI在輔助鴻蒙應(yīng)用開(kāi)發(fā)全流程
    發(fā)表于 04-18 14:43

    DeepSeek-R1:7B 在配備 Hailo-8L 和 M2-HAT+ 的樹(shù)莓派5上的部署實(shí)踐測(cè)試!

    我近期深度投入于LLM/SLM(大語(yǔ)言模型/小型語(yǔ)言模型)的研發(fā),涵蓋智能體開(kāi)發(fā)、RAG增強(qiáng)檢索、微調(diào)、模型蒸餾和MLOps等領(lǐng)域。為拓展技術(shù)邊界,我同步探索了邊緣AI領(lǐng)域,重點(diǎn)聚焦
    的頭像 發(fā)表于 03-25 09:20 ?3383次閱讀
    DeepSeek-R1:7B 在配備 Hailo-8L 和 M2-HAT+ 的樹(shù)莓派5上的部署實(shí)踐測(cè)試!