最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java程序員必看的RAG入門實(shí)戰(zhàn)教程

 更新時(shí)間:2026年04月15日 08:47:26   作者:蘇三說技術(shù)  
本文詳細(xì)介紹了RAG(檢索增強(qiáng)生成)技術(shù),旨在解決大模型在回答企業(yè)內(nèi)部具體問題時(shí)的幻覺和靜態(tài)知識問題,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

前言

這兩年,隨著大模型的爆發(fā),很多小伙伴都有這樣的困惑:OpenAI GPT-4、Claude 3.5這些模型確實(shí)很強(qiáng)大,但一旦問到企業(yè)內(nèi)部的具體問題,比如“我們公司去年Q3的營收是多少”,它就傻眼了。

要么回答“我不知道”,要么就開始一本正經(jīng)地胡說八道——這就是所謂的“AI幻覺”。

大語言模型的知識源于其訓(xùn)練數(shù)據(jù),模型在訓(xùn)練時(shí)盡力把海量信息壓縮進(jìn)有限參數(shù)中,但無法像數(shù)據(jù)庫那樣精確記錄每一個(gè)事實(shí),尤其是那些訓(xùn)練語料中極少提及的細(xì)節(jié)。

更致命的是,訓(xùn)練數(shù)據(jù)是有明確截止時(shí)間的,無法獲取之后的新信息。

因此,大語言模型天然存在知識靜態(tài)、容易產(chǎn)生幻覺、缺乏專業(yè)深度三大缺陷。

RAG(檢索增強(qiáng)生成)就是專門解決這個(gè)問題的技術(shù)

RAG通過檢索外部知識庫來增強(qiáng)模型能力,當(dāng)用戶查詢最新信息時(shí),RAG先檢索外部數(shù)據(jù)庫中的實(shí)時(shí)內(nèi)容,再讓LLM基于檢索結(jié)果生成答案,從而將LLM從靜態(tài)記憶者轉(zhuǎn)變?yōu)閯討B(tài)整合者。

今天,我就從零開始,用Java開發(fā)者的視角,帶大家系統(tǒng)了解RAG到底是什么、怎么工作、如何落地。

更多項(xiàng)目實(shí)戰(zhàn)在Java突擊隊(duì)網(wǎng):susan.net.cn

一、什么是RAG?

1.1 核心公式

RAG(Retrieval-Augmented Generation,檢索增強(qiáng)生成)的核心思想其實(shí)很簡單:在讓LLM回答問題之前,先從你的私有知識庫中找到相關(guān)的信息,然后把問題和信息一起交給LLM來回答。

RAG = 檢索(Retrieval) + 增強(qiáng)(Augmented) + 生成(Generation)

從學(xué)術(shù)角度看,RAG通過將生成過程與可驗(yàn)證的最新證據(jù)緊密耦合,直接解決了大模型的幻覺問題。

RAG不僅能讓LLM回答訓(xùn)練數(shù)據(jù)中不存在的新問題,還能為生成的答案提供來源引用,大幅提升了可信度和可審計(jì)性。

用大白話來說:LLM本身就是一本百科全書,但它不知道你的公司內(nèi)部資料。RAG就是在每次提問時(shí),先去翻你的資料庫,把相關(guān)內(nèi)容找出來,然后連同問題一起交給LLM,讓它基于這些資料來回答。

1.2 為什么需要RAG?

有些小伙伴可能會問:為什么不能把企業(yè)知識庫全部喂給LLM訓(xùn)練呢?

這里有三個(gè)現(xiàn)實(shí)問題:

  • 知識更新不及時(shí):LLM的訓(xùn)練數(shù)據(jù)有明確的截止時(shí)間。重新訓(xùn)練模型以更新知識成本高昂(數(shù)百萬至數(shù)億美元),且可能引發(fā)災(zāi)難性遺忘問題。
  • 無法訪問私有數(shù)據(jù):你的公司內(nèi)部文檔、客戶郵件、合同信息,這些數(shù)據(jù)不會出現(xiàn)在LLM的訓(xùn)練數(shù)據(jù)中。RAG通過構(gòu)建定制化知識基座解決這一問題:將企業(yè)內(nèi)部文檔導(dǎo)入向量數(shù)據(jù)庫,使通用LLM瞬間升級為領(lǐng)域?qū)<摇?/li>
  • 成本極高:重新訓(xùn)練或微調(diào)一個(gè)LLM需要數(shù)萬甚至數(shù)百萬美元,不是普通企業(yè)負(fù)擔(dān)得起的。RAG無需重新訓(xùn)練,成本僅為微調(diào)的1/10到1/100。

RAG完美解決了這三個(gè)問題:它不改變LLM本身,只是讓LLM“帶著資料回答問題”。

企業(yè)級RAG正在快速普及。

據(jù)2026年4月百度開發(fā)者社區(qū)的分析,RAG通過整合外部知識庫,彌補(bǔ)了大語言模型在實(shí)時(shí)性、準(zhǔn)確性和專業(yè)性上的不足,廣泛應(yīng)用于企業(yè)場景。

RAG還通過引入事實(shí)邊界約束,要求LLM的答案嚴(yán)格基于檢索到的權(quán)威文檔并附帶來源鏈接,這在金融、醫(yī)療等合規(guī)敏感行業(yè)中至關(guān)重要。

二、RAG的核心架構(gòu)

RAG的架構(gòu)可以清晰地分為兩大流程:離線索引在線檢索生成。

2.1 四大核心步驟

一篇2026年發(fā)表的全面綜述論文將現(xiàn)代RAG架構(gòu)解構(gòu)為索引(Indexing)、檢索(Retrieval)、融合(Fusion)和生成(Generation) 四個(gè)階段,并梳理了從基礎(chǔ)向量RAG到Graph RAG、Agentic RAG、多模態(tài)RAG等多種新興范式。

離線索引階段(只做一次,或者在文檔更新時(shí)重新做):

  • 文檔切分(Chunking):把一篇長文檔切成若干個(gè)小塊(Chunk)。為什么要切?因?yàn)長LM的上下文窗口有限,一次也塞不下太多內(nèi)容。
  • 向量化(Embedding):使用嵌入模型將文本塊轉(zhuǎn)換為向量(數(shù)字?jǐn)?shù)組),實(shí)現(xiàn)語義相似性計(jì)算。
  • 存儲:將向量和對應(yīng)的原始文本一起存入向量數(shù)據(jù)庫,供后續(xù)檢索使用。

在線檢索生成階段(每次用戶提問時(shí)執(zhí)行):

  1. 檢索增強(qiáng)生成:將用戶問題轉(zhuǎn)化為向量,在向量數(shù)據(jù)庫中執(zhí)行相似度檢索,獲取最相關(guān)的文檔片段,然后與問題一起提交給LLM生成答案。

三、RAG的關(guān)鍵技術(shù)組件

3.1 向量數(shù)據(jù)庫:RAG的“記憶庫”

向量數(shù)據(jù)庫是RAG的核心基礎(chǔ)設(shè)施。它專門用于存儲和檢索高維向量數(shù)據(jù),支持海量數(shù)據(jù)下的毫秒級相似度檢索。

2026年,業(yè)內(nèi)已經(jīng)形成了清晰的向量數(shù)據(jù)庫選型框架,通常依據(jù)檢索質(zhì)量、過濾能力、混合搜索支持、索引選項(xiàng)、運(yùn)維就緒度、生態(tài)集成、安全性和成本模型等維度進(jìn)行評估。

向量數(shù)據(jù)庫核心特點(diǎn)部署方式適用場景
TiDB Vector SearchSQL+向量一體化,混合搜索強(qiáng)托管+自托管RAG+SQL混合負(fù)載
Milvus功能最豐富,開源首選托管+自托管大規(guī)模專用向量場景
pgvectorPostgreSQL擴(kuò)展,SQL原生自托管已有PG的中小項(xiàng)目
Weaviate生態(tài)友好,混合搜索成熟托管+自托管多模態(tài)+過濾重應(yīng)用
QdrantRust編寫,高性能托管+自托管對性能和延遲敏感
Chroma輕量級,開箱即用自托管/本地原型驗(yàn)證和小型項(xiàng)目
OpenSearchBM25+向量雙強(qiáng)托管+自托管關(guān)鍵詞+語義混合檢索

數(shù)據(jù)參考:對于典型的RAG工作負(fù)載(1536維嵌入,topK=10),經(jīng)過良好調(diào)優(yōu)的系統(tǒng)可實(shí)現(xiàn)90-95%的召回率,p95延遲低于100ms。

沒有單一的“最佳”向量數(shù)據(jù)庫,選擇完全取決于你的具體工作負(fù)載、過濾需求和是否需要向量與事務(wù)SQL數(shù)據(jù)共存。

3.2 Embedding模型:把文字變成“坐標(biāo)”

Embedding模型負(fù)責(zé)將文本轉(zhuǎn)換成向量。選型時(shí)需要注意:

  • 多語言支持:如果你的知識庫包含中英文,需要選擇支持多語言的模型
  • 多模態(tài)支持:2026年的RAG已經(jīng)從純文本擴(kuò)展到多模態(tài),支持文本、圖像、圖表等多種數(shù)據(jù)類型
  • 跨語言能力:中文查詢需要能夠找到英文文檔,反之亦然

據(jù)Milvus 2026年3月發(fā)布的10款主流嵌入模型基準(zhǔn)測試,Gemini Embedding 2是最佳的全能選手,開源模型Qwen3-VL-2B在跨模態(tài)任務(wù)上甚至超越了閉源API。

如果你需要壓縮向量維度以節(jié)省存儲空間,Voyage Multimodal 3.5或Jina Embeddings v4是更好的選擇。

該基準(zhǔn)測試發(fā)現(xiàn),MTEB排行榜存在嚴(yán)重局限——它只測試單一語言的文本檢索,不包括跨模態(tài)檢索、跨語言搜索和長文檔精確度。

生產(chǎn)型RAG需要的是CCKM(跨模態(tài)、跨語言、關(guān)鍵信息、MRL壓縮)四維能力,而傳統(tǒng)基準(zhǔn)恰恰遺漏了這些。

3.3 重排序(Rerank):提升精準(zhǔn)度

向量檢索返回的Top-K結(jié)果中,排在前面的不一定是最相關(guān)的。引入重排序模型可以對候選結(jié)果進(jìn)行二次打分,顯著提升檢索精度。

3.4 混合檢索:BM25 + 向量

結(jié)合關(guān)鍵詞匹配(BM25)和向量相似度,可以提升召回率?;旌蠙z索可以將搜索準(zhǔn)確率提升高達(dá)45%。

結(jié)合多種檢索器(BM25捕捉詞法匹配、密集檢索捕捉語義相似性)能提供互補(bǔ)的信號,顯著增強(qiáng)RAG系統(tǒng)的有效性。

四、RAG的評估體系

RAG系統(tǒng)的評估是一個(gè)多維度的挑戰(zhàn)。

Ragas(Retrieval Augmented Generation Assessment) 是目前最流行的開源評估框架,它引入了一套無需依賴人工標(biāo)注的自動化評估指標(biāo),能夠分別衡量檢索和生成兩個(gè)組件的質(zhì)量。

4.1 三大核心評估指標(biāo)

Ragas框架通過量化指標(biāo)評估RAG系統(tǒng)的三大核心能力:

評估維度衡量內(nèi)容計(jì)算公式/方法
忠實(shí)度(Faithfulness)生成的答案是否基于檢索到的文檔,有無幻覺LLM逐句判斷與檢索內(nèi)容的邏輯一致性
答案相關(guān)性(Answer Relevancy)生成的答案是否直接回應(yīng)用戶問題計(jì)算答案中問題相關(guān)句子的占比
上下文相關(guān)性(Context Relevancy)檢索到的文檔是否與問題相關(guān)篩選文檔中與問題相關(guān)的句子比例

4.2 總體得分計(jì)算

在Ragas框架中,各個(gè)指標(biāo)會被組合起來計(jì)算出一個(gè)RAGAS總體得分,從而全面量化RAG系統(tǒng)的性能。

計(jì)算過程包括:選擇相關(guān)指標(biāo)并計(jì)算它們,將它們標(biāo)準(zhǔn)化為0-1范圍,然后計(jì)算這些指標(biāo)的加權(quán)平均值。

權(quán)重的分配取決于每個(gè)用例的優(yōu)先級。

高級評估擴(kuò)展:Ragas已被擴(kuò)展到基于知識圖譜的評估范式,支持多跳推理和語義社區(qū)聚類,以得出更全面的評分指標(biāo)。

4.3 指標(biāo)驅(qū)動開發(fā)(MDD)

Ragas框架引入了指標(biāo)驅(qū)動開發(fā)(Metric-Driven Development) 的理念,用于持續(xù)改進(jìn)RAG應(yīng)用。

這意味著評估不是一次性的活動,而應(yīng)該是貫穿整個(gè)開發(fā)周期的持續(xù)流程:建立基線 → 識別短板 → 針對性優(yōu)化 → 重新評估 → 迭代循環(huán)。

五、RAG優(yōu)化技術(shù)

在RAG的實(shí)際落地過程中,檢索質(zhì)量是影響最終效果最關(guān)鍵的因素。

以下是最有效的優(yōu)化技術(shù),每項(xiàng)技術(shù)都配有完整的代碼示例。

5.1 查詢重寫(Query Rewriting)

問題場景:用戶問“蘋果股價(jià)咋樣了?”,知識庫里卻是《Apple Inc. (AAPL) 2024年Q2財(cái)報(bào)與股價(jià)分析》。用戶的口語表達(dá)與知識庫的書面術(shù)語之間存在鴻溝,導(dǎo)致檢索不準(zhǔn)確。

優(yōu)化思路:在檢索前,讓大模型充當(dāng)“翻譯官”,將用戶口語化、模糊的查詢改寫為更專業(yè)、更完整的查詢語句。

Spring AI Alibaba實(shí)現(xiàn)示例

import org.springframework.ai.rag.preretrieval.query.transformation.RewriteQueryTransformer;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QueryRewriteConfig {
    @Bean
    public QueryTransformer queryTransformer(ChatClient.Builder builder) {
        String promptTemplate = """
            你是一個(gè)專業(yè)的查詢改寫助手。請將用戶的原始問題改寫為更清晰、更完整的獨(dú)立查詢。
            改寫原則:
            1. 將口語表達(dá)轉(zhuǎn)為書面表達(dá)
            2. 補(bǔ)全缺失的上下文信息(如代詞指代)
            3. 使用知識庫中常用的專業(yè)術(shù)語
            4. 保持查詢的原始意圖不變
            原始問題:{original_query}
            改寫后的查詢:
            """;
        return RewriteQueryTransformer.builder()
            .chatClientBuilder(builder)
            .promptTemplate(promptTemplate)
            .targetSearchSystem("vector_store")
            .build();
    }
}

使用示例

  • 原始查詢:“蘋果股價(jià)咋樣了?” → 改寫后:“查詢Apple Inc.公司的最新股票價(jià)格”
  • 原始查詢:“它怎么樣?”(多輪對話中)→ 改寫后:“查詢上一輪提到的產(chǎn)品的詳細(xì)功能”

效果:在電商客服場景中,實(shí)施查詢重寫后,多輪對話準(zhǔn)確率提升超過30%,召回率從72%提升至89%。

5.2 混合檢索(Hybrid Search)

問題場景:用戶查詢“ModelArts平臺”,向量檢索可能召回“機(jī)器學(xué)習(xí)”、“AI開發(fā)”等語義相近但不夠精準(zhǔn)的內(nèi)容,而忽略了包含“ModelArts”關(guān)鍵詞的文檔。單一檢索方式各有短板。

優(yōu)化思路:同時(shí)使用BM25關(guān)鍵詞檢索(精確匹配)和向量語義檢索(語義相似),將兩種結(jié)果融合后返回,取長補(bǔ)短。

Spring AI Alibaba實(shí)現(xiàn)示例

import org.springframework.ai.rag.retrieval.search.HybridDocumentRetriever;
import org.springframework.ai.rag.retrieval.join.JoinDocumentJoiner;
import org.springframework.ai.rag.retrieval.search.VectorStoreDocumentRetriever;
import org.springframework.ai.rag.retrieval.search.KeywordDocumentRetriever;
@Configuration
public class HybridSearchConfig {
    @Bean
    public DocumentRetriever hybridRetriever(VectorStore vectorStore) {
        // 向量檢索器
        VectorStoreDocumentRetriever vectorRetriever = VectorStoreDocumentRetriever.builder()
            .vectorStore(vectorStore)
            .similarityThreshold(0.7)
            .topK(10)
            .build();
        // 關(guān)鍵詞檢索器(需要先對文檔建立BM25索引)
        KeywordDocumentRetriever keywordRetriever = KeywordDocumentRetriever.builder()
            .indexName("knowledge_base")
            .topK(10)
            .build();
        // 混合檢索:使用 Reciprocal Rank Fusion 融合結(jié)果
        return HybridDocumentRetriever.builder()
            .retrievers(List.of(vectorRetriever, keywordRetriever))
            .joiner(JoinDocumentJoiner.reciprocalRankFusion())
            .build();
    }
}

效果:混合檢索可以將搜索準(zhǔn)確率提升高達(dá)45%。在華為云社區(qū)實(shí)測中,結(jié)合查詢重寫+混合檢索后,RAG系統(tǒng)的整體準(zhǔn)確率從68%提升到91%。

5.3 結(jié)果重排序(Reranking)

問題場景:向量檢索返回的10個(gè)結(jié)果中,第1個(gè)和第5個(gè)哪個(gè)更相關(guān)?相似度分?jǐn)?shù)不一定準(zhǔn)確。直接取Top-K可能漏掉真正相關(guān)的文檔,或者把不相關(guān)的排在了前面。

優(yōu)化思路:引入專門的重排序模型(如Cohere Rerank、BGE Reranker),對初步檢索到的候選結(jié)果進(jìn)行二次打分,按新分?jǐn)?shù)重新排序。

Spring AI Alibaba實(shí)現(xiàn)示例

import org.springframework.ai.rag.postretrieval.reranking.DiversityReranker;
import org.springframework.ai.rag.postretrieval.reranking.CompressionReranker;
import org.springframework.ai.rag.retrieval.search.DocumentRetriever;
import org.springframework.ai.rag.retrieval.search.VectorStoreDocumentRetriever;
@Configuration
public class RerankingConfig {
    @Bean
    public DocumentRetriever rerankedRetriever(VectorStore vectorStore, 
                                               ChatClient chatClient) {
        // 基礎(chǔ)向量檢索器,召回20個(gè)候選
        VectorStoreDocumentRetriever baseRetriever = VectorStoreDocumentRetriever.builder()
            .vectorStore(vectorStore)
            .topK(20)  // 多召回一些候選
            .build();
        // 重排序器1:多樣性重排(避免返回的內(nèi)容過于相似)
        DiversityReranker diversityReranker = DiversityReranker.builder()
            .minDegree(0.5)  // 最小多樣性閾值
            .build();
        // 重排序器2:壓縮重排(用LLM提取最相關(guān)片段,可減少上下文長度)
        CompressionReranker compressionReranker = CompressionReranker.builder()
            .chatClient(chatClient)
            .maxOutputTokens(500)
            .build();
        // 組合使用:先多樣性重排,再壓縮重排
        return baseRetriever.andThen(diversityReranker).andThen(compressionReranker);
    }
}

效果:在金融研報(bào)問答場景中,添加重排序后,答案的準(zhǔn)確率從82%提升到94%,同時(shí)上下文長度壓縮了60%,節(jié)省了Token成本。

5.4 多向量檢索

問題場景:用戶查詢“華為云ModelArts平臺與阿里云PAI平臺的區(qū)別”,這是一個(gè)多跳推理問題,需要同時(shí)檢索兩個(gè)產(chǎn)品的信息并進(jìn)行對比。單一的向量檢索無法同時(shí)表達(dá)兩個(gè)獨(dú)立的語義實(shí)體。

優(yōu)化思路:將查詢分解為多個(gè)子查詢,分別檢索后再融合結(jié)果。或者使用多路檢索器,分別從不同維度(文本語義、關(guān)鍵詞、元數(shù)據(jù))并行檢索,然后合并。

Spring AI Alibaba實(shí)現(xiàn)示例

import org.springframework.ai.rag.preretrieval.query.expansion.MultiQueryExpander;
@Configuration
public class MultiVectorConfig {
    @Bean
    public QueryExpander multiQueryExpander(ChatClient.Builder builder) {
        String expansionPrompt = """
            請將以下用戶問題擴(kuò)展為2-4個(gè)不同的子查詢,每個(gè)子查詢從不同角度表述,以覆蓋更全面的信息。
            子查詢之間用換行分隔。
            用戶問題:{original_query}
            擴(kuò)展的子查詢:
            """;
        return MultiQueryExpander.builder()
            .chatClientBuilder(builder)
            .promptTemplate(expansionPrompt)
            .numberOfQueries(3)  // 生成3個(gè)子查詢
            .build();
    }
}

結(jié)合使用示例

@Service
public class AdvancedRagService {
    @Autowired
    private QueryExpander queryExpander;      // 查詢擴(kuò)展
    @Autowired
    private DocumentRetriever hybridRetriever; // 混合檢索器
    @Autowired
    private Reranker reranker;                 // 重排序器
    public String ask(String question) {
        // 1. 查詢重寫
        String rewritten = rewriteQuery(question);
        // 2. 多向量擴(kuò)展(生成多個(gè)子查詢)
        List<String> subQueries = queryExpander.expand(rewritten);
        // 3. 對每個(gè)子查詢進(jìn)行混合檢索
        List<Document> allDocs = new ArrayList<>();
        for (String sq : subQueries) {
            allDocs.addAll(hybridRetriever.retrieve(sq));
        }
        // 4. 去重 + 重排序
        List<Document> uniqueDocs = deduplicate(allDocs);
        List<Document> reranked = reranker.rerank(uniqueDocs, question);
        // 5. 組裝Prompt并生成答案
        return generateAnswer(question, reranked);
    }
}

效果:在多跳問答和產(chǎn)品對比類場景中,多向量檢索可將召回率提升20-30%,尤其擅長處理“A與B的區(qū)別”、“為什么A比B好”這類復(fù)雜問題。

六、RAG實(shí)戰(zhàn)

對于Java開發(fā)者,目前最成熟的選擇是Spring AI Alibaba框架,它提供了模塊化的RAG架構(gòu)。

6.1 Spring AI Alibaba的RAG優(yōu)勢

Spring AI Alibaba作為阿里巴巴開源的AI開發(fā)框架,具有三大核心優(yōu)勢:

  1. 與阿里云生態(tài)深度集成:支持無縫調(diào)用通義千問等大模型,降低技術(shù)門檻
  2. 模塊化設(shè)計(jì):提供預(yù)處理、檢索、生成、后處理等標(biāo)準(zhǔn)化組件,加速開發(fā)
  3. 企業(yè)級支持:內(nèi)置高并發(fā)處理、模型熱更新、監(jiān)控告警等功能,適合生產(chǎn)環(huán)境

其核心思路是實(shí)現(xiàn)“檢索-過濾-生成”的三段式流程:首先從知識庫中檢索相關(guān)文檔片段,再通過語義過濾排除無關(guān)內(nèi)容,最后由生成模型合成自然語言回答。

6.2 核心組件詳解

Spring AI Alibaba的模塊化RAG架構(gòu)包含以下核心組件:

組件功能可選實(shí)現(xiàn)
DocumentReader加載各類文檔格式PDFMiner、Apache Tika、JSON、Markdown
DocumentTransformer文檔預(yù)處理和清洗去除特殊字符、元數(shù)據(jù)提取
DocumentSplitter智能分塊策略遞歸分塊、語義邊界分塊、重疊分塊
EmbeddingModel文本向量化DashScope、OpenAI、Ollama
VectorStore向量存儲與檢索Milvus、pgvector、Redis、Chroma
ChatClientLLM調(diào)用與Prompt管理通義千問、OpenAI、Azure

6.3 完整代碼實(shí)現(xiàn)

第一步:添加依賴

<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter</artifactId>
    <version>1.0.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
    <version>1.0.0</version>
</dependency>

第二步:配置向量數(shù)據(jù)庫和Embedding模型

@Configuration
public class RagConfig {
    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder
            .defaultSystem("你是一個(gè)專業(yè)的智能問答助手,請基于提供的參考資料回答問題。")
            .build();
    }
    @Bean
    public VectorStore vectorStore(EmbeddingModel embeddingModel) {
        // 示例:使用內(nèi)存存儲(適合原型驗(yàn)證)
        SimpleVectorStore simpleVectorStore = SimpleVectorStore.builder(embeddingModel).build();
        return simpleVectorStore;
        // 生產(chǎn)環(huán)境可替換為 MilvusVectorStore、PgVectorStore 等
    }
    @Bean
    public EmbeddingModel embeddingModel() {
        return new DashScopeEmbeddingModel(
            DashScopeEmbeddingOptions.builder()
                .withModel("text-embedding-v3")
                .build()
        );
    }
}

第三步:構(gòu)建知識庫索引

@Service
public class KnowledgeBaseService {
    @Autowired
    private VectorStore vectorStore;
    @Autowired
    private EmbeddingModel embeddingModel;
    public void indexDocument(String content) {
        // 1. 文檔切分
        List<Document> chunks = DocumentSplitter.recursive(500, 100).split(content);
        // 2. 向量化并存儲
        vectorStore.add(chunks);
        System.out.println("已索引 " + chunks.size() + " 個(gè)文檔塊");
    }
}

第四步:實(shí)現(xiàn)RAG問答接口

@RestController
@RequestMapping("/api/rag")
public class RagController {
    @Autowired
    private ChatClient chatClient;
    @Autowired
    private VectorStore vectorStore;
    @PostMapping("/ask")
    public String ask(@RequestParam String question) {
        // 使用 QuestionAnswerAdvisor 自動完成檢索增強(qiáng)
        return chatClient.prompt()
                .user(question)
                .advisors(new QuestionAnswerAdvisor(vectorStore))
                .call()
                .content();
    }
}

只需這幾步,一個(gè)完整的RAG智能問答系統(tǒng)就搭建完成了!QuestionAnswerAdvisor會自動完成問題向量化、相似度檢索和Prompt組裝的全部工作。

七、RAG的優(yōu)缺點(diǎn)

7.1 優(yōu)點(diǎn)

  • 準(zhǔn)確率高:通過檢索外部知識,大幅降低模型幻覺,提升事實(shí)準(zhǔn)確性。RAG通過引入事實(shí)邊界約束,要求LLM的答案嚴(yán)格基于檢索到的權(quán)威文檔,這在金融、醫(yī)療等合規(guī)敏感行業(yè)中至關(guān)重要。
  • 知識實(shí)時(shí)更新:只需更新向量數(shù)據(jù)庫即可,無需重新訓(xùn)練模型。通過外接動態(tài)知識庫(如公司文檔系統(tǒng)或新聞API),當(dāng)用戶查詢最新信息時(shí),RAG先檢索外部數(shù)據(jù)庫中的實(shí)時(shí)內(nèi)容,再讓LLM基于檢索結(jié)果生成答案。
  • 可解釋性強(qiáng):可以展示檢索到的來源文檔,讓用戶知道答案來源,具備可審計(jì)性。
  • 成本可控:比微調(diào)大模型便宜得多,無需數(shù)百萬美元的訓(xùn)練成本。
  • 保護(hù)數(shù)據(jù)隱私:私有數(shù)據(jù)只存儲在本地向量庫中,不會上傳到模型服務(wù)端。
  • 領(lǐng)域適配靈活:將企業(yè)內(nèi)部文檔導(dǎo)入向量數(shù)據(jù)庫,使通用LLM瞬間升級為領(lǐng)域?qū)<摇?/li>

7.2 缺點(diǎn)

  • 檢索質(zhì)量決定一切:如果檢索不到相關(guān)內(nèi)容,LLM也無能為力。
  • 上下文窗口限制:無法一次性塞入海量資料,需要合理切分。
  • 增加系統(tǒng)復(fù)雜度:需要維護(hù)向量數(shù)據(jù)庫、Embedding模型、LLM等多個(gè)組件。
  • 延遲略高:相比直接調(diào)用LLM,RAG多了檢索步驟,會增加幾十到幾百毫秒的延遲。
  • 評估困難:RAG系統(tǒng)需要從檢索準(zhǔn)確性和生成質(zhì)量多個(gè)維度進(jìn)行綜合評估。
  • 知識沖突處理:檢索到的信息可能與LLM的參數(shù)化記憶發(fā)生沖突,需要設(shè)計(jì)有效的融合策略。

八、RAG的使用場景

8.1 最適合RAG的場景

  • 企業(yè)內(nèi)部知識庫問答:把公司的文檔、規(guī)范、培訓(xùn)材料建成RAG,員工可以隨時(shí)提問
  • 智能客服系統(tǒng):將產(chǎn)品文檔、FAQ接入RAG,讓AI客服能夠準(zhǔn)確回答產(chǎn)品問題
  • 法律/合同審查:讓AI基于合同文本回答問題,幫助律師快速定位條款
  • 金融研報(bào)分析:分析師可以直接提問“這份研報(bào)中對XX公司的評級是什么”,AI基于報(bào)告內(nèi)容回答
  • 合規(guī)敏感行業(yè):RAG通過強(qiáng)制LLM基于權(quán)威文檔回答并附來源,在金融、醫(yī)療等合規(guī)敏感行業(yè)中至關(guān)重要

8.2 不適合RAG的場景

  • 簡單的閑聊:不需要外部知識的對話,直接用LLM就夠了
  • 需要深度推理的任務(wù):RAG擅長“查資料”,不擅長“推導(dǎo)結(jié)論”
  • 對延遲極度敏感的場景:檢索會增加額外耗時(shí)

總結(jié)

RAG(檢索增強(qiáng)生成)是目前企業(yè)落地AI應(yīng)用最務(wù)實(shí)的技術(shù)方案。

它的核心價(jià)值可以概括為:讓LLM帶著資料回答問題,把AI幻覺降到最低。

核心要點(diǎn)說明
核心公式RAG = 檢索(Retrieval) + 增強(qiáng)(Augmented) + 生成(Generation)
四大流程索引 → 檢索 → 融合 → 生成
關(guān)鍵技術(shù)向量數(shù)據(jù)庫 + Embedding模型 + 重排序 + LLM
評估指標(biāo)忠實(shí)度 + 答案相關(guān)性 + 上下文相關(guān)性
優(yōu)化方向查詢重寫 + 混合檢索 + 重排序 + 多向量檢索
最佳實(shí)踐從簡單起步,建立持續(xù)評估體系,逐步迭代優(yōu)化

在Java生態(tài)中,Spring AI Alibaba提供了開箱即用的模塊化RAG支持。通過遵循最佳實(shí)踐,可以構(gòu)建一個(gè)高效、可靠的RAG系統(tǒng),為用戶提供準(zhǔn)確和專業(yè)的回答。

如果你正面臨“AI答非所問”的困擾,不妨從RAG開始——這是目前成本最低、見效最快的解決方案。

未來已來,用好RAG,讓AI真正成為你的得力助手。

到此這篇關(guān)于Java程序員必看的RAG入門實(shí)戰(zhàn)教程的文章就介紹到這了,更多相關(guān)Java RAG入門教程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 原生java代碼實(shí)現(xiàn)碼云第三方驗(yàn)證登錄的示例代碼

    原生java代碼實(shí)現(xiàn)碼云第三方驗(yàn)證登錄的示例代碼

    這篇文章主要介紹了原生java代碼實(shí)現(xiàn)碼云第三方驗(yàn)證登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java通過python命令執(zhí)行DataX任務(wù)的實(shí)例

    Java通過python命令執(zhí)行DataX任務(wù)的實(shí)例

    今天小編就為大家分享一篇Java通過python命令執(zhí)行DataX任務(wù)的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Spring IoC實(shí)現(xiàn)條件化裝配Bean的方法詳解

    Spring IoC實(shí)現(xiàn)條件化裝配Bean的方法詳解

    條件化裝配 Bean(Conditional Bean Assembly) 指的是:讓 Spring 容器根據(jù)特定的條件來決定是否要創(chuàng)建和注冊某一個(gè) Bean,本文給大家介紹了Spring IoC實(shí)現(xiàn)條件化裝配Bean的詳細(xì)步驟,需要的朋友可以參考下
    2025-07-07
  • MyBatisPlus 自定義sql語句的實(shí)現(xiàn)

    MyBatisPlus 自定義sql語句的實(shí)現(xiàn)

    這篇文章主要介紹了MyBatisPlus 自定義sql語句的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Struts2 自定義下拉框Tag標(biāo)簽

    Struts2 自定義下拉框Tag標(biāo)簽

    這篇文章主要介紹了Struts2 自定義下拉框Tag標(biāo)簽的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Java數(shù)組和可變參數(shù)使用舉例詳解

    Java數(shù)組和可變參數(shù)使用舉例詳解

    Java中的可變參數(shù)和數(shù)組參數(shù)在使用上很相似,但它們在方法定義、調(diào)用方式以及編譯處理上有明顯區(qū)別,理解這些差異有助于寫出更清晰、安全的代碼,這篇文章主要介紹了Java數(shù)組和可變參數(shù)的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • Spring Boot 項(xiàng)目發(fā)布到 Tomcat 服務(wù)器的操作步驟

    Spring Boot 項(xiàng)目發(fā)布到 Tomcat 服務(wù)器的操作步驟

    這篇文章主要介紹了Spring Boot 項(xiàng)目發(fā)布到 Tomcat 服務(wù)器的操作步驟,需要的朋友可以參考下
    2017-04-04
  • Java實(shí)現(xiàn)LRU緩存的實(shí)例詳解

    Java實(shí)現(xiàn)LRU緩存的實(shí)例詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)LRU緩存的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • XXL-Job定時(shí)任務(wù)時(shí)間偏差8小時(shí)的問題解決辦法

    XXL-Job定時(shí)任務(wù)時(shí)間偏差8小時(shí)的問題解決辦法

    定時(shí)任務(wù)指通過時(shí)間表達(dá)式調(diào)度執(zhí)行的任務(wù),適用于對賬、提醒、訂單超時(shí)等場景,下面這篇文章主要介紹了XXL-Job定時(shí)任務(wù)時(shí)間偏差8小時(shí)的問題解決辦法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-03-03
  • SpringBoot?項(xiàng)目部署與監(jiān)控的過程

    SpringBoot?項(xiàng)目部署與監(jiān)控的過程

    SpringBoot項(xiàng)目部署在互聯(lián)網(wǎng)背景下前后端分離開發(fā)已經(jīng)成為主流趨勢,SpringBoot構(gòu)建web項(xiàng)目非常快速,只需要將其打成一個(gè)jar包,然后通過java-jar命令啟動,本文介紹SpringBoot?項(xiàng)目部署與監(jiān)控的過程,感興趣的朋友跟隨小編一起看看吧
    2025-12-12

最新評論

金溪县| 迁安市| 南江县| 金山区| 紫金县| 南川市| 北京市| 石首市| 会同县| 湘乡市| 柳州市| 荔浦县| 栖霞市| 邹平县| 曲麻莱县| 天峻县| 博白县| 云梦县| 周宁县| 丰镇市| 达尔| 凤庆县| 宁乡县| 海安县| 榆林市| 辰溪县| 太原市| 定结县| 诸城市| 波密县| 仪征市| 石台县| 商南县| 巴彦县| 桂林市| 金秀| 微山县| 康马县| 古交市| 芦溪县| 渝北区|