RetrievalAugmentor
是 RAG(检索增强生成)流程的核心,它通过从不同的数据源中检索相关内容来增强用户的消息。
在创建 AI service 时,可以指定 RetrievalAugmentor
实例:
RetrievalAugmentor
实现:DefaultRetrievalAugmentor
。它适用于大多数的 RAG 场景。这个实现的灵感来源于 LangChain 博客文章 和 相关论文。
Query
代表用户的查询请求,包含查询的文本以及相关的元数据。
Query
中的 Metadata
包含在 RAG 流程中有用的上下文信息,例如:
Metadata.userMessage()
:表示用户输入的原始消息。Metadata.chatMemoryId()
:一个用于标识用户的ID,可以应用在数据访问限制或过滤上。Metadata.chatMemory()
:之前的所有对话消息,用于理解查询的上下文。QueryTransformer
用于将原始查询转换为一个或多个新的查询,以提高检索的准确性。常见的查询优化方式包括:
DefaultQueryTransformer
是最简单的实现,它直接传递原始查询而不进行任何修改。
CompressingQueryTransformer
使用大语言模型(LLM)压缩查询和对话上下文,生成一个更简洁、独立的查询。例如:
CompressingQueryTransformer
会自动转换为”John Doe 住在哪里?“,以便更精准地检索信息。
ExpandingQueryTransformer
可以将简单的查询扩展为多个不同的表达方式,从而提高相关内容的覆盖面。
Content
代表系统从数据源中检索到的与查询相关的内容。目前支持的主要是文本内容(TextSegment
),未来可能会扩展支持其他模态,如图像、音频、视频等。
ContentRetriever
根据用户的查询从底层数据源中获取内容,数据源可以是:
EmbeddingStoreContentRetriever
使用嵌入模型将查询转化为向量,并从嵌入存储中检索相关的内容。
示例代码:
WebSearchContentRetriever
通过 WebSearchEngine
从互联网上检索相关内容。
示例代码:
SqlDatabaseContentRetriever
是用于从SQL数据库检索数据的实验性实现。更多信息可参考相关javadoc文档。
AzureAiSearchContentRetriever
在 langchain4j-azure-ai-search
模块中可用。
Neo4jContentRetriever
可用于从Neo4j数据库中检索与查询相关的内容。
QueryRouter
负责将查询分配到合适的内容检索器。
DefaultQueryRouter
将每个查询路由到所有配置的内容检索器。
LanguageModelQueryRouter
使用大语言模型(LLM)决定应该将查询发送到哪个检索器。
DefaultRetrievalAugmentor
会在单线程中执行查询和检索。否则,它会使用 Executor
并行处理多个查询和检索任务。默认情况下,系统会使用一个修改后的 Executors.newCachedThreadPool()
来实现这一功能,你也可以提供自定义的 Executor
: