前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊Spring AI的RedisVectorStore

聊聊Spring AI的RedisVectorStore

原创
作者头像
code4it
发布于 2025-04-06 02:31:02
发布于 2025-04-06 02:31:02
18200
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

本文主要研究一下Spring AI的RedisVectorStore

示例

pom.xml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-vector-store-redis</artifactId>
</dependency>

配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  ai:
    vectorstore:
      type: redis
      redis:
        initialize-schema: true
        indexName: default-idx
        prefix: "default:"

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @Test
    public void testAddAndSearch() {
        List<Document> documents = List.of(
                new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")),
                new Document("The World is Big and Salvation Lurks Around the Corner"),
                new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2")));

        // Add the documents to Milvus Vector Store
        redisVectorStore.add(documents);

        // Retrieve documents similar to a query
        List<Document> results = this.redisVectorStore.similaritySearch(SearchRequest.builder().query("Spring").topK(5).build());
        log.info("results:{}", JSON.toJSONString(results));
    }

输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
results:[{"contentFormatter":{"excludedEmbedMetadataKeys":[],"excludedInferenceMetadataKeys":[],"metadataSeparator":"\n","metadataTemplate":"{key}: {value}","textTemplate":"{metadata_string}\n\n{content}"},"formattedContent":"distance: 0.21754569\nvector_score: 0.21754569\n\nSpring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!","id":"8edf4d98-6730-4b19-8681-67bbd7aa002d","metadata":{"distance":0.21754569,"vector_score":0.21754569},"score":0.7824543118476868,"text":"Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!"},{"contentFormatter":{"$ref":"$[0].contentFormatter"},"formattedContent":"distance: 0.21754569\nvector_score: 0.21754569\n\nSpring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!","id":"dbdcc61f-7f7c-4c61-9491-aaf3ddb15ae9","metadata":{"distance":0.21754569,"vector_score":0.21754569},"score":0.7824543118476868,"text":"Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!"},{"contentFormatter":{"$ref":"$[0].contentFormatter"},"formattedContent":"distance: 0.2854656\nvector_score: 0.2854656\n\nThe World is Big and Salvation Lurks Around the Corner","id":"a28f2344-3389-427a-9a3d-69e3a1000a05","metadata":{"distance":0.2854656,"vector_score":0.2854656},"score":0.7145344018936157,"text":"The World is Big and Salvation Lurks Around the Corner"},{"contentFormatter":{"$ref":"$[0].contentFormatter"},"formattedContent":"distance: 0.2854656\nvector_score: 0.2854656\n\nThe World is Big and Salvation Lurks Around the Corner","id":"874aff9b-cd3d-41d9-9114-47157f3e4ccc","metadata":{"distance":0.2854656,"vector_score":0.2854656},"score":0.7145344018936157,"text":"The World is Big and Salvation Lurks Around the Corner"},{"contentFormatter":{"$ref":"$[0].contentFormatter"},"formattedContent":"distance: 0.2968012\nvector_score: 0.2968012\n\nYou walk forward facing the past and you turn back toward the future.","id":"c90a7824-dcdb-4855-ab07-0ac3629fba83","metadata":{"distance":0.2968012,"vector_score":0.2968012},"score":0.7031987905502319,"text":"You walk forward facing the past and you turn back toward the future."}]

源码

RedisVectorStoreAutoConfiguration

org/springframework/ai/vectorstore/redis/autoconfigure/RedisVectorStoreAutoConfiguration.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@AutoConfiguration(after = RedisAutoConfiguration.class)
@ConditionalOnClass({ JedisPooled.class, JedisConnectionFactory.class, RedisVectorStore.class, EmbeddingModel.class })
@ConditionalOnBean(JedisConnectionFactory.class)
@EnableConfigurationProperties(RedisVectorStoreProperties.class)
@ConditionalOnProperty(name = SpringAIVectorStoreTypes.TYPE, havingValue = SpringAIVectorStoreTypes.REDIS,
		matchIfMissing = true)
public class RedisVectorStoreAutoConfiguration {

	@Bean
	@ConditionalOnMissingBean(BatchingStrategy.class)
	BatchingStrategy batchingStrategy() {
		return new TokenCountBatchingStrategy();
	}

	@Bean
	@ConditionalOnMissingBean
	public RedisVectorStore vectorStore(EmbeddingModel embeddingModel, RedisVectorStoreProperties properties,
			JedisConnectionFactory jedisConnectionFactory, ObjectProvider<ObservationRegistry> observationRegistry,
			ObjectProvider<VectorStoreObservationConvention> customObservationConvention,
			BatchingStrategy batchingStrategy) {

		JedisPooled jedisPooled = this.jedisPooled(jedisConnectionFactory);
		return RedisVectorStore.builder(jedisPooled, embeddingModel)
			.initializeSchema(properties.isInitializeSchema())
			.observationRegistry(observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP))
			.customObservationConvention(customObservationConvention.getIfAvailable(() -> null))
			.batchingStrategy(batchingStrategy)
			.indexName(properties.getIndexName())
			.prefix(properties.getPrefix())
			.build();
	}

	private JedisPooled jedisPooled(JedisConnectionFactory jedisConnectionFactory) {

		String host = jedisConnectionFactory.getHostName();
		int port = jedisConnectionFactory.getPort();

		JedisClientConfig clientConfig = DefaultJedisClientConfig.builder()
			.ssl(jedisConnectionFactory.isUseSsl())
			.clientName(jedisConnectionFactory.getClientName())
			.timeoutMillis(jedisConnectionFactory.getTimeout())
			.password(jedisConnectionFactory.getPassword())
			.build();

		return new JedisPooled(new HostAndPort(host, port), clientConfig);
	}

}

RedisVectorStoreAutoConfiguration在spring.ai.vectorstore.typeredis时启用,它在RedisAutoConfiguration之后自动配置,它依赖EmbeddingModel及RedisVectorStoreProperties来创建RedisVectorStore

RedisVectorStoreProperties

org/springframework/ai/vectorstore/redis/autoconfigure/RedisVectorStoreProperties.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ConfigurationProperties(RedisVectorStoreProperties.CONFIG_PREFIX)
public class RedisVectorStoreProperties extends CommonVectorStoreProperties {

	public static final String CONFIG_PREFIX = "spring.ai.vectorstore.redis";

	private String indexName = "default-index";

	private String prefix = "default:";

	public String getIndexName() {
		return this.indexName;
	}

	public void setIndexName(String indexName) {
		this.indexName = indexName;
	}

	public String getPrefix() {
		return this.prefix;
	}

	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}

}

RedisVectorStoreProperties主要是配置spring.ai.vectorstore.redis配置,它从CommonVectorStoreProperties继承了initializeSchema属性,自己提供了indexName、prefix属性

RedisAutoConfiguration

org/springframework/boot/autoconfigure/data/redis/RedisAutoConfiguration.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@AutoConfiguration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {

	@Bean
	@ConditionalOnMissingBean(RedisConnectionDetails.class)
	PropertiesRedisConnectionDetails redisConnectionDetails(RedisProperties properties) {
		return new PropertiesRedisConnectionDetails(properties);
	}

	@Bean
	@ConditionalOnMissingBean(name = "redisTemplate")
	@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
		RedisTemplate<Object, Object> template = new RedisTemplate<>();
		template.setConnectionFactory(redisConnectionFactory);
		return template;
	}

	@Bean
	@ConditionalOnMissingBean
	@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
	public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
		return new StringRedisTemplate(redisConnectionFactory);
	}

}

RedisAutoConfiguration依赖RedisProperties以及LettuceConnectionConfiguration或者JedisConnectionConfiguration

RedisProperties

org/springframework/boot/autoconfigure/data/redis/RedisProperties.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ConfigurationProperties(prefix = "spring.data.redis")
public class RedisProperties {

	/**
	 * Database index used by the connection factory.
	 */
	private int database = 0;

	/**
	 * Connection URL. Overrides host, port, username, and password. Example:
	 * redis://user:password@example.com:6379
	 */
	private String url;

	/**
	 * Redis server host.
	 */
	private String host = "localhost";

	/**
	 * Login username of the redis server.
	 */
	private String username;

	/**
	 * Login password of the redis server.
	 */
	private String password;

	/**
	 * Redis server port.
	 */
	private int port = 6379;

	/**
	 * Read timeout.
	 */
	private Duration timeout;

	/**
	 * Connection timeout.
	 */
	private Duration connectTimeout;

	/**
	 * Client name to be set on connections with CLIENT SETNAME.
	 */
	private String clientName;

	/**
	 * Type of client to use. By default, auto-detected according to the classpath.
	 */
	private ClientType clientType;

	private Sentinel sentinel;

	private Cluster cluster;

	private final Ssl ssl = new Ssl();

	private final Jedis jedis = new Jedis();

	private final Lettuce lettuce = new Lettuce();

	//......
}	

RedisProperties主要是配置spring.data.redis,它提供了database、url、host、username、password、port、timeout、connectTimeout、clientName、clientType、sentinel、cluster、ssl、jedis、lettuce属性

小结

Spring AI提供了spring-ai-starter-vector-store-redis用于自动装配RedisVectorStore。可以使用redis/redis-stack:latest这个docker镜像来验证。

doc

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
固定资产管理系统能给企业带来哪些好处?
曾几何时,行政、IT和固定资产管理员还在为海量固定资产的管理和盘点而惆怅。而今,有了固定资产管理系统,这些问题都可以迎刃而解。在梳理好自己企业内部的固定资产管理需求之后,上一套适合自己企业的固定资产管理软件很有必要。
易点易动固定资产管理系统
2021/07/01
8060
固定资产密集型企业如何有效管理固定资产?
很多固定资产密集型企业往往在固定资产管理上花费了大量的人力和成本。在日常的经营管理中,许多企业依旧采用传统方式管理企业的固定资产,由于实物资产数量大、存放地点分散、职权不清以及粗放式管理,经常会出现权责不明确,固定资产分配不合理,闲置率高,重复购买,维护成本高等问题,从而导致大量固定资产的状态不明,丢失严重,固定资产的实际利用率低下,给企业的发展带来阻碍。
易点易动固定资产管理系统
2021/08/04
9440
如何在固定资产管理的路上乘风破浪?
目前,随着企业发展内部的需求推动,加上外界环境的多变,更多企业越来越重视,不但要降本增效为企业发展助力,而且要加速智能化发展的步伐。然而,要加强企业不同细分领域的智能化发展需要循序渐进,非一朝一夕之功。
易点易动固定资产管理系统
2021/08/13
3170
固定资产管理系统--企业降本增效的必备工具
随着公司业务和规模的日益扩大,公司的固定资产数量和种类也随之扩大和增长。这就给固定资产管理和盘点工作带来了一定的挑战。对于大型的企业而言,由于实物资产数量的庞大,传统的手工盘点和表格管理固定资产的方式已不能满足固定资产管理的需求,管理出错的风险也不断提高。而且由于无法实现信息化管理,固定资产的重复采购率和闲置率也居高不下,这无疑增加了企业的运营成本。
易点易动固定资产管理系统
2021/11/05
4610
固定资产管理系统--企业降本增效的必备工具
固定资产管理系统让企业动态掌握资产情况
很多企业经常会因为固定资产信息分散、查询不便、信息反映实效性差、纸质文档不易保存等问题导致资产流失、重复购买严重等问题,从而导致企业成本大幅度提升。越来越多的企业开始使用专业的固定资产管理系统,它可以将企业的固定资产信息、人员信息、部门信息等进行整合,还可以实现多层级和多组织架构的管理,实现固定资产的统筹管理,从而整合企业资产信息,提升固定资产利用率,减少重复采购并避免资产流失。
易点易动固定资产管理系统
2022/06/29
3820
固定资产管理系统让企业动态掌握资产情况
固定资产管理系统如何简化固定资产管理和盘点工作?
固定资产管理通常是各企业或事业单位的行政和财务以及IT部门的必修工作之一。那么,如何管理好数量庞大的固定资产,提升固定资产的使用效率,降低闲置率和重构率是评估固定资产管理工作做得好坏的重要标准。现实工作中,固定资产的数量多、领用审批凌乱、盘点难度大、固定资产的信息更新不及时等很多问题一直困扰着资产的管理者。
易点易动固定资产管理系统
2020/09/02
1.1K0
互联网行业如何高效地管理固定资产?
互联网行业通常对电脑、桌椅等办公设备的需求量大,而且对于质量要求比较高。互联网行业的扩张也比较迅速,经常需要扩充员工人数。如果不断开拓市场中,市场覆盖的区域都可以设置子公司或办事处以开展当地的业务。这样以来,互联网公司的固定资产往往具有以下特点:电子设备资产量大、人员数量和流动性比较大、异地管理等。
易点易动固定资产管理系统
2021/03/17
6290
互联网行业如何高效地管理固定资产?
8款最好用的固定资产管理软件
固定资产作为企业生产经营的重要部分,越来越被众多企业主重视。之前,大部分公司会选择EXCEL来管理固定资产。在固定资产系统如雨后春笋般涌出的时代,大部分公司会选择一款固定资产管理软件来精细化管理固定资产。尤其是分公司和分支比较多的集团公司,或者资产量比较多的企业和单位。
易点易动固定资产管理系统
2020/07/22
3.9K1
如何提升企业内部的固定资产管理水平?
经过对国内近千家企业的调研发现,很多企业在固定资产管理上依然有很多薄弱环节。大部分企业依然存在如下的问题:1)从固定资产采购到资产报废、处置整个流程缺乏全过程管理。从而导致固定资产重复购置问题严重,利用率低下,造成企业运营成本增加。2)每年一次或者两次的固定资产盘点,通常人力不足,盘点工作很难执行到位,外包盘点成本高。
易点易动固定资产管理系统
2021/07/28
4660
如何提升企业内部的固定资产管理水平?
企业何如选择固定资产管理系统
2020年已经过半,今年对于大多数企业来说都是不平常的一年。有许多企业的业务受阻,甚至生存都出现危机。今年,企业主正好可以放慢前行的脚步去完善今后的战略规划,以寻求内在发展动力。
易点易动固定资产管理系统
2020/07/03
6940
说说IT企业固定资产管理系统的问题和解决方法
IT企业随着业务的扩大、人员的增多,企业的固定资产数量和种类都会随之越来越多。当IT企业发展到一定规模后,内部管理通常会遇到一些问题:
易点易动固定资产管理系统
2021/12/13
6990
说说IT企业固定资产管理系统的问题和解决方法
固定资产云系统如何破解制造业数字化转型升级难题?
近年来,无论是互联网行业还是传统的制造行业,几乎各行各业都在积极拥抱数字化,旨在提升企业的效率,从容地应对瞬息万变的市场变换和竞争。当下,各行各业数字化转型升级的需求依然迫切,制造业亦如是。
易点易动固定资产管理系统
2021/07/23
3450
固定资产管理流程和技巧
企业固定资产是保证企业正常运行的重要基础物质条件,其管理及核算状况影响对企业业务活动的开展,经济效益的提高。从目前实际情况看,企业在固定资产管理,核算等方面存在诸多问题,因此,加强企业固定资产管理成为不容忽视的问题。
易点易动固定资产管理系统
2021/08/16
7090
如何实现固定资产管理智能化?
行政人员、IT人员、固定资产管理员在管理和盘点企业的固定资产时,往往都会出现以下场景:
易点易动固定资产管理系统
2021/07/21
5570
教育行业固定资产管理的解决方案
近年来,随着课外教育机构的迅速发展,办学规模越来越大,很多连锁教育机构对于固定资产管理管理上面还是各有各的痛点。另外,对于很多幼儿园、小学、中学、高中、大学而言,固定资产管理和盘点上工作仍然是一个薄弱环节。这其中有不少因素:从固定资产的数量看,业务活动和机构分支多,加上固定资产数量骤增,管理难度确实日益增大。从管理流程和方法上看,分支机构的调整、学校内部后勤、财务、行政、人事等工作需要协调和规范。
易点易动固定资产管理系统
2021/07/22
6270
为什么说手工表格管理固定资产已经OUT了?
以电子表格、纸质数据为主的传统固定资产管理和盘点的方式已被各种各样的固定资产管理系统所取代。人工管理的弊端和缺陷如下:
易点易动固定资产管理系统
2021/09/18
5810
为什么说手工表格管理固定资产已经OUT了?
企业如何进行高效化固定资产管理?
在信息化的今天,企业飞速发展的路上,如何早日实现企业信息化管理,是每个企业管理者思考的问题。作为企业管理中至关重要的一环,固定资产管理也被越来越多的管理者所重视。因为随着企业规模扩大、业务范围拓宽、人员数量的增多,如何有效地进行固定资产管理已经成为每一个企业管理者重要的一部分。
易点易动固定资产管理系统
2021/11/29
4210
企业如何进行高效化固定资产管理?
零售商超固定资产管理系统解决方案
零售超市在日常的固定资产管理和运营中比较复杂,遇到的各种实际操作问题比较多,为此,易点易动在对多家商业超市进行深入调查和需求梳理之后,提出了符合零售商超行业的固定资产管理方案。
易点易动固定资产管理系统
2021/10/19
4980
零售商超固定资产管理系统解决方案
企业数字化转型, RFID固定资产管理系统不可或缺
在企业普遍加快信息化进程的当下,越来越多的企业开始注重企业内部的管理。比如客户管理、合同管理、固定资产管理等。越来越多的企业摆脱了手工管理模式,开始引入各种系统给企业信息化助力。固定资产管理系统也被引入到企业的管理中。采用现代的云计算技术、条码、二维码技术、RFID等技术与相应的硬件扫描技术相结合,优化了固定资产的全生命周期管理流程,极大地提高了企业实物资产的管理和盘点效率,降低固定资产重复采购和丢失率,提升固定资产的利用率,为企业实现降本增效。
易点易动固定资产管理系统
2021/10/15
4850
企业数字化转型, RFID固定资产管理系统不可或缺
2023年企业固定资产管理怎么破局?
2022年已经在风雨中过去,转眼我们迎来了2023年。过去的一年,固定资产管理的痛依旧历历在目,如何让新的一年中,固定资产管理工作有所突破,不再承受固定资产资产管理的痛处,是每个企业管理者和企业固定资产管理员思考的问题。
易点易动固定资产管理系统
2022/12/23
4330
2023年企业固定资产管理怎么破局?
推荐阅读
相关推荐
固定资产管理系统能给企业带来哪些好处?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档