AI-知识库搭建(二)GPT-Embedding模型使用

CJ点 2024-08-21 16:01:11 阅读 52

上一篇:AI-知识库搭建(一)腾讯云向量数据库使用-CSDN博客

一、Embedding模型

Embedding模型是一种将高维度的离散数据(如文本、图像、音频等)映射到低维度的连续向量空间的技术。这种技术广泛应用于自然语言处理(NLP)、推荐系统、搜索引擎、问答系统等领域,能够显著提高数据处理的效率和准确性。

二、模型text-embedding-ada-002

openai官方: https://platform.openai.com/ (需要注册,充值)

"Text-Embedding-Ada-002" 是OpenAIAP|中的一个预训练文本嵌入模型,它属于"Ada" 系列的-个变种。Ada系列的模型专注于文本分类和语言理解任务,它在理解语义和推断方面有较好的性能。

这个模型可以用于各种自然语言处理任务,例如文本分类、情感分析、语义理解等。相较于一般的

通用语言模型,"Text-Embedding-Ada-002"可能更适合于需要较高语义理解和推断能力的任务。

三、引用依赖

Chatgpt-Java | Unfbx | Chatgpt-Java

<code> <dependency>

<groupId>com.unfbx</groupId>

<artifactId>chatgpt-java</artifactId>

<version>1.1.5</version>

</dependency>

<dependency>

<groupId>com.squareup.okhttp3</groupId>

<artifactId>okhttp</artifactId>

<version>4.9.2</version>

</dependency>

四、application.properties配置

#GPT代理地址IP/域名

proxy.hostname=${PROXY_HOSTNAME:xxxxxxx.com}

proxy.hostport=${PROXY_HOSTPORT:123456}

#GPT密钥

openai.sessonkey=${OPENAI_SESSONKEY:sk-123456}

#GPT语言模型

openai.model=${OPENAI_MODEL:text-embedding-ada-002}

五、初始化客户端

import com.unfbx.chatgpt.OpenAiClient;

import okhttp3.OkHttpClient;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.stereotype.Component;

import java.net.InetSocketAddress;

import java.net.Proxy;

import java.util.Arrays;

import java.util.concurrent.TimeUnit;

@Component

public class InitOpenAiClient {

@Value("${proxy.hostname:}")

private String proxyHostname;

@Value("${proxy.hostport:}")

private Integer proxyHostport;

@Value("${openai.sessonkey:}")

private String openaiSessionKey;

@Bean

public OpenAiClient openAiClient(){

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHostname, proxyHostport));//代理ip,端口

OkHttpClient okHttpClient = new OkHttpClient

.Builder()

//自定义代理

.proxy(proxy)

.connectTimeout(30, TimeUnit.SECONDS)//自定义超时时间

.writeTimeout(30, TimeUnit.SECONDS)//自定义超时时间

.readTimeout(30, TimeUnit.SECONDS)//自定义超时时间

.build();

OpenAiClient client = OpenAiClient.builder()

//支持多key传入,请求时候随机选择

.apiKey(Arrays.asList(openaiSessionKey))

.okHttpClient(okHttpClient)

.build();

return client;

}

}

六、封装接口类

import cn.hutool.core.collection.CollectionUtil;

import com.unfbx.chatgpt.OpenAiClient;

import com.unfbx.chatgpt.entity.embeddings.Embedding;

import com.unfbx.chatgpt.entity.embeddings.EmbeddingResponse;

import com.unfbx.chatgpt.entity.embeddings.Item;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

import javax.annotation.Resource;

import java.util.LinkedList;

import java.util.List;

/**

* 获取Ai模型能力

* 接口文档 https://chatgpt-java.unfbx.com/

* 源码、demo https://github.com/Grt1228/chatgpt-java

* @Date 2024/3/6 13:49

*/

@Component

@Slf4j

public class AiManager {

@Resource

OpenAiClient openAiClient;

@Value("${openai.model:}")

private String openAiModel;

/**

* 该接口获取可能不会非常快,有一定的时延性

* 获取文本的embedding(向量)

* @param input

* @return 返回数组,排列顺序对应传入的数组参数

*/

public List<Item> getEmbedding(List<String> input) {

try {

Embedding embedding = Embedding.builder().input(input).model(openAiModel).build();

EmbeddingResponse embeddings = openAiClient.embeddings(embedding);

if (CollectionUtil.isEmpty(embeddings.getData())) {

return new LinkedList<>();

}

List<Item> data = embeddings.getData();

return data;

} catch (Exception ex) {

log.error("调用AI模型报错",ex);

throw new RuntimeException(ex.getMessage());

}

}

}

GPT的引用,在这里我们只使用到了它的embeddings接口,对我们的原始数据做向量化处理。处理后的向量就可以直接存入向量数据库,为最后的问题答案匹配准备。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。