美文网首页
2023-08-21 java接入 hugging face 私

2023-08-21 java接入 hugging face 私

作者: 江江江123 | 来源:发表于2023-08-20 21:15 被阅读0次

为什么接入私有模型:

1.openai 发送警告,要求调用的gpt接口前先调用验证违规接口验证一下再请求
为了不影响用户的使用,只好接入私有模型,如果验证失败就走自己的模型。。

任务点:

  1. 基于llama的再训练(只要有数据,训练教程有很多)
  2. 部署
    2.1 基于huggingface自有服务部署
    inference-endpoints文档
    操作文档
    2.2 基于docker部署
    github文档
  3. api调用
    text-generation-inference文档
    swagger文档

问题点:

用python可以快速解决很多问题,但是用Java要稍微花点时间

  1. 数据导出
    由于导出的数据是一个量很大的json文件,用fastjson一次导出直接oom。。选用gson解决了问题
   private void exportJson(List<Object> resultVos, String path) {
        try {
            Gson gson = new GsonBuilder()
                    .setPrettyPrinting()
                    .disableHtmlEscaping()
                    .create();
            JsonWriter writer = new JsonWriter(new FileWriter(path));
            JsonElement jsonElement = gson.toJsonTree(resultVos);
            gson.toJson(jsonElement, writer);
            writer.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  1. 关于参数max_new_tokens
    基于inference-endpoints部署模型时


    1692622373021.png

必须满足:max_new_tokens <= max_number_of_tokens - max_input_length

  1. 关于参数inputs
    openai gpt接口传入的是[message]参数,里面message包含role和content参数,转化inputs代码:
public class LlamaUtils {
    private final static String B_INST = "[INST]";
    private final static String E_INST = "[/INST]";
    private final static String B_SYS = "<<SYS>>\\n";
    private final static String E_SYS = "\\n<</SYS>>\\n\\n";
    //sep="</s>"
    public final static String sep = "</s>";

    public static String messageToInput(List<GptMessage> messages) {
        StringBuilder builder = new StringBuilder();
        messages.forEach(message -> {
            if (ChatMessageRole.SYSTEM.value().equals(message.getRole())) {
                builder.append(B_SYS);
                builder.append(message.getContent());
                builder.append(E_SYS);
                builder.append(sep);
            } else if (ChatMessageRole.USER.value().equals(message.getRole())) {
                if (StringUtils.isNotEmpty(message.getContent())) {
                    builder.append(B_INST);
                    builder.append(message.getContent().trim());
                    builder.append(E_INST);
                }
            } else {
                builder.append(message.getContent());
                builder.append(sep);
            }
        });
        return builder.toString();
    }
}

附录

java接口实体

@Data
public class Llama2Request {
    private String inputs;
    private Parameters parameters;
    private Boolean stream;

    @Data
    public static class Parameters {
        private Double temperature;
        private Integer max_new_tokens;
        private Integer max_time;
        private Boolean return_full_text;
        private List<String> stop_sequences;
    }
}
//注:返回的列表 使用jsonArray转换
@Data
@NoArgsConstructor
public class LlamaTextGenResponse {


    /**
     * generated_text : test*
     */

    public String generated_text;
}

@Data
@NoArgsConstructor
public class LlamaTextGenSteamResponse {


    /**
     * details : {"finish_reason":"length","generated_tokens":1,"seed":42}
     * generated_text : test
     * token : {"id":0,"logprob":-0.34,"special":false,"text":"test"}
     */

    public Details details;
    public String generated_text;
    public Token token;

    @NoArgsConstructor
    @Data
    public static class Details {
        /**
         * finish_reason : length
         * generated_tokens : 1
         * seed : 42
         */

        public String finish_reason;
        public int generated_tokens;
        public int seed;
    }

    @NoArgsConstructor
    @Data
    public static class Token {
        /**
         * id : 0
         * logprob : -0.34
         * special : false
         * text : test
         */

        public int id;
        public double logprob;
        public boolean special;
        public String text;
    }
}

相关文章

网友评论

      本文标题:2023-08-21 java接入 hugging face 私

      本文链接:https://www.haomeiwen.com/subject/lmxemdtx.html