Spring AI Alibaba 文档检索使用

一、文档检索 (Document Retriever)简介

1、核心概念

文档检索(DocumentRetriever)是一种信息检索技术,旨在从大量未结构化或半结构化文档中快速找到与特定查询相关的文档或信息。文档检索通常以在线(online)方式运行。

DocumentRetriever通常基于向量搜索。 它将用户的查询问题(query)转化为Embeddings后,在存储文档中进行相似性搜索,返回相关的片段。片段的用途之一是作为提示词(prompt)的一部分,发送给大模型(LLM)汇总处理后,作为答案呈现给用户。

public interface DocumentRetriever extends Function<Query, List<Document>> {/*** Retrieves relevant documents from an underlying data source based on the given* query.* @param query The query to use for retrieving documents* @return The list of relevant documents*/List<Document> retrieve(Query query);default List<Document> apply(Query query) {return retrieve(query);}}

DocumentRetriever API提供了简单、灵活的方式,供开发者使用自定义的检索系统。

  • DocumentRetriever API简单地将用户的查询作为输入,返回文档片段(Document)的列表。
  • Document表示一个文档片段,它包含一个文本内容,以及一个或多个元数据。
  • 用户可以通过retrieve方法执行自定义的检索步骤。
  • DashScopeDocumentRetrieverOptions提供了DashScopeDocumentRetriever的配置信息,它通过构建器创建选项。
  • 在构造DashScopeDocumentRetriever时,通过将一个DashScopeDocumentRetrieverOptions实例传入,已完成配置。

DashScopeDocumentCloudReader类:百炼云端文档解析,主要是走当前数据中心逻辑。

作用:将用户添加的文档上传到百炼平台云端。

通过查看 DashScopeDocumentCloudReader的get方法可以看到上传逻辑。

在这里插入图片描述

二、文档检索 (Document Retriever)使用

Spring AI Alibaba 文档检索 (Document Retriever):https://java2ai.com/docs/1.0.0-M6.1/tutorials/retriever

Spring AI Alibaba 支持以上 Model 抽象与通义系列模型的适配,并通过 spring-ai-alibaba-starter AutoConfiguration 自动初始化了默认实例,因此我们可以在应用程序中直接注入 ChatModel、ImageModel 等 bean,当然在需要的时候也可以自定义 Model 实例。

在普通 Controller Bean 中注入 DocumentRetriever 实例,实现下面几个功能:

  • 简单调用
  • 流式调用
  • 上传用户文档-向量存储

编写 Controller接口

@Slf4j
@RestController
@RequestMapping("/dashscope/document-retriever")
public class DashScopeDocumentRetrieverController {private final ChatClient chatClient;private final DashScopeApi dashscopeApi;@Value("${spring.ai.dashscope.api-key}")private String apiKey;//private String apiKey = "sk-xxx";private static final String indexName = "高并发-知识库";private static final String retrievalSystemTemplate = """Context information is below.---------------------{question_answer_context}---------------------Given the context and provided history information and not prior knowledge,reply to the user comment. If the answer is not in the context, informthe user that you can't answer the question.""";public DashScopeDocumentRetrieverController(ChatClient.Builder builder) {// 暂时无法从Spring IOC容器中获取,所以这里手动创建 DashScopeApi 对象。this.dashscopeApi = new DashScopeApi(apiKey);DocumentRetriever retriever = new DashScopeDocumentRetriever(this.dashscopeApi,DashScopeDocumentRetrieverOptions.builder().withIndexName(indexName).build());this.chatClient = builder//.defaultAdvisors(new DocumentRetrievalAdvisor(retriever)).defaultAdvisors(new DocumentRetrievalAdvisor(retriever, retrievalSystemTemplate)).build();}/*** 导入用户文档*/@GetMapping("/importDocuments")private String importDocuments() {File file = new File("D:\\TempFiles\\高并发秒杀系统的设计与实现.pdf");// 获取文件或目录的绝对路径。String filePath = file.getAbsolutePath();// 1. import and split documentsDocumentReader reader = new DashScopeDocumentCloudReader(filePath, dashscopeApi, null);List<Document> documentList = reader.get();log.info("{} documents loaded and split", documentList.size());// 2. add documents to DashScope cloud storageVectorStore vectorStore = new DashScopeCloudStore(dashscopeApi, new DashScopeStoreOptions(indexName));vectorStore.add(documentList);log.info("{} documents added to dashscope cloud vector store", documentList.size());return "success";}/*** 简单调用方式*/@GetMapping("/simple/chat")public String simpleChat(@RequestParam(defaultValue = "你好,请问你的知识库文档主要是关于什么内容的?") String userInputPrompt) {String aiOutput = chatClient.prompt(userInputPrompt).call().content();log.info("simpleChat --> userInputPrompt = {}, aiOutput = {}", userInputPrompt, aiOutput);return aiOutput;}/*** Stream 流式调用。* 可以使大模型的输出信息实现打字机效果。*/@GetMapping("/stream/chat")public Flux<String> streamChat(HttpServletResponse response,@RequestParam(defaultValue = "你好,请问你的知识库文档主要是关于什么内容的?") String userInputPrompt) {// 避免接口返回乱码response.setCharacterEncoding("UTF-8");log.info("streamChat -->  userInputPrompt = {},", userInputPrompt);Flux<String> aiOutput = chatClient.prompt(userInputPrompt).stream().content();return aiOutput;}}

启动项目,用户上传文件之后,我们在阿里云百炼平台就可以查看到文档信息。

在这里插入图片描述
在这里插入图片描述

访问接口与 AI 大模型智能对话。

在这里插入图片描述

– 求知若饥,虚心若愚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试核心知识点整理:从 JavaScript 到 Vue 全解析

一、JavaScript 异步编程核心:Promise 与 async/await 1. Promise 深度解析 定义:Promise 是处理异步操作的对象,代表一个异步操作的最终状态(成功 / 失败)。三种状态: pending(进行中):初始状态,异步操作未完成。fulfilled(已成功):异步操作成功,调用 resolve …

音视频(四)android编译

前言 前面已经讲了在windows上应用了&#xff0c;这章主要讲述android上编译 1&#xff1a;环境 git 如果失败 直接跑到相应网站 手动下载 ubuntu22.* android ndk r21e download:https://developer.android.google.cn/ndk/downloads/index.html?hluk 为什么用这个&#xff0…

【kind管理脚本-3】脚本函数说明文档 —— 便捷使用 kind 创建、删除、管理集群脚本

下面是一份详细的说明文档&#xff0c;介绍该脚本的功能、用法及各部分的含义&#xff0c;供您参考和使用&#xff1a; Kind 集群管理脚本说明文档 此脚本主要用于管理 Kind&#xff08;Kubernetes IN Docker&#xff09;集群&#xff0c;提供创建、删除、导出 kubeconfig、加…

【计算机行业发展与重塑】

计算机行业正经历前所未有的变革&#xff0c;AI技术的爆发式发展与产业升级的深度融合&#xff0c;正在重塑行业格局与就业市场。以下从行业趋势、AI的核心价值、就业需求三个维度展开分析。 一、行业趋势&#xff1a;AI驱动下的多极增长 AI成为核心引擎 生成式AI的突破&#…

(高频SQL50题)1667. 修复表中的名字

问题 表&#xff1a; Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | name | varchar | ------------------------- user_id 是该表的主键(具有唯一值的列)。 该表包含用户的 ID 和名字…

基于人工智能的医学影像关联分析:利用潜在空间几何混杂因素校正法|文献速递-深度学习医疗AI最新文献

Title 题目 AI-based association analysis for medical imaging using latent-spacegeometric confounder correction 基于人工智能的医学影像关联分析&#xff1a;利用潜在空间几何混杂因素校正法 01 文献速递介绍 人工智能&#xff08;AI&#xff09;已成为各个领域的…

开源免费虚拟化软件PVE功能介绍

Proxmox VE&#xff08;PVE&#xff09;提供了一个基于 Web UI&#xff08;管理界面&#xff09;的虚拟化管理平台&#xff0c;用户可以通过浏览器管理 虚拟机&#xff08;VM&#xff09;、容器&#xff08;LXC&#xff09;、存储、网络、备份、用户权限等。 一、PVE Web 界面…

新球体育比分状态监控

文章目录 目标分析监控逻辑代码目标分析 网页监控地址:aHR0cHM6Ly9saXZlLnRpdGFuMDA3LmNvbS9pbmRleDJpbjEuYXNweD9pZD0x 监控逻辑 比分等数据主要是依赖JS加载得到,通过ajax后端进行渲染 代码 # -*- coding: utf-8 -*-import warnings warnings.filterwarnings(ignore) f…

【lodash的omit函数详解 - 从入门到精通】

lodash的omit函数详解 - 从入门到精通 小白视角&#xff1a;什么是omit&#xff1f; omit在英文中意为"忽略"或"省略"。在编程中&#xff0c;它就是从一个对象中删除不需要的属性&#xff0c;返回一个新对象。 // 原始对象 const person {name: "…

软考笔记9——数据库技术基础

第九章节——数据库技术基础 数据库技术基础 第九章节——数据库技术基础一、基本概念1. 数据库与数据库系统2. 数据库的三级模式2.1 内模式2.2 概念模式2.3 外模式2.4 数据库的两级映射2.5 数据库设计的基本步骤 二、数据模型1. 基本概念2. E-R模型2.1 实体2.2 联系2.3 属性 3…

Django分页教程及示例

推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 完整代码示例:结论Django的分页模块允许你将大量数据分割成更小的块(页面)。这对于以可管理的方式显示项目列表,如博客文章或产品…

int 与 Integer 的区别详解

1. 本质区别 特性intInteger类型基本数据类型&#xff08;Primitive&#xff09;包装类&#xff08;Wrapper Class&#xff09;存储位置栈&#xff08;或作为对象成员在堆中&#xff09;堆&#xff08;对象实例&#xff09;默认值0null&#xff08;可能导致 NullPointerExcept…

mariadb使用docker compose方式安装

问题 本地mac m1上面的mysql和mariadb突然不用使用了&#xff0c;重新安装也不想&#xff0c;最近mac系统也更新了&#xff0c;brew也更新了&#xff0c;重新安装mariadb还是不能正常使用&#xff0c;现在我打算使用docker来安装本地的mariadb了。 默认配置文件my.cnf 从容器…

基于React + Antd + Java的OFD文件上传预览实现方案(OFD文件转图片)

一、前端实现方案(React + Antd) import React, {useState } from react; import {Upload, Button, Image, Carousel } from antd; import {UploadOutlined } from @ant-design/icons;const OFDUploadPreview = () => {const [previewImages, setPreviewImages] = useSta…

从零构建大语言模型全栈开发指南:第四部分:工程实践与部署-4.3.1LangChain与Dify平台实战:从RAG到Agent工作流

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 LangChain与Dify平台实战:从RAG到Agent工作流 - 4.3.1 LangChain与Dify平台实战:从RAG到Agent工作流1. LangChain核心组件与RAG架构设计1.1 LangChain核心模块1.2 RAG架构实现流程2. RAG实战:企业知识…

操作 Office Excel 文档类库Excelize

Excelize 是 Go 语言编写的一个用来操作 Office Excel 文档类库&#xff0c;基于 ECMA-376 OOXML 技术标准。可以使用它来读取、写入 XLSX 文件&#xff0c;相比较其他的开源类库&#xff0c;Excelize 支持操作带有数据透视表、切片器、图表与图片的 Excel 并支持向 Excel 中插…

R Excel 文件:高效数据处理与可视化工具的完美结合

R Excel 文件&#xff1a;高效数据处理与可视化工具的完美结合 引言 在数据分析和处理领域&#xff0c;R语言因其强大的数据处理能力和丰富的可视化功能而备受青睐。而Excel作为最常用的电子表格软件&#xff0c;其广泛的应用也使得R与Excel的结合成为数据处理与可视化的理想…

[ctfshow web入门] 零基础版题解 目录(持续更新中)

ctfshow web入门 零基础版 前言 我在刷题之前没有学过php&#xff0c;但是会python和C&#xff0c;也就是说&#xff0c;如果你和我一样会一门高级语言&#xff0c;就可以开始刷题了。我会以完全没学过php的视角来写题解&#xff0c;你也完全没有必要专门学习php&#xff0c;这…

linux第三次作业

1、将你的虚拟机的网卡模式设置为nat模式&#xff0c;给虚拟机网卡配置三个主机位分别为100、200、168的ip地址 2、测试你的虚拟机是否能够ping通网关和dns&#xff0c;如果不能请修改网关和dns的地址 3、将如下内容写入/etc/hosts文件中&#xff08;如果有多个ip地址则写多行&…

如何开发 HTML 游戏

开发 HTML 游戏适合初学者学习编程和游戏开发的基础知识。HTML 游戏通常结合了 HTML、CSS 和 JavaScript 技术&#xff0c;利用浏览器的渲染能力来实现交互式的游戏体验。 1. 确定游戏类型 在开始开发之前&#xff0c;你需要明确你的游戏类型。例如&#xff1a; 简单游戏&…