LangChain4j实战项目 - RAG、Tool、Agent

介绍

一个包含Agent + Tool + RAG的一个简易机器人项目,后面可能会慢慢扩展其他功能,比如知识图谱等(目前想不到LangChain4j还能做什么功能= =)。本人只是一个刚接触AI不久的学生,代码写的烂、有错误、可优化的地方,望指出,感谢!

大模型

大模型采用智谱AI,构建代码:

public static ChatLanguageModel buildChatLanguageModel(String model,double temperature){
   
    return ZhipuAiChatModel.builder()
            .apiKey(KEY)
            .model(model)
            .connectTimeout(TIME_OUT)
            .callTimeout(TIME_OUT)
            .readTimeout(TIME_OUT)
            .writeTimeout(TIME_OUT)
            .baseUrl(BASE_URL)
            .temperature(temperature)
            .logResponses(true)
            .logRequests(true)
            .maxRetries(1)
            .build();
}

public static ZhipuAiStreamingChatModel buildStreamingChatModel(String model,double temperature){
   
    return ZhipuAiStreamingChatModel.builder()
            .apiKey(KEY)
            .model(model)
            .connectTimeout(TIME_OUT)
            .callTimeout(TIME_OUT)
            .readTimeout(TIME_OUT)
            .writeTimeout(TIME_OUT)
            .baseUrl(BASE_URL)
            .temperature(temperature)
            .logResponses(true)
            .logRequests(true)
            .build();
}

public static ZhipuAiImageModel buildImageModel(String model){
   
    return ZhipuAiImageModel.builder()
            .apiKey(KEY)
            .model(model)
            .connectTimeout(TIME_OUT)
            .callTimeout(TIME_OUT)
            .readTimeout(TIME_OUT)
            .writeTimeout(TIME_OUT)
            .baseUrl(BASE_URL)
            .logResponses(true)
            .logRequests(true)
            .maxRetries(1)
            .build();
}

Agent

  • 前导:

    Agent的目的直观来说是拆分用户Prompt,从而引导LLM只访问和调用需要的Tool,但其实Tool自己就能做到判断是否调用自身的功能。所以我们进而引出Agent的优势:自顶向上,即我们可以先将用户Prompt作为一个整体,然后直接为其划分类型,而不是把它传递给每个Tool来判断,实现O(n)-> O(1)且让Tool专注于自己的功能实现。

  • 实现:

    • 首先创建CustomizeServices接口,用来切分用户问题

      public interface CustomizeServices {
             
          @SystemMessage(
                  """
                  你是一个精通拆分问题的大师,请你对用户问题依据问题类型进行拆分。\\n
                  对方的输入格式:\\n
                  用户问题:xxx
                  你的输出格式(不要有多余的文字,只按照我的输出格式进行输出即可):\\n
                  [问题一的内容]\\n
                  [问题二的内容]\\n
                  ...\\n
                  [问题n的内容]\\n
                  比如说:\\n
                  用户问题:你好!1+1等于多少?请你随机为我生成一张随机图片,日式动漫风格。\\n
                  将其拆分为:\\n
                  [你好!] \\n
                  [1+1等于多少?] \\n
                  [请你随机为我生成一张随机图片,日式动漫风格]\\n
                  """)
          @UserMessage("用户问题:{
             {prompt}}")
          String splitPrompt(@V("prompt") String prompt);
      }
      
    • 创建枚举类

      @AllArgsConstructor
      @NoArgsConstructor
      @Getter
      public enum ContentCategoryEnum {
             
          @Description("日常闲聊")
          CHAT(1,"闲聊"),
          @Description(

你可能感兴趣的:(AI,java,ai,人工智能,langchain)