lyhzzz 5 hónapja
szülő
commit
551829dcaf
2 módosított fájl, 190 hozzáadás és 0 törlés
  1. 8 0
      pom.xml
  2. 182 0
      src/main/java/com/fdkankan/manage/common/openai.java

+ 8 - 0
pom.xml

@@ -190,6 +190,14 @@
       <artifactId>javax.mail</artifactId>
       <version>1.5.4</version>
     </dependency>
+
+    <!-- https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-openai -->
+
+    <dependency>
+      <groupId>io.github.lambdua</groupId>
+      <artifactId>service</artifactId>
+      <version>0.22.7</version>
+    </dependency>
   </dependencies>
 
   <build>

+ 182 - 0
src/main/java/com/fdkankan/manage/common/openai.java

@@ -0,0 +1,182 @@
+package com.fdkankan.manage.common;
+
+import cn.hutool.core.img.ImgUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import com.theokanning.openai.completion.chat.*;
+import com.theokanning.openai.service.OpenAiService;
+
+import java.awt.*;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Xiewj
+ * @date 2024/10/11
+ */
+public class openai {
+    public static void main(String[] args) throws IOException {
+        gptVision("D:\\abc\\3dcb2408019b82d1b02c05e847504abd.png","http://192.168.9.61:30000/v1/");
+
+    }
+
+    /**
+     * 将给定路径的图像转换为 Base64 编码字符串
+     *
+     * @param imagePath 图像文件的路径
+     * @return Base64 编码的字符串
+     * @throws IOException 如果读取文件时发生错误
+     */
+    public static String convertImageToBase64(String imagePath) throws IOException {
+        File imageFile = new File(imagePath);
+        byte[] fileContent = new byte[(int) imageFile.length()];
+
+        try (FileInputStream fileInputStream = new FileInputStream(imageFile)) {
+            fileInputStream.read(fileContent);
+        }
+
+        return java.util.Base64.getEncoder().encodeToString(fileContent);
+    }
+
+    public static String getSwitchData(String filename, String base64) {
+
+        String str = filename.substring(filename.lastIndexOf(".") + 1);
+        //png
+        String pngPrefix = "data:image/png;base64,";
+        //jpg
+        String jpegPrefix = "data:image/jpeg;base64,";
+        //docx
+        String docxPrefix = "data:application/vnd.openxmlformats-officedocument.wordprocessingml.document ;base64,";
+        //doc
+        String docPrefix = "data:application/msword;base64,";
+        //pdf
+        String pdfPrefix = "data:application/pdf;base64,";
+
+        String filebase64 = null;
+
+        if (StrUtil.isNotBlank(str)) {
+
+            switch (str) {
+                case "png":
+                    filebase64 = pngPrefix.concat(base64);
+                    break;
+                case "jpg":
+                    filebase64 = jpegPrefix.concat(base64);
+                    break;
+                case "docx":
+                    filebase64 = docxPrefix.concat(base64);
+                    break;
+                case "doc":
+                    filebase64 = docPrefix.concat(base64);
+                    break;
+                case "pdf":
+                    filebase64 = pdfPrefix.concat(base64);
+                    break;
+                default:
+                    break;
+            }
+
+        }
+
+        return filebase64;
+    }
+    public static String getSwitchType(String filename) {
+        String str = filename.substring(filename.lastIndexOf(".") + 1);
+
+        String filebase64 = null;
+
+        if (StrUtil.isNotBlank(str)) {
+
+            switch (str) {
+                case "png":
+                    filebase64 = ImgUtil.IMAGE_TYPE_PNG;
+                    break;
+                case "jpg":
+                    filebase64 = ImgUtil.IMAGE_TYPE_JPG;
+                    break;
+                case "jpeg":
+                    filebase64 = ImgUtil.IMAGE_TYPE_JPEG;
+                    break;
+                default:
+                    break;
+            }
+
+        }
+
+        return filebase64;
+    }
+
+    static void gptVision(String imgPath,String httpUrl) throws IOException {
+        OpenAiService openAiService1 = new OpenAiService("", Duration.ofSeconds(120), httpUrl);
+        final List<ChatMessage> messages = new ArrayList<>();
+//        final ChatMessage systemMessage = new SystemMessage("You are a helpful assistant.");
+        //Here, the imageMessage is intended for image recognition
+        Image image = ImgUtil.read(imgPath);
+        Image scale = ImgUtil.scale(image, 2560, 2560);
+        //IMAGE_TYPE_PNG需要根据图片类型自行修改
+        String name = FileUtil.getName(imgPath);
+        String base64 = ImgUtil.toBase64(scale,getSwitchType(name));
+        base64 = getSwitchData(FileUtil.getName(name), base64);
+        String text = "任务指令:根据提供的户型图,识别并描述其结构及房间详情。请按照上北、下南、左西、右东的方向进行定位。\n" +
+                "\n" +
+                "输出格式要求:\n" +
+                "不能使用Markdown(MD)格式。\n" +
+                "结构清晰,易于理解。\n" +
+                "请遵循以下具体步骤:\n" +
+                "\n" +
+                "整体描述:\n" +
+                "1. 概述:首先给出整个户型的结构概述,简要描述户型。对于无法明确识别房间名的房间,可以采用代码形式表示。\n" +
+                "\n" +
+                "详细描述:\n" +
+                "1. 单个房间描述:接下来,针对每个房间单独一段进行描述。每段开头以房间名称开始,接着说明该房间位于图片的相对位置,以及房间内可见的具体家具数量和类型。注意,仅需描述实际识别到的家具,不要使用诸如“等”这样的词汇来泛指其他可能存在的物品。\n" +
+                "\n" +
+                "示例模板:\n" +
+                "整体描述:“这是一个${房间数}室${客厅数}厅${卫生间数}卫的户型。”\n" +
+                "房间描述:“${房间名称}:位于户型图${坐标方位}${房间名}通过${连接方式}与${房间名}相连,放置了${家具数量}个${家具类型}家具...”\n" +
+                "\n" +
+                "注意事项:\n" +
+                "确保输出的整体描述数据和房间数量对应上,室排除厨房数量。\n" +
+                "确保所有信息基于提供的户型图准确无误地提取。\n" +
+                "描述时保持语言简洁明了,直接传达关键信息。\n" +
+                "\n" +
+                "请确保您的描述符合上述要求,并尽可能提供详尽的信息。";
+//            System.out.println(text);
+        final ChatMessage imageMessage = UserMessage.buildImageMessage(text,base64);
+//            final ChatMessage imageMessage = UserMessage.buildImageMessage(text,"https://laser-oss.4dkankan.com/textX/c67c81972c396b4f191156f9ec983226.png");
+
+
+//        messages.add(systemMessage);
+        messages.add(imageMessage);
+        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
+                .model("Qwen2-VL-7B")
+                //.model("qwen2-vl-instruct")
+                .messages(messages)
+                .temperature(0.06)
+                .topP(0.75)
+                .maxTokens(1024)
+                .n(1)
+                .build();
+        ChatCompletionChoice choice = openAiService1.createChatCompletion(chatCompletionRequest).getChoices().get(0);
+        System.out.println(choice.getMessage().getContent());
+    }
+
+    static void simpleChat() {
+        //从环境变量OPENAI_api_key获取api-key
+        OpenAiService service = new OpenAiService(Duration.ofSeconds(30));
+        List<ChatMessage> messages = new ArrayList<>();
+        ChatMessage systemMessage = new SystemMessage("你是一只可爱的猫,会这样说话。");
+        messages.add(systemMessage);
+        ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
+                .model("gpt-4o-mini")
+                .messages(messages)
+                .n(1)
+                .maxTokens(50)
+                .build();
+        ChatCompletionResult chatCompletion = service.createChatCompletion(chatCompletionRequest);
+        System.out.println(chatCompletion.getChoices().get(0).getMessage().getContent());
+    }
+}