LangChain4j-RAG高级-检索增强器

Retrieval Augmentor 检索增强器

RetrievalAugmentor 是 RAG 管道的入口点。它负责使用从各种来源检索的相关 Content 来扩充 ChatMessage

可以在创建 AiService 期间指定 RetrievalAugmentor 的实例:

Assistant assistant = AiServices.builder(Assistant.class)
    ...
    .retrievalAugmentor(retrievalAugmentor)
    .build();

每次调用 AiService 时,都会调用指定的 RetrievalAugmentor 来扩充当前的 UserMessage

可以使用LangChain4j中提供的 RetrievalAugmentor 的默认实现(DefaultRetrievalAugmentor) 或 实现自定义实现。

Default Retrieval Augmentor 默认检索增强器

LangChain4j 提供了RetrievalAugmentor接口的现成实现: DefaultRetrievalAugmentor ,它应该适合大多数 RAG 用例。

官方使用示例:

public class _04_Advanced_RAG_with_Metadata_Example {

    /**
     * Please refer to {@link Naive_RAG_Example} for a basic context.
     * <p>
     * Advanced RAG in LangChain4j is described here: https://github.com/langchain4j/langchain4j/pull/538
     * <p>
     * This example illustrates how to include document source and other metadata into the LLM prompt.
     */

    public static void main(String[] args) {

        Assistant assistant = createAssistant("documents/miles-of-smiles-terms-of-use.txt");

        // Ask "What is the name of the file where cancellation policy is defined?".
        // Observe how "file_name" metadata entry was injected into the prompt.
        startConversationWith(assistant);
    }

    private static Assistant createAssistant(String documentPath) {

        Document document = loadDocument(toPath(documentPath), new TextDocumentParser());

        EmbeddingModel embeddingModel = new BgeSmallEnV15QuantizedEmbeddingModel();

        EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();

        EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
                .documentSplitter(DocumentSplitters.recursive(300, 0))
                .embeddingModel(embeddingModel)
                .embeddingStore(embeddingStore)
                .build();

        ingestor.ingest(document);

        ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder()
                .embeddingStore(embeddingStore)
                .embeddingModel(embeddingModel)
                .build();

        // Each retrieved segment should inc
在 `langchain4j` 中实现 **RAG(Retrieval-Augmented Generation,检索增强生成)** 功能,主要涉及以下几个关键步骤:文档加载、向量化存储、检索器配置、生成模型集成以及链式调用。以下是一个结构化的实现方案。 ### 3.1 文档加载与预处理 首先需要将外部知识源(如 PDF、文本文件、网页等)加载为结构化文档,并进行分块(chunking)处理,以便后续嵌入和检索。 ```java import dev.langchain4j.data.document.loader.FileSystemDocumentLoader; import dev.langchain4j.data.segment.text.TextSegmenter; import dev.langchain4j.data.segment.text.TokenTextSegmenter; List<Document> documents = new FileSystemDocumentLoader("path/to/documents").load(); TextSegmenter segmenter = new TokenTextSegmenter(200); // 分块大小 List<TextSegment> segments = segmenter.segmentAll(documents); ``` ### 3.2 向量化与存储 使用嵌入模型(如 OpenAI、HuggingFace 或本地模型)将文本块转换为向量,并将其存储在向量数据库中。LangChain4j 支持多种向量存储后端,例如 `InMemoryVectorStore` 或基于 FAISS 的实现。 ```java import dev.langchain4j.model.embedding.EmbeddingModel; import dev.langchain4j.store.embedding.EmbeddingStore; import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; EmbeddingModel embeddingModel = ...; // 初始化嵌入模型 EmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>(); for (TextSegment segment : segments) { Embedding embedding = embeddingModel.embed(segment.text()); embeddingStore.add(embedding, segment); } ``` ### 3.3 配置检索器(Retriever) 定义一个检索器,用于根据用户查询从向量库中检索最相关的文本段落。 ```java import dev.langchain4j.retriever.EmbeddingStoreRetriever; EmbeddingStoreRetriever<TextSegment> retriever = EmbeddingStoreRetriever.from(embeddingStore, embeddingModel, 3); ``` ### 3.4 集成生成模型(LLM) 选择一个语言模型(如 OpenAI GPT、Llama 等),用于生成最终答案。 ```java import dev.langchain4j.model.chat.ChatLanguageModel; ChatLanguageModel chatModel = ChatLanguageModel.withTokenStreamSupport(...); // 初始化 LLM ``` ### 3.5 构建 RAG 链(Chain) 将检索器与生成模型结合,构建完整的 RAG 链。LangChain4j 提供了便捷的链式 API 来组合这些组件。 ```java import dev.langchain4j.chain.retrieval.RetrievalChain; import dev.langchain4j.prompt.PromptTemplate; PromptTemplate promptTemplate = PromptTemplate.from( "Context: {context}\nQuestion: {question}\nAnswer:" ); RetrievalChain<TextSegment> ragChain = RetrievalChain.from(chatModel, retriever, promptTemplate); ``` ### 3.6 执行查询 最后,执行用户输入的查询并获取增强后的生成结果。 ```java String answer = ragChain.invoke("What is the capital of France?"); System.out.println(answer); ``` ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值