第四节 chatPDF

发布于:2025-07-10 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、Rag 向量数据库

1.向量相似度

欧式距离越小,相似度越高;余弦距离越大相似度越高。

2.配置向量模型

embedding: 嵌入,把…牢牢地嵌入

意思: 把文字转化为向量坐标嵌入到八维空间。

spring.ai.openai.embedding.options.dimensions=2048
spring.ai.openai.embedding.options.model=text-embedding-v4
3.使用EmbeddingModel

3.1 给测试脚本配置环境变量
OPENAI_API_KEY=sk-6c6026***854ca44

 

3.2 编辑测试脚本
package com.spring.springai;

import com.spring.springai.mapper.CourseMapper;
import org.junit.jupiter.api.Test;
import org.springframework.ai.openai.OpenAiEmbeddingModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;

import static org.junit.jupiter.api.Assertions.assertNotNull;

@SpringBootTest
class SpringaiApplicationTests {

    @Autowired
    private OpenAiEmbeddingModel openAiEmbeddingModel;

    @Test
    void contextLoads() {

        float[] floats = openAiEmbeddingModel.embed("学java就到黑马程序员");
        System.out.println(Arrays.toString(floats));
    }


    // 测试 mapper
    /*@Autowired
    private CourseMapper mapper;

    @Test
    void testSelect() {
        assertNotNull(mapper.selectById(1));
    }*/

}

3.3 测试欧式距离和余弦距离
package com.spring.springai;

import com.spring.springai.mapper.CourseMapper;
import com.spring.springai.utils.VectorDistanceUtils;
import org.junit.jupiter.api.Test;
import org.springframework.ai.openai.OpenAiEmbeddingModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertNotNull;

@SpringBootTest
class SpringaiApplicationTests {

    @Autowired
    private OpenAiEmbeddingModel openAiEmbeddingModel;

    @Test
    void contextLoads() {

        float[] floats = openAiEmbeddingModel.embed("学java就到黑马程序员");
        System.out.println(Arrays.toString(floats));
    }

    /**
     * 测试向量距离
     */
    @Test
    public void testEmbedding() {
        // 1.测试数据
        // 1.1.用来查询的文本,国际冲突
        String query = "global conflicts";

        // 1.2.用来做比较的文本
        String[] texts = new String[]{
//                "哈马斯称加沙下阶段停火谈判仍在进行 以方尚未做出承诺",
                "伊朗与以斯列互射导弹",
                "胡塞武装公布魔法海洋号被击沉全程",
                "74岁老戏骨捧花接小36岁未婚妻出狱",
                "土耳其、芬兰、瑞典与北约代表将继续就瑞典“入约”问题进行谈判",
                "日本航空基地水井中检测出有机氟化物超标",
                "国家游泳中心(水立方):恢复游泳、嬉水乐园等水上项目运营",
                "我国首次在空间站开展舱外辐射生物学暴露实验",
        };
        System.out.println("文本个数:" + texts.length);


        // 2.向量化
        System.out.println("------计算欧氏距离start------------");

        // 2.1.先将查询文本向量化
        float[] queryVector = openAiEmbeddingModel.embed(query);

        // 2.2.再将比较文本向量化,放到一个数组
        List<float[]> textVectors = openAiEmbeddingModel.embed(Arrays.asList(texts));

        // 3.比较欧氏距离
        // 3.1.把查询文本自己与自己比较,肯定是相似度最高的
        System.out.println(VectorDistanceUtils.euclideanDistance(queryVector, queryVector));

        // 3.2.把查询文本与其它文本比较
        for (float[] textVector : textVectors) {
            System.out.println(VectorDistanceUtils.euclideanDistance(queryVector, textVector));
        }
        System.out.println("------计算欧氏距离end,计算余弦距离 start------------");

        // 4.比较余弦距离
        // 4.1.把查询文本自己与自己比较,肯定是相似度最高的
        System.out.println(VectorDistanceUtils.cosineDistance(queryVector, queryVector));

        // 4.2.把查询文本与其它文本比较
        for (float[] textVector : textVectors) {
            System.out.println(VectorDistanceUtils.cosineDistance(queryVector, textVector));
        }

        System.out.println("------欧式距离越小,相似度越高;余弦距离越大相似度越高。------------");
    }

    // 测试1. mapper
    /*@Autowired
    private CourseMapper mapper;

    @Test
    void testSelect() {
        assertNotNull(mapper.selectById(1));
    }*/

}

结算结果:

参考:https://blog.csdn.net/2201_75669520/article/details/148813100


网站公告

今日签到

点亮在社区的每一天
去签到