目录
历史文章
Langchain4j框架-Java程序员的大模型框架-优快云博客
向量
一个二维向量可以理解为平面坐标轴中的一个坐标点(x,y),在编程领域,一个二维向量就是一个大小为二的float类型的数组。
为什么要用向量
比较经典一个的例子就是:【我爱吃苹果】和【苹果是一家伟大的公司】,传统的数据库适合精确查找,如果输入是苹果,那么这两条记录都会匹配上,而向量模型能进行相似度计算和特征提取并且能表示文本、图像、音频等复杂数据。
文本向量化
public class EmbeddingTest {
public static void main(String[] args) {
OpenAiEmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder().
modelName("text-embedding-3-small")
.apiKey("demo")
.build();
Response<Embedding> embed = embeddingModel.embed("你好,我是斧王");
System.out.println(embed.content().toString());
System.out.println(embed.content().vector().length);
}
}
如果用demo进行演示的话,目前需指定模型为【text-embedding-3-small】否则会提示如下错误
Only 'text-embedding-3-small' model is available for demonstration purposes. If you wish to use another model, please use your own OpenAI API key.
运行结果:

从结果可以知道【你好,我是斧王】这句话经过OpenAiEmbeddingModel向量化之后得到的一个长度为1536的float数组。注意,1536是固定的,代表的是向量的维度,一般来说,嵌入向量的维度越高,模型能够捕捉到的数据特征就越复杂,但同时也会导致计算成本增加和过拟合的风险增大。相反,维度过低则可能导致信息丢失,无法充分表示数据的潜在关系,其维度不会随着句子长度而变化。
那么,我们通过这种向量模型得到一句话对应的向量有什么作用呢?非常有用,因为我们可以基于向量来判断两句话之间的相似度。
向量相似度
前面提到,向量相当于就是坐标点,如果两个坐标点靠得近,那么就表示这两个向量相似,所以,如果两句话对应的向量相似,那么就表示这两句话语义比较相似,当然这中间最关键的就是向量模型,因为向量是它生成的,向量模型也是经过大量机器学习训练之后产生的,向量模型效果越好,就表示它对于自然语言理解的程度越好,同时也就表示它生成出来的向量越准确,越能反映出语义的相似度。
向量数据库
对于向量模型生成出来的向量,我们可以持久化到向量数据库,并且能利用向量数据库来计算两个向量之间的相似度,或者根据一个向量查找跟这个向量最相似的向量。
在LangChain4j中,EmbeddingStore表示向量数据库,LangChain4j自带了很多实现,比如常见的es,pg,redis都支持,只需引入对应的依赖即可,这里我们以redis为例子
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-redis</artifactId>
<version>1.0.0-alpha1</version>
</dependency>
然后需要注意的是,普通的Redis是不支持向量存储和查询的,需要额外的redisearch模块,我这里从Docker Desktop安装了一个RedisStack

或者使用docker命令安装
docker run -p 6379:6379 redis/redis-stack-server:latest
public class EmbeddingTest {
public static void main(String[] args) throws In

最低0.47元/天 解锁文章
870

被折叠的 条评论
为什么被折叠?



