Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Toolsets and best practices for RAG pattern. #101

Open
chickenlj opened this issue Nov 15, 2024 · 0 comments
Open

Toolsets and best practices for RAG pattern. #101

chickenlj opened this issue Nov 15, 2024 · 0 comments

Comments

@chickenlj
Copy link
Collaborator

如何使用 Spring AI Alibaba 构建一个能实际落地、具备高度功能可靠性的 AI 应用,这是用户面临的一个很大的问题。

比如我们当前提供的示例就很难在生产环境直接用起来:

  • 机票助手示例,是一个完全由模型决策驱动的应用,够AI但运行起来却太不具有确定性
  • rag示例,太简单不够全面,如没有面向特定场景的抽象、文档预处理简单、数据来源单一等

从大的方向上来说,有两种模式可以解决不确定性、效果不好的问题:

  • 去做能实际落地的 rag 实践案例,能应对绝大多数场景
  • 去做工作流编排,通过流程能带来更多确定性

本文我们主要围绕 RAG 场景展开,探索如何使用 Spring AI Alibaba 构建面向生产可用的AI应用。

数据处理流程

以下是基本 RAG 流程:

image

要解决的核心问题

文档/知识库的处理,既包括丰富的不同来源数据的加载,也包括与向量化等模型交互前的语义化处理等。对应上图中草绿色背景部分。

工具集完善度

DocumentLoader

主要解决数据来源的问题,包括数据**传输协议数据内容格式**等,要去考虑如何与当前spring ai实现适配。

  • Resource: 要适配不同的数据传输协议,通用有file、http、ftp等;而对于http等类型,通常还有云厂商OSS、Github、微信、chat等特有接口适配。
  • Parser:数据内容格式,如pdf、word、markdown、html等

Spring 提供了 Resource 接口及其多种实现,包括:

  • UrlResource:用于访问 URL 资源。
  • ClassPathResource:用于从类路径加载资源。
  • FileSystemResource:用于访问文件系统中的资源。]

当前需要做的事情:

  • 当前的pdf/markdown/poi等更像是parser实现(有些Loader可以基于通用类型Loader来实现)
    • 做更多的resouce来源支持,要考虑与spring resource的关系,因为当前来源设计都是spring resource
    • 扩展更多的parser实现,要做哪些比如 csv、非结构化 等?
    • 读取整个目录

Document loaders | 🦜️🔗 LangChain

Chat loaders | 🦜️🔗 LangChain

image

image

DocumentTransformer

Transformer 是对文档的预处理过程,主要是从文本格式、文本大小、文本元数据提取等方面进行,目前看到的一些实现主要分为三类:

  • 关键信息提取,用于向量数据Metadata,如 KeywordEnricher、SummaryEnricher 等,
  • 文本大小切分,适应 EmbeddingModel 的 Context Window 限制,如 TokenTextSplitter(目前依赖ContentFormatter?)
  • 数据格式化,如 ContentFormatter

理论上任何文档转换相关的动作都可以在这个位置做?比如文本内容转换、翻译、信息提取等。

我们可以将文档依次经过多个transformer处理,最终将处理后的文档数据交给 VeceorSrore

VectorStore

VectorStore 适配,不同的 VectorStore 在特性和效果上有差异

Retriever

作为参考并方便说明要实现的内容,我们以Langchain4j做示例

<font style="color:rgb(31, 35, 40);">DefaultRetrievalAugmentor</font> decomposes the entire RAG flow into more granular steps and base components:

  • <font style="color:rgb(31, 35, 40);">QueryTransformer</font>
  • <font style="color:rgb(31, 35, 40);">QueryRouter</font>
  • <font style="color:rgb(31, 35, 40);">ContentRetriever</font> (the old <font style="color:rgb(31, 35, 40);">Retriever</font> is now deprecated)
  • <font style="color:rgb(31, 35, 40);">ContentAggregator</font>
  • <font style="color:rgb(31, 35, 40);">ContentInjector</font>

image

image

面向场景的最佳实践

Spring AI 中的很多概念,对于普通 Java 开发者来说是很难理解的(DocumentReader、Tranformer、Splitter、Retriavel等),数据检索处理的过程对普通 Java 开发者也是很难理解的。

  • 第一,开发者可能不知道怎么用这些概念。
  • 第二,即使理解了概念,可能也不知道何时用哪种实现是最优的。比如 KeywordEnricher、TokenTextSplitter、SummaryEnricher 是干什么的,在哪个环节使用?

这有点像是让普通 Java 业务开发工程师,转型为大数据处理/检索系统开发工程师

工具集使用的最佳实践

image

面向场景的最佳实践

以上工具集运行在RAG工程的不同环节,不同场景下可能分别需要用到不同的工具,需要我们定义一些最佳实践场景,每个场景下通过结合几个特定的工具实现最优效果。

通过最佳实践解决用户面临的问题:

  • 怎么读取各种不同来源的知识内容
  • 怎么在更优语意化场景下对长文章切片/转换
  • 怎么在检索环节做调优
  • 怎么使用类似 graph rag / stract rag 等

image

在知识库上适当提供一些建议

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant