package com.lanyuanxiaoyao.service.ai.knowledge;

import java.net.http.HttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.ai.openai.api.OpenAiApi;
import org.springframework.http.client.JdkClientHttpRequestFactory;
import org.springframework.http.client.reactive.JdkClientHttpConnector;
import org.springframework.web.client.RestClient;
import org.springframework.web.reactive.function.client.WebClient;

/**
 * @author lanyuanxiaoyao
 * @version 20250526
 */
public class TestLlm {
  private static final Logger log = LoggerFactory.getLogger(TestLlm.class);

  public static void main(String[] args) {
    HttpClient httpClient = HttpClient.newBuilder()
        .version(HttpClient.Version.HTTP_1_1)
        .build();
    ChatClient client = ChatClient.builder(
            OpenAiChatModel.builder()
                .openAiApi(
                    OpenAiApi.builder()
                        .baseUrl("http://132.121.206.65:10086")
                        .apiKey("*XMySqV%>hR&v>>g*NwCs3tpQ5FVMFEF2VHVTj<MYQd$&@$sY7CgqNyea4giJi4")
                        .webClientBuilder(WebClient.builder().clientConnector(new JdkClientHttpConnector(httpClient)))
                        .restClientBuilder(RestClient.builder().requestFactory(new JdkClientHttpRequestFactory(httpClient)))
                        .build()
                )
                .defaultOptions(
                    OpenAiChatOptions.builder()
                        .model("Qwen3-1.7-vllm")
                        .build()
                )
                .build()
        )
        .build();
    String content = client.prompt()
        .system("""
            对用户输入的文本，生成多组高质量的问答对。请遵循以下指南：
            1. 问题部分：
              为同一个主题创建尽可能多的不同表述的问题，确保问题的多样性。
              每个问题应考虑用户可能的多种问法，例如：
              直接询问（如“什么是...？”）
              请求确认（如“是否可以说...？”）
              寻求解释（如“请解释一下...的含义。”）
              假设性问题（如“如果...会怎样？”）
              例子请求（如“能否举个例子说明...？”）
              问题应涵盖文本中的关键信息、主要概念和细节，确保不遗漏重要内容。
            2. 答案部分：
              提供一个全面、信息丰富的答案，涵盖问题的所有可能角度，确保逻辑连贯。
              答案应直接基于给定文本，确保准确性和一致性。
              包含相关的细节，如日期、名称、职位等具体信息，必要时提供背景信息以增强理解。
            3. 格式：
              使用"问："标记问题集合的开始，所有问题应在一个段落内，问题之间用空格分隔。
              使用"答："标记答案的开始，答案应清晰分段，便于阅读。
              问答对之间用“---”分隔，以提高可读性。
            4. 内容要求：
              确保问答对紧密围绕文本主题，避免偏离主题。
              避免添加文本中未提及的信息，确保信息的真实性。
              一个问题搭配一个答案，避免一组问答对中同时涉及多个问题。
              如果文本信息不足以回答某个方面，可以在答案中说明 "根据给定信息无法确定"，并尽量提供相关的上下文。
            """)
        .user("""
            Apache Hudi 是一款开源的数据湖管理框架，专注于高效处理大规模数据集的增量更新和实时操作。以下是其核心要点介绍：
            核心功能与特性
            
            增量数据处理：支持插入（Insert）、更新（Update）、删除（Delete）操作，并通过“Upsert”（插入或更新）机制高效处理变更数据，避免重写整个数据集。
            
            事务支持：提供 ACID 事务保证，确保数据一致性和可靠性，支持原子提交和回滚。
            
            存储优化：自动合并小文件并维护文件最佳大小，减少存储碎片化问题，提升查询性能。
            
            多查询类型：
            
            快照查询：获取最新数据状态（对 MoR 表合并基础文件和增量文件）。
            
            增量查询：捕获自某次提交后的变更数据流，适用于增量管道。
            
            读取优化查询：针对 MoR 表展示最新压缩后的数据。
            存储模型
            
            写入时复制（Copy-on-Write, CoW）：数据以列式格式（如 Parquet）存储，每次更新生成新版本文件，适合读多写少的场景。
            
            读取时合并（Merge-on-Read, MoR）：结合列式（Parquet）和行式（Avro）存储，更新写入增量文件后异步合并，适合写频繁的场景。
            适用场景
            
            合规性需求：支持 GDPR、CCPA 等法规要求的数据删除和更新。
            
            实时数据流处理：如 IoT 设备数据、CDC（变更数据捕获）系统，实现近实时分析。
            
            数据湖管理：优化大规模数据集的存储和查询效率，支持时间旅行查询和历史版本回溯。
            技术生态与兼容性
            
            多引擎支持：与 Spark、Flink、Hive、Presto、Trino 等计算和查询引擎集成。
            
            存储格式：基于 Parquet 和 Avro，兼容 Hadoop 生态及云存储（如 Amazon S3）。
            优势对比
            
            相较于同类产品（如 Apache Iceberg、Delta Lake），Hudi 在实时更新和增量处理方面表现突出，尤其适合需要频繁数据变更的场景。其独特的 MoR 模型在写入性能上优于传统批处理方案。
            
            总结
            
            Apache Hudi 通过灵活的存储模型、高效的事务管理和广泛的生态系统集成，成为构建现代化数据湖的核心工具，适用于金融、物联网、实时分析等对数据新鲜度和操作效率要求高的领域。
            """)
        .call()
        .content();
    log.info(content);
  }
}
