Langchain4j框架-Java程序员的大模型框架(二)

目录

向量

为什么要用向量

文本向量化

向量相似度

向量数据库

如何匹配向量

什么是RAG

RAG来检索的案例

RAG索引和检索流程简图

通过代码模拟这两个流程


历史文章

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值