介绍
一个包含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(
-