RAG技术全面解析:Langchain4j如何实现智能问答的跨越式进化?

Langchain4j框架-Java程序员的大模型框架 LangChain4j 可以理解是Java版本的LangChain,是一个旨在简化将大型语言模型(LLM)集成到 Java 应用程序中的框架。它帮我们封装了不同LLM 提供商(如 OpenAI、Google Vertex AI)的专有API方便在不同 LLM 或嵌入式存储之间切换,而无需重写代码。该项目于 2023 年初启动,旨在填补 Java 生态系统中缺乏 LLM 库和框架的空白。 阅读详情

LLM 的知识仅限于其训练数据。如希望使 LLM 了解特定领域的知识或专有数据,可:

  • 使用本节介绍的 RAG
  • 使用你的数据对 LLM 进行微调
  • 结合使用 RAG 和微调

1 啥是 RAG?

RAG 是一种在将提示词发送给 LLM 之前,从你的数据中找到并注入相关信息的方式。这样,LLM 希望能获得相关的信息并利用这些信息作出回应,从而减少幻觉概率。

可通过各种信息检索方法找到相关信息。这些方法包括但不限于:

  • 全文(关键词)搜索。该方法使用 TF-IDF 和 BM25 等技术,通过匹配查询(例如用户提问)中的关键词与文档数据库中的内容来搜索文档。它根据这些关键词在每个文档中的频率和相关性对结果进行排名
  • 向量搜索,也称“语义搜索”。文本文档通过嵌入模型转换为数值向量。然后根据查询向量与文档向量之间的余弦相似度或其他相似度/距离度量,查找并对文档进行排名,从而捕捉更深层次的语义含义
  • 混合搜索。结合多种搜索方法(例如全文搜索 + 向量搜索)通常能提高搜索效果

本文主要关注向量搜索。全文搜索和混合搜索目前仅通过 Azure AI Search 集成支持,详情参见 AzureAiSearchContentRetriever。计划在不久的将来扩展 RAG 工具箱,以包含全文搜索和混合搜索。

2 RAG 的阶段

RAG 过程分为两个不同阶段:索引和检索。LangChain4j 提供用于两个阶段的工具。

2.1 索引

文档会进行预处理,以便在检索阶段实现高效搜索。

该过程可能因使用的信息检索方法而有所不同。对向量搜索,通常包括清理文档,利用附加数据和元数据对其进行增强,将其拆分为较小的片段(即“分块”),对这些片段进行嵌入,最后将它们存储在嵌入存储库(即向量数据库)。

通常在离线完成,即用户无需等待该过程的完成。可通过例如每周末运行一次的定时任务来重新索引公司内部文档。负责索引的代码也可以是一个仅处理索引任务的单独应用程序。

但某些场景,用户可能希望上传自定义文档以供 LLM 访问。此时,索引应在线进行,并成为主应用程序的一部分。

索引阶段的简化流程图

在这里插入图片描述

2.2 检索

通常在线进行,当用户提交一个问题时,系统会使用已索引的文档来回答问题。

该过程可能会因所用的信息检索方法不同而有所变化。对于向量搜索,通常包括嵌入用户的查询(问题),并在嵌入存储库中执行相似度搜索。然后,将相关片段(原始文档的部分内容)注入提示词并发送给 LLM。

检索阶段的简化流程图

在这里插入图片描述

3 简单 RAG

LangChain4j 提供了“简单 RAG”功能,使你尽可能轻松使用 RAG。无需学习嵌入技术、选择向量存储、寻找合适的嵌入模型、了解如何解析和拆分文档等操作。只需指向你的文档,LangChain4j 就会自动处理!

若需定制化RAG,请跳到rag-apis。

当然,这种“简单 RAG”的质量会比定制化 RAG 设置的质量低一些。然而,这是学习 RAG 或制作概念验证的最简单方法。稍后,您可以轻松地从简单 RAG 过渡到更高级的 RAG,逐步调整和自定义各个方面。

3.1 导入 langchain4j-easy-rag 依赖

<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-easy-rag</artifactId>
    <version>0.34.0</version>
</dependency>

3.2 加载文档

List<Document> documents = FileSystemDocumentLoader.loadDocuments("/home/langchain4j/documentation");

这将加载指定目录下的所有文件。

底层发生了什么?

Apache Tika 库被用于检测文档类型并解析它们。由于我们没有显式指定使用哪个 DocumentParser,因此 FileSystemDocumentLoader 将加载 ApacheTikaDocumentParser,该解析器由 langchain4j-easy-rag依赖通过 SPI 提供。

咋自定义加载文档?

若想加载所有子目录中的文档,可用 loadDocumentsRecursively :

List<Document> documents = FileSystemDocumentLoader.loadDocumentsRecursively("/home/langchain4j/documentation");

还可通过使用 glob 或正则表达式过滤文档:

PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:*.pdf");
List<Document> documents = FileSystemDocumentLoader.loadDocuments("/home/langchain4j/documentation", pathMatcher);

使用 loadDocumentsRecursively 时,可能要在 glob 中使用双星号(而不是单星号):glob:**.pdf。

3.3 预处理

并将文档存储在专门的嵌入存储中也称向量数据库。这是为了在用户提出问题时快速找到相关信息片段。可用 15+ 种支持的嵌入存储,但为简化操作,使用内存存储:

InMemoryEmbeddingStore<TextSegment> embeddingStore = new InMemoryEmbeddingStore<>();
EmbeddingStoreIngestor.ingest(documents, embeddingStore);
底层发生了啥?
  • EmbeddingStoreIngestor 通过 SPI 从 langchain4j-easy-rag 依赖中加载 DocumentSplitter。每个 Document 被拆分成较小的片段(即 TextSegment),每个片段不超过 300 个 token,且有 30 个 token 的重叠部分。
  • EmbeddingStoreIngestor 通过 SPI 从 langchain4j-easy-rag 依赖中加载 EmbeddingModel。每个 TextSegment 都使用 EmbeddingModel 转换为 Embedding。

选择 bge-small-en-v1.5 作为简单 RAG 的默认嵌入模型。该模型在 MTEB 排行榜上取得了不错的成绩,其量化版本仅占用 24 MB 空间。因此,我们可以轻松将其加载到内存中,并在同一进程中通过 ONNX Runtime] 运行。

可在完全离线的情况下,在同一个 JVM 进程中将文本转换为嵌入。LangChain4j 提供 5 种流行的嵌入模型开箱即用。

  1. 所有 TextSegment 和 Embedding 对被存储在 EmbeddingStore 中
  2. 创建一个AI 服务,它将作为我们与 LLM 交互的 API:
interface Assistant {

    String chat(String userMessage);
}

ChatLanguageModel chatModel = OpenAiChatModel.builder()
    .apiKey(System.getenv("OPENAI_API_KEY"))
    .modelName(GPT_4_O_MINI)
    .build();

Assistant assistant = AiServices.builder(Assistant.class)
    .chatLanguageModel(chatModel)
    .chatMemory(MessageWindowChatMemory.withMaxMessages(10))
    .contentRetriever(EmbeddingStoreContentRetriever.from(embeddingStore))
    .build();

配置 Assistant 使用 OpenAI 的 LLM 来回答用户问题,记住对话中的最近 10 条消息,并从包含我们文档的 EmbeddingStore 中检索相关内容。

  1. 对话!
String answer = assistant.chat("如何使用 LangChain4j 实现简单 RAG?");

4 访问源信息

如希望访问增强消息的检索源,可将返回类型包装在 Result 类中:

interface Assistant {

    Result<String> chat(String userMessage);
}

Result<String> result = assistant.chat("如何使用 LangChain4j 实现简单 RAG?");

String answer = result.content();
List<Content> sources = result.sources();

流式传输时,可用 onRetrieved() 指定一个 Consumer<List<Content>>:

interface Assistant {

    TokenStream chat(String userMessage);
}

assistant.chat("如何使用 LangChain4j 实现简单 RAG?")
    .onRetrieved(sources -> ...)
    .onNext(token -> ...)
    .onError(error -> ...)
    .start();

5 RAG API

LangChain4j 提供丰富的 API 让你可轻松构建从简单到高级的自定义 RAG 流水线。本节介绍主要的领域类和 API。

5.1 文档(Document)

Document 类表示整个文档,例如单个 PDF 文件或网页。当前,Document 只能表示文本信息,但未来的更新将支持图像和表格。

package dev.langchain4j.data.document;

/**
 * 表示通常对应于单个文件内容的非结构化文本。此文本可能来自各种来源,如文本文件、PDF、DOCX 或网页 (HTML)。
 * 每个文档都可能具有关联的元数据,包括其来源、所有者、创建日期等
 */
public class Document {

    /**
     * Common metadata key for the name of the file from which the document was loaded.
     */
    public static final String FILE_NAME = "file_name";
    /**
     * Common metadata key for the absolute path of the directory from which the document was loaded.
     */
    public static final String ABSOLUTE_DIRECTORY_PATH = "absolute_directory_path";
    /**
     * Common metadata key for the URL from which the document was loaded.
     */
    public static final String URL = "url";

    private final String text;
    private final Metadata metadata;
API
  • Document.text() 返回 Document 的文本内容
  • Document.metadata() 返回 Document 的元数据(见下文)
  • Document.toTextSegment() 将 Document 转换为 TextSegment(见下文)
  • Document.from(String, Metadata) 从文本和 Metadata 创建一个 Document
  • Document.from(String) 从文本创建一个带空 Metadata 的 Document

5.2 元数据(Metadata)

每个 Document 都包含 Metadata,用于存储文档的元信息,如名称、来源、最后更新时间、所有者或任何其他相关细节。

Metadata 以KV对形式存储,其中键是 String 类型,值可为 String、Integer、Long、Float、Double 中的任意一种。

用途
  • 在将文档内容包含到 LLM 的提示词中时,可以将元数据条目一并包含,向 LLM 提供额外信息。例如,提供文档名称和来源可以帮助 LLM 更好地理解内容。
  • 在搜索相关内容以包含在提示词中时,可以根据元数据条目进行过滤。例如,您可以将语义搜索范围限制为属于特定所有者的文档。
  • 当文档的来源被更新(例如文档的特定页面),您可以通过其元数据条目(例如“id”、“source”等)轻松找到相应的文档,并在嵌入存储中更新它,以保持同步。
API
  • Metadata.from(Map) 从 Map 创建 Metadata
  • Metadata.put(String key, String value) / put(String, int) / 等方法添加元数据条目
  • Metadata.getString(String key) / getInteger(String key) / 等方法返回元数据条目的值,并转换为所需类型
  • Metadata.containsKey(String key) 检查元数据中是否包含指定键的条目
  • Metadata.remove(String key) 从元数据中删除指定键的条目
  • Metadata.copy() 返回元数据的副本
  • Metadata.toMap() 将元数据转换为 Map

5.3 文档加载器(Document Loader)

可从 String 创建一个 Document,但更简单的是使用库中包含的文档加载器之一:

  • FileSystemDocumentLoader 来自 langchain4j 模块
  • UrlDocumentLoader 来自 langchain4j 模块
  • AmazonS3DocumentLoader 来自 langchain4j-document-loader-amazon-s3 模块
  • AzureBlobStorageDocumentLoader 来自 langchain4j-document-loader-azure-storage-blob 模块
  • GitHubDocumentLoader 来自 langchain4j-document-loader-github 模块
  • TencentCosDocumentLoader 来自 langchain4j-document-loader-tencent-cos 模块

5.4 文本片段转换器

TextSegmentTransformer 类似于 DocumentTransformer(如上所述),但它用于转换 TextSegment。

与 DocumentTransformer 类似,没有统一的解决方案,建议根据您的数据自定义实现 TextSegmentTransformer。

提高检索效果的有效方法是将 Document 的标题或简短摘要包含在每个 TextSegment 。

5.5 嵌入

Embedding 类封装了一个数值向量,表示嵌入内容(通常是文本,如 TextSegment)的“语义意义”。

阅读更多关于向量嵌入的内容:

API
  • Embedding.dimension() 返回嵌入向量的维度(即长度)
  • CosineSimilarity.between(Embedding, Embedding) 计算两个 Embedding 之间的余弦相似度
  • Embedding.normalize() 对嵌入向量进行归一化(就地操作)

嵌入模型

EmbeddingModel 接口代表一种特殊类型的模型,将文本转换为 Embedding。

当前支持的嵌入模型可以在这里找到。

API
  • EmbeddingModel.embed(String) 嵌入给定的文本
  • EmbeddingModel.embed(TextSegment) 嵌入给定的 TextSegment
  • EmbeddingModel.embedAll(List<TextSegment>) 嵌入所有给定的 TextSegment
  • EmbeddingModel.dimension() 返回该模型生成的 Embedding 的维度

嵌入存储

EmbeddingStore 接口表示嵌入存储,也称为向量数据库。它用于存储和高效搜索相似的(在嵌入空间中接近的)Embedding。

当前支持的嵌入存储可以在这里找到。

EmbeddingStore 可以单独存储 Embedding,也可以与相应的 TextSegment 一起存储:

  • 它可以仅按 ID 存储 Embedding,嵌入的数据可以存储在其他地方,并通过 ID 关联。
  • 它可以同时存储 Embedding 和被嵌入的原始数据(通常是 TextSegment)。
API
  • EmbeddingStore.add(Embedding) 将给定的 Embedding 添加到存储中并返回随机 ID
  • EmbeddingStore.add(String id, Embedding) 将给定的 Embedding 以指定 ID 添加到存储中
  • EmbeddingStore.add(Embedding, TextSegment) 将给定的 Embedding 和关联的 TextSegment 添加到存储中,并返回随机 ID
  • EmbeddingStore.addAll(List<Embedding>) 将一组 Embedding 添加到存储中,并返回一组随机 ID
  • EmbeddingStore.addAll(List<Embedding>, List<TextSegment>) 将一组 Embedding 和关联的 TextSegment 添加到存储中,并返回一组随机 ID
  • EmbeddingStore.search(EmbeddingSearchRequest) 搜索最相似的 Embedding
  • EmbeddingStore.remove(String id) 按 ID 从存储中删除单个 Embedding
  • EmbeddingStore.removeAll(Collection<String> ids) 按 ID 从存储中删除多个 Embedding
  • EmbeddingStore.removeAll(Filter) 删除存储中与指定 Filter 匹配的所有 Embedding
  • EmbeddingStore.removeAll() 删除存储中的所有 Embedding
嵌入搜索请求(EmbeddingSearchRequest)

EmbeddingSearchRequest 表示在 EmbeddingStore 中的搜索请求。其属性如下:

  • Embedding queryEmbedding: 用作参考的嵌入。
  • int maxResults: 返回的最大结果数。这是一个可选参数,默认为 3。
  • double minScore: 最低分数,范围为 0 到 1(含)。仅返回得分 >= minScore 的嵌入。这是一个可选参数,默认为 0。
  • Filter filter: 搜索时应用于 Metadata 的过滤器。仅返回 Metadata 符合 Filter 的 TextSegment。
过滤器(Filter)

关于 Filter 的更多细节可以在这里找到。

嵌入搜索结果(EmbeddingSearchResult)

EmbeddingSearchResult 表示在 EmbeddingStore 中的搜索结果,包含 EmbeddingMatch 列表。

嵌入匹配(Embedding Match)

EmbeddingMatch 表示一个匹配的 Embedding,包括其相关性得分、ID 和嵌入的原始数据(通常是 TextSegment)。

嵌入存储导入器

EmbeddingStoreIngestor 表示一个导入管道,负责将 Document 导入到 EmbeddingStore。

在最简单的配置中,EmbeddingStoreIngestor 使用指定的 EmbeddingModel 嵌入提供的 Document,并将它们与其 Embedding 一起存储在指定的 EmbeddingStore 中:

EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()
        .embeddingModel(embeddingModel)
        .embeddingStore(embeddingStore)
        .build();

ingestor.ingest(document1);
ingestor.ingest(document2, document3);
ingestor.ingest(List.of(document4, document5, document6));

可选地,EmbeddingStoreIngestor 可以使用指定的 DocumentTransformer 来转换 Document。这在您希望在嵌入之前对文档进行清理、增强或格式化时非常有用。

可选地,EmbeddingStoreIngestor 可以使用指定的 DocumentSplitter 将 Document 拆分为 TextSegment。这在文档较大且您希望将其拆分为较小的 TextSegment 时非常有用,以提高相似度搜索的质量并减少发送给 LLM 的提示词的大小和成本。

可选地,EmbeddingStoreIngestor 可以使用指定的 TextSegmentTransformer 来转换 TextSegment。这在您希望在嵌入之前对 TextSegment 进行清理、增强或格式化时非常有用。

示例:

EmbeddingStoreIngestor ingestor = EmbeddingStoreIngestor.builder()

    // 为每个 Document 添加 userId 元数据条目,便于后续过滤
    .documentTransformer(document -> {
        document.metadata().put("userId", "12345");
        return document;
    })

    // 将每个 Document 拆分为 1000 个 token 的 TextSegment,具有 200 个 token 的重叠
    .documentSplitter(DocumentSplitters.recursive(1000, 200, new OpenAiTokenizer()))

    // 为每个 TextSegment 添加 Document 的名称,以提高搜索质量
    .textSegmentTransformer(textSegment -> TextSegment.from(
            textSegment.metadata("file_name") + "\n" + textSegment.text(),
            textSegment.metadata()
    ))

    .embeddingModel(embeddingModel)
    .embeddingStore(embeddingStore)
    .build();

如何系统的去学习大模型LLM ?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

事实上,抢你饭碗的不是AI,而是会利用AI的人。

继科大讯飞、阿里、华为等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?

与其焦虑……

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。

基于此,我用做产品的心态来打磨这份大模型教程,深挖痛点并持续修改了近70次后,终于把整个AI大模型的学习门槛,降到了最低!

在这个版本当中:

第一您不需要具备任何算法和数学的基础
第二不要求准备高配置的电脑
第三不必懂Python等任何编程语言

您只需要听我讲,跟着我做即可,为了让学习的道路变得更简单,这份大模型教程已经给大家整理并打包,现在将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉优快云大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

​

一、LLM大模型经典书籍

AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。

在这里插入图片描述

二、640套LLM大模型报告合集

这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
在这里插入图片描述

三、LLM大模型系列视频教程

在这里插入图片描述

四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)

在这里插入图片描述

五、AI产品经理大模型教程

在这里插入图片描述

LLM大模型学习路线 ↓

阶段1:AI大模型时代的基础理解

  • 目标:了解AI大模型的基本概念、发展历程和核心原理。

  • 内容:

    • L1.1 人工智能简述与大模型起源
    • L1.2 大模型与通用人工智能
    • L1.3 GPT模型的发展历程
    • L1.4 模型工程
    • L1.4.1 知识大模型
    • L1.4.2 生产大模型
    • L1.4.3 模型工程方法论
    • L1.4.4 模型工程实践
    • L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

  • 目标:掌握AI大模型API的使用和开发,以及相关的编程技能。

  • 内容:

    • L2.1 API接口
    • L2.1.1 OpenAI API接口
    • L2.1.2 Python接口接入
    • L2.1.3 BOT工具类框架
    • L2.1.4 代码示例
    • L2.2 Prompt框架
    • L2.3 流水线工程
    • L2.4 总结与展望

阶段3:AI大模型应用架构实践

  • 目标:深入理解AI大模型的应用架构,并能够进行私有化部署。

  • 内容:

    • L3.1 Agent模型框架
    • L3.2 MetaGPT
    • L3.3 ChatGLM
    • L3.4 LLAMA
    • L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

  • 目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。

  • 内容:

    • L4.1 模型私有化部署概述
    • L4.2 模型私有化部署的关键技术
    • L4.3 模型私有化部署的实施步骤
    • L4.4 模型私有化部署的应用场景

这份 LLM大模型资料 包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉优快云大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)👈

​

大模型开发之Langchain4j(看这一篇就够了) 本文介绍了SpringBoot与Langchain4j结合开发AI应用的技术方案。首先阐述了大模型的定义、特点及其在NLP、CV等领域的分类,包括通用(L0)、行业(L1)和垂直(L2)三个层级,并列举了大语言模型的主要应用场景。随后对比了Java生态的三大AI开发工具:LangChain4J(功能全面,支持15+主流模型)、Spring AI(深度集成Spring生态)和Spring AI Alibaba(对接阿里云大模型)。重点分析了LangChain4j作为Java专用LLM集成库的核心功能,包括多模 阅读详情

相关推荐

个人总结 - LangChain4j应用(完结)

LangChain4j是一个旨在简化大语言模型(LLMs)与Java应用程序集成的框架。 主要介绍:Classification、Image Models、Spring Boot 集成、Logging、Observability、Integrations(集成)

向前 3524

Java开发者LLM实战——使用LangChain4j构建本地RAG系统

RAG(Retrieval-Augmented Generation)的核心思想是:将传统的信息检索(IR)技术与现代的生成式大模型(如chatGPT)结合起来。具体来说,RAG模型在生成答案之前,会首先从一个大型的文档库或知识库中检索到若干条相关的文档片段。再将这些检索到的片段作为额外的上下文信息,输入到生成模型中,从而生成更为准确和信息丰富的文本。RAG的工作原理可以分为以下几个步骤:1.接收请求:首先,系统接收到用户的请求(例如提出一个问题)。2.信息****检索(R)

京东科技开发者 3540

四大主流大模型集成框架深度解析:LangChain、LangGraph、LangChain4j 与 LlamaIndex

大模型集成框架生态正在经历从 "百花齐放" 到 "分层收敛" 的演进:通用框架做广度,专业框架做深度,编排框架做复杂度,不同语言生态各自发展。LangChain凭借先发优势与庞大生态,仍是通用框架的首选,但其定位正逐渐从 "全能框架" 向 "编排底座" 收敛LangGraph代表了 Agent 开发的正确方向 —— 显式状态、可控流程、可观测性,是复杂智能体的事实标准是 Java 企业级市场的核心玩家,随着大模型在传统行业渗透,其重要性将持续提升LlamaIndex。

u013127325的博客 866

Java程序员的AI之LangChain4j(一)从零到企业级AI开发

让JAVA程序员更快的理解AI接入的LangChain4j

qq1071643762的博客 1万+

LangChain4j:Java开发者的大语言模型集成新范式

在人工智能技术迅猛发展的今天,大型语言模型(LLM)已成为推动智能化应用落地的核心引擎。然而,对于Java开发者而言,如何高效地将LLM能力融入传统企业级应用,曾是一道技术鸿沟。LangChain4j作为Java生态中首个专注于LLM集成的开源框架,以模块化设计和高度可扩展性,正在重塑Java开发者构建AI应用的方式。

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 1264

AI Agent+RAG组合拳:从架构到实战的知识库问答指南

在人工智能应用落地中,RAG(检索增强生成)通过外部知识库为大模型提供事实依据,而AI Agent则赋予模型规划、行动与反思的自主决策能力。二者结合形成的Agentic RAG,不仅能解决传统检索中多跳问题、查询表达不匹配及幻觉等痛点,还能通过多轮检索、查询改写和工具调度,显著提升知识库问答的准确性与可解释性。本文从向量检索、混合召回、Agent编排到Graph RAG与评估体系,系统拆解了实际项目中的完整落地路径,涵盖LangChain、Spring AI等主流技术栈,并给出银行、通信等行业场景的实践经验

weixin_33861800的博客 792

Langchain4j如何实现智能问答的跨越式进化?

若想加载所有子目录中的文档,可用使用。

Everly_的博客 793

Origin 2025b中文版安装全指南:避开乱码、水印与崩溃陷阱

Origin作为科研绘图领域的事实标准,其2025b版本首次官方支持简体中文UI,但安装远非‘下一步’即可完成。核心在于理解软件本体、语言包、许可证服务与系统区域设置四者间的耦合关系——尤其Windows非Unicode程序语言必须设为‘中文(简体,中国)’,否则必然触发坐标轴乱码、PDF文字方块等典型故障;而AI辅助拟合、内置Python 3.11等新特性,又依赖正确的字体链(如SimSun)与注册表强制加载(UILanguage=zh-CN)才能稳定启用。该版本广泛应用于材料科学、电化学、XRD/SEM

weixin_42548874的博客 1408

基于LangChain4j的CRAG系统实战:让RAG具备反思与纠错能力

检索增强生成(RAG)技术通过结合检索系统与大语言模型,有效提升了问答系统的准确性和信息可靠性。其核心原理在于利用向量检索从知识库中获取相关上下文,再交由大模型生成答案,从而减少模型幻觉。这项技术的价值在于能够处理动态、专有的知识,广泛应用于智能客服、企业知识库和文档分析等场景。然而,传统RAG面临检索结果质量不可控的挑战,当知识库存在错误或过时信息时,系统容易产生误导性输出。为此,Agentic RAG和CRAG(纠错检索增强生成)等进阶范式应运而生,它们通过引入评估、反思和动态纠错机制,显著提升了系统的

weixin_34290096的博客 332

fastadmin云快充充电桩系统部署文档uniapp

多商户 嘎嘎快充V1.0部署文档 一、服务器环境: 服务器配置4核心8GB内存5M带宽以上配置 VX next1402 只支持linux环境 nginx1.22 php7.2 开启redis、fileinfo扩展,关闭禁用workerman gatewayworkerman需要的函数,如pcntl相关的函数 mysql5.7 supervisor redis 注意: 1.站点必须配置https、websocket配置wss 2.注意开放直连服务端口:2024,并添加到安全组 二、必

itholiday2014的博客 1629

autoDL算力云装Xinference[坑与步骤]

在页面直接点击下载会出现下着下载进度条消失,试了几次才出现这个报错,现在我们就继续安装缺少的包吧。这一步成功绕开了系统盘空间限制。先租用一个合适的服务器,建议不要选最新版本,跟我选的一样即可,不然后面会出现。最近在 AutoDL 上尝试部署。🚫 不要直接使用以下命令。点击下面链接即可打开。

ngadminq的博客 2383

本地RAG实战:用Ollama+LangChain搭建私有文档智能问答系统

RAG(检索增强生成)是一种将大语言模型与外部知识源动态结合的关键技术,其核心原理是通过向量检索从私有文档中精准召回相关片段,再交由LLM基于事实生成答案,从而突破模型知识截止与幻觉瓶颈。相比微调或重训练,RAG具备零参数修改、秒级知识更新、数据本地化等显著工程优势,特别适用于PDF、数据库、网页等多源异构文档的实时问答场景。本文聚焦本地化落地,详解如何利用Ollama轻量部署Llama 3.1、LangChain构建端到端流水线,并通过向量对齐、上下文压缩与Prompt约束等关键技术,实现高准确率、可溯源

weixin_34195142的博客 497

反激电源反馈环路设计:从TL431+PC817原理到动态补偿实战

本文深入解析了反激电源中由TL431和PC817构成的经典反馈环路设计。从静态工作点计算到动态补偿实战,详细阐述了如何通过Type II补偿网络优化环路稳定性与动态响应,并分享了应对光耦CTR离散性、布局噪声等常见调试难题的实用技巧,帮助工程师设计出高性能、高可靠的开关电源。

moon9的博客 699

LangChain4j + Redis向量库:除了RAG,你还能用它做这些事(实战思路分享)

本文探讨了LangChain4j与Redis向量数据库结合的高阶应用,超越基础的RAG(检索增强生成)技术,展示了五大实战场景:智能FAQ客服系统、用户画像向量化、代码知识库管理、商品语义化搜索和法律文档智能归类。这些创新应用显著提升了语义理解和智能推荐的效果,为企业级AI开发提供了新思路。

weixin_27051161的博客 249

2023年GESP12月认证C++五级真题解析

例如,如果a=4,那么4是最⼩的幸运数,而1不是,但我们可以连续对1做3次+1操作,使其变为4,所以我们可以说,1幸运化后的结果是 4。【题目大意】给一个完全平方数的标准,推导出哪些是超级幸运数,然后判断N个数字中,哪些是超级幸运数,是的输出“lucky”,不是的输出离该数字最近的比它大的数字。前一个数字,下标是j的数字是偶数,后面的数字下标是j+1的是奇数,按照要求,偶数在奇数的后面,要交换。A函数时间复杂度是O(n/2),B函数算法是O(sqrt(n)),大部分情况后者是优的,值更小。

lan_in的博客 1007

【第33话:车辆控制】自动驾驶车辆运动学模型推导及详解

自动驾驶车辆的运动学模型以自行车模型为核心,通过状态方程。

一碗白开水一 831

高级java每日一道面试题-2025年8月05日-基础篇[LangChain4j]-什么是 Agent?LangChain4j 中的 Agent 有哪些类型?

摘要(150字): LangChain4j的Agent(智能体)是大语言模型的强大抽象,具备任务导向、工具使用、状态感知和协同能力等特征。与普通AI Service不同,Agent通过AgenticScope实现状态共享和调用链记录。LangChain4j支持两大类Agent系统:预定义路径的Workflows和动态决策的Pure Agents。提供了多种Workflow模式,包括顺序/并行/循环工作流和条件路由,通过@Agent注解和AgenticServices工厂类实现。典型应用包括创意写作流程(顺序

qq_43071699的博客 742

化工管道设计软件:CAESAR II二次开发_(6).API接口与函数库

自定义函数库是开发者根据特定需求编写的函数集合。这些函数可以扩展CAESAR II的功能,实现更复杂的管道设计任务。自定义函数库通常需要开发者具备一定的编程基础,能够理解和编写与CAESAR II接口兼容的代码。定义函数:在Python或其他编程语言中定义所需的函数。注册函数:将自定义函数注册到CAESAR II的函数库中。调用函数:在CAESAR II中调用自定义函数,实现特定功能。假设我们需要创建一个自定义函数库,用于批量修改管道节点的坐标。定义函数:在Python中定义一个函数,用于批量修改节点坐标。

kkchenjj的博客 1729

Graph RAG实战:用知识图谱升级网站智能问答

知识图谱是一种结构化表达实体及其逻辑关系的技术,其核心在于建模‘是什么’与‘为什么相关’的语义网络。相比传统向量检索依赖文本相似度,图谱通过节点、关系与属性实现可推理的知识组织,显著提升AI在复杂业务场景下的准确率与可解释性。Graph RAG正是这一范式的工程落地——它将文档、API手册、FAQ等非结构化内容转化为图结构,再结合Langchain工作流编排与GPT-4o生成能力,让问答系统具备‘顺藤摸瓜’的因果推演能力。典型应用场景包括SaaS官网自助客服、技术文档智能导航、HR员工政策问答等。本文聚焦G

weixin_30751947的博客 344

华为OD机试真题 新系统 2026-04-22 Python&JS 实现【小学生班长选举增强版】

9 月份开学第一天,小学某班级进行班长选举活动,班级共有 N 个学生,每个学生最多可投 3 票(对同一个人只能投一票),也可以弃权不投票,大家投票时写上对应学生的名字。 假设学生不存在重名。考虑到部分少数民族名字带分隔,且整体较长,同学在投票时为了方便,允许同学写全称,也可以只写其中的部分连续段。 例如班级里只有 2 个少数民族名称带点的同学:

MISAYAONE的博客 317

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java后端转型Agent开发:Spring AI与LangChain4j实战路线

大模型应用开发中,Agent通过调用LLM实现自主决策与工具调用,其核心涉及Token管理、Embedding向量化、Prompt工程及Function Calling等基础技术。这些技术使Agent能处理复杂任务,如智能客服、文档问答和流程自动化。对于Java开发者,Spring AI和LangChain4j框架提供了从后端技术栈切入Agent开发的桥梁,兼顾工程化与生态集成。本文分享从Java转型Agent的实操路径与框架选型经验。

weixin_42548708的博客 245

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 【大模型书】大语言模型安全开发者手册:构建安全的 AI 应用程序(附教程)
下一篇: 大模型学习文档+教程+PDF书籍+系统学习路线,一套全拿到!
Llama-Turbo
博客等级 码龄4年 9901粉丝 2022原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值