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(
### 使用 LangChain4J 实现 RAG 在构建基于检索增强生成(RAG)的服务时,LangChain 提供了强大的框架来集成不同的组件。对于希望使用 Java 生态系统的开发者来说,`langchain4j` 是一个合适的选择。 为了实现带有 Solr 作为检索器的 RAG 应用程序,在 `langchain4j` 中定义服务器凭证以及配置嵌入模型的方式如下: #### 定义 Server Credentials 和 Embedding Model 配置 通过创建自定义的 `SolrVectorStoreConfig` 类可以管理 Solr 连接参数,包括认证信息。这允许应用程序安全地访问远程部署的 Solr 实例[^1]。 ```java public class CustomSolrConfig extends SolrVectorStoreConfig { private String username; private String password; public CustomSolrConfig(String solrUrl, String collectionName, String username, String password) { super(solrUrl, collectionName); this.username = username; this.password = password; } @Override protected void configure(HttpClientBuilder builder) { CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials( AuthScope.ANY, new UsernamePasswordCredentials(username, password)); builder.setDefaultCredentialsProvider(credsProvider); } } ``` 接着,当初始化向量存储库实例时传入上述配置对象即可完成设置。 关于已经运行于服务器上的嵌入模型,可以通过 REST API 或者 gRPC 接口与其交互。假设该服务提供了一个 HTTP 端点用于获取文档表示,则可以在应用逻辑中调用此接口并处理返回的数据以适应下游任务的需求[^2]。 ```java // 假设有一个方法可以从给定URL获得Embeddings List<Double> getDocumentEmbeddingFromServer(String documentText); // 将其应用于实际场景中的代码片段可能看起来像这样: CustomSolrConfig config = new CustomSolrConfig("http://solr.example.com", "myCollection", "admin", "secret"); SolrVectorStore store = new SolrVectorStore(config); String queryText = "example question"; List<Double> embeddings = getDocumentEmbeddingFromServer(queryText); // 获取查询文本对应的embedding store.add(embeddings, metadata); // 存储到索引中以便后续检索 ``` 以上展示了如何利用现有的嵌入模型服务于新的数据条目,并将其加入到由 Solr 支持的知识库内。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾露z

谢谢侬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值