
向量化过程将文件分块的内容分批次传递给大模型将返回的请求进行提取内容里的向量再将这些向量和对应分片信息封装成文档实体类存入ES搜索引擎/向量数据库中。Pinecone向量检索性能更好但收费,数据大的时候成本高并且不能存原文。ES 可以直接存原文无需二次查询 , 自建成本低免费版即够使用,支持中文分词和全文搜索。一、封装请求ListString batch MapString, Object requestBody new HashMap(); requestBody.put(model, modelId);//模型名称 requestBody.put(input, batch); requestBody.put(dimension, dimension); //向量维度 requestBody.put(encoding_format, float); // 添加编码格式二、WebClient的配置项Configuration public class WebClientConfig { Value(${embedding.api.url}) private String apiUrl; Value(${embedding.api.key}) private String apiKey; Bean public WebClient embeddingWebClient() { ExchangeStrategies strategies ExchangeStrategies.builder() .codecs(configurer - configurer .defaultCodecs() .maxInMemorySize(16 * 1024 * 1024)) // 16MB .build(); return WebClient.builder() .baseUrl(apiUrl) .exchangeStrategies(strategies) .defaultHeader(HttpHeaders.AUTHORIZATION, Bearer apiKey) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .build(); }1、exchangeStrategies(strategies)作用:配置 WebClient 的编解码策略特别是设置内存缓冲区大小限制,防止OOM。2、最常用的几个构建参数WebClient.builder().baseUrl(...) // 基础 URL.defaultHeader(..., ...) // 默认请求头.exchangeStrategies(...) // 编解码策略.filter(...) // 拦截器.build() // 构建三、对大模型发送向量化请求return webClient.post() .uri(/embeddings) .bodyValue(requestBody) .retrieve() .bodyToMono(String.class) .retryWhen(Retry.fixedDelay(3, Duration.ofSeconds(1)) .filter(e - e instanceof WebClientResponseException) .doBeforeRetry(signal - logger.warn(重试API调用 - 尝试: {}, 错误: {}, signal.totalRetries() 1, signal.failure().getMessage()))) .block(Duration.ofSeconds(30));1、retrieve():行为(1)建立 HTTP 连接(2)发送请求头和请求体(3)等待服务器响应(4)检查 HTTP 状态码2xx → 成功继续处理4xx/5xx → 失败抛出 WebClientResponseException作用 真正发起网络请求。2、 .bodyValue(requestBody)将文本列表发送给 Embedding 模型 API。3、.bodyToMono(String.class)将响应体转换为 MonoString响应式类型4、 .retryWhen(...) - 重试机制1Retry.fixedDelay(3, Duration.ofSeconds(1))重试三次每次间隔一秒2.filter(e - e instanceof WebClientResponseException)只对特定类型的异常进行重试3 .doBeforeRetry(...)每次重试前记录日志signal.totalRetries() // 已重试次数从 1 开始signal.failure() // 导致重试的异常对象5、 .block(Duration.ofSeconds(30))作用阻塞等待结果最多等待 30 秒行为1将响应式编程Reactor转换回同步编程2阻塞当前线程直到收到响应或超时3返回最终的 String 结果API 响应的 JSON4超过三十秒无响应返回TimeoutException异常6、WebClient.post()最常用的几个参数webClient.post().uri(...) // 必填请求路径.bodyValue(...) // POST 必填请求体.header(..., ...) // 可选请求头.retrieve() // 必填发送请求.bodyToMono(...) // 必填处理响应.block(); // 同步等待四、转换为对应搜索引擎类型并调用对应API实现存储用ES作为示例//将封装好的实体类转化为ES要求的操作列表BulkOperation ListBulkOperation bulkOperations ; //创建BulkRequest对象将操作列表添加到请求中 BulkRequest request BulkRequest.of(b - b.operations(bulkOperations)); //执行操作 BulkResponse response esClient.bulk(request);结语这样就存储成功了以后可以根据向量相似度进行语义检索和根据文本关键词进行全文检索。