Spring AI:检索增强生成(RAG)

检索增强生成(RAG)是一种有用的技术,可以克服大型语言模型在长篇内容、事实准确性和上下文感知方面的局限性。

Spring AI通过提供模块化架构来支持RAG,该架构允许您自己构建自定义RAG流,或使用Advisor API使用现成的RAG流。

在概念部分了解有关检索增强生成的更多信息。

Advisors

Spring AI使用Advisor API为常见RAG流提供了开箱即用的支持。

要使用QuestionAnswerAdvisor或RetrievalAugmentationAdvisor,您需要将spring-ai advisers向量存储依赖项添加到您的项目中:

<dependency>
   <groupId>org.springframework.ai</groupId>
   <artifactId>spring-ai-advisors-vector-store</artifactId>
</dependency>

QuestionAnswerAdvisor

矢量数据库存储AI模型不知道的数据。当用户问题被发送到AI模型时,QuestionAnswerAdvisor会查询向量数据库中与用户问题相关的文档。

向量数据库的响应被附加到用户文本中,为AI模型生成响应提供上下文。

假设您已经将数据加载到VectorStore中,您可以通过向ChatClient提供QuestionAnswerAdvisor的实例来执行检索增强生成(RAG)。

ChatResponse response = ChatClient.builder(chatModel)
        .build().prompt()
        .advisors(new QuestionAnswerAdvisor(vectorStore))
        .user(userText)
        .call()
        .chatResponse();

在此示例中,QuestionAnswerAdvisor将对矢量数据库中的所有文档执行相似性搜索。为了限制搜索的文档类型,SearchRequest采用了一个类似SQL的过滤器表达式,该表达式可在所有VectorStores中移植。

此筛选器表达式可以在创建QuestionAnswerAdvisor时配置,因此将始终应用于所有ChatClient请求,也可以在运行时为每个请求提供。

以下是如何创建阈值为0.8的QuestionAnswerAdvisor实例并返回前6个结果。

var qaAdvisor = QuestionAnswerAdvisor.builder(vectorStore)
        .searchRequest(SearchRequest.builder().similarityThreshold(0.8d).topK(6).build())
        .build();
Dynamic Filter Expressions

在运行时使用filter_expression顾问上下文参数更新SearchRequest筛选器表达式:

ChatClient chatClient = ChatClient.builder(chatModel)
    .defaultAdvisors(QuestionAnswerAdvisor.builder(vectorStore)
        .searchRequest(SearchRequest.builder().build())
        .build())
    .build();

// Update filter expression at runtime
String content = this.chatClient.prompt()
    .user("Please answer my question XYZ")
    .advisors(a -> a.param(QuestionAnswerAdvisor.FILTER_EXPRESSION, "type == 'Spring'"))
    .call()
    .content();

FILTER_EXPRESSION参数允许您根据提供的表达式动态过滤搜索结果。

Custom Template

QuestionAnswerAdvisor使用默认模板用检索到的文档来增强用户问题。您可以通过.PromptTemplate()构建器方法提供自己的PromptTemplate对象来自定义此行为。

此处提供的PromptTemplate自定义顾问如何将检索到的上下文与用户查询合并。这与在ChatClient本身上配置TemplateRenderer(使用.templateRender())不同,后者会影响顾问运行前初始用户/系统提示内容的呈现。有关客户端级模板呈现的更多详细信息,请参阅ChatClient提示模板。

自定义PromptTemplate可以使用任何TemplateRenderer实现(默认情况下,它使用基于StringTemplate引擎的S

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾条_花吹雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值