最近在做毕业设计,是SpringBoot+Vue的论坛系统,老师说最好加上一点创新点,思考了一下决定加一个RAG构建的智能问答助手。这里我们使用LLM+Langchain的方式对大模型进行微调,采用通义千问的API来充当LLM的部分,无需显卡,非常适合配置一般的电脑,那么如何最简单的在SpringBoot里集成呢?
首先下载Langchain-chatchat的整合包
为了减少时间成本,这里直接参照B站大神分享的整合包:
无需显卡Langchain-chatchat接入通义千问大模型
按照视频里的操作下载完成之后申请通义千问API的key并配置完毕就可以进行下一步了
在SpringBoot里集成
首先启动整合包
启动完成之后看见如下界面,红框部分是整合包的API文档
进入API文档地址:
找到这个与知识库对话的API,接下来将他封装进SpringBoot,这里我们使用Spring WebClient构造请求体并访问。
首先在pom文件里添加WebClient相关:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
Hutool工具类:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
然后在SpringBoot里新建一个工具类:
@Component
@Slf4j
public class LangChainSDK {
private final WebClient webClient;
public LangChainSDK() {
// 初始化 WebClient 配置
this.webClient = WebClient.builder()
.baseUrl("http://127.0.0.1:7861") // 设置基础URL
.build();
}
public Mono<String> chatWithAI(String content) {
try {
Map<String, Object> body = new HashMap<>();
body.put("query", content); //问题内容
body.put("knowledge_base_name", "yourModelName"); //模型名字
body.put("top_k", 3);
body.put("score_threshold", 2); //0-2 模型匹配值
body.put("stream", false);
body.put("model_name", "qwen-api"); //模型名字
body.put("temperature", 0.7); //默认
body.put("max_tokens", 0);
body.put("prompt_name", "default");
return webClient.post()
.uri("/chat/knowledge_base_chat")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(body)
.retrieve()
.bodyToMono(String.class)
.map(response -> {
//现在返回值的类型是String类型的JSON----data:{answer:"xxx"}
String jsonStr = response.replace("data:", "");
//转成真JSON
JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
//只要answer
return jsonObject.getStr("answer");
})
.doOnError(error -> {
log.error("LangChain Chat Error: {}", error.getMessage());
});
} catch (Exception e) {
log.error("Exception occurred: {}", e.getMessage());
throw new ServiceException(ResponseEnum.LANG_CHAIN_CHAT_ERROR);
}
}
}
body.put("knowledge_base_name", "yourModelName"); //模型名字
这里面的模型名字替换成你自己的
throw new ServiceException(ResponseEnum.LANG_CHAIN_CHAT_ERROR);
这里是我自己封装的全局异常类,可以替换成你们自己的,或者直接throw一个RunTimeException
调用
接下来就可以调用了,我在Service层调用如下:
@Service
public class AIServiceImpl implements AIService {
@Resource
private LangChainSDK langChainSDK;
@Override
public String chatWithAI(String content) {
return langChainSDK.chatWithAI(content).block();
}
}
content
是你的想问的问题
在controller里调用:
@RestController
@RequestMapping("/ai")
@Api(tags = "AI助手模块")
public class AIController {
@Resource
private AIService aiService;
@PostMapping("/chat")
@ApiOperation(value = "和本地知识库对话")
public R<?> chatWithAI(@RequestParam String content) {
return new R<>().success(ResponseEnum.SUCCESS, aiService.chatWithAI(content));
}
}
运行结果
ApiFox调试结果:
成功整合