Administrator
2025-08-22 576c842301a9fabd7719fdb3539806bf650ae31d
feat(ai): 新增产品知识点列表接口并优化 AI 思维链输出

- 在 AiProductService 中添加 pointInfoList 方法,用于获取产品知识点列表
- 在 AiProductServiceImpl 中实现 pointInfoList 方法- 在 ApiProductController 中添加 pointInfoList 接口
- 在 AiServiceImpl 中增加对深度思考内容的处理,打印模型输出的思维链
- 在 ApiMemberTalkStreamVo 中添加 reasoningContent 字段,用于存储思维链内容
5 files modified
39 ■■■■■ changed files
src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkStreamVo.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/AiProductService.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java 12 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/ai/controller/product/ApiProductController.java
@@ -4,6 +4,7 @@
import cc.mrbird.febs.ai.req.product.ApiProductPageDto;
import cc.mrbird.febs.ai.res.product.ApiProductInfoVo;
import cc.mrbird.febs.ai.res.product.ApiProductVo;
import cc.mrbird.febs.ai.res.productPoint.ApiProductPointVo;
import cc.mrbird.febs.ai.service.AiProductService;
import cc.mrbird.febs.common.entity.FebsResponse;
import io.swagger.annotations.Api;
@@ -51,4 +52,14 @@
        return aiProductService.productInfo(dto);
    }
    @ApiOperation(value = "知识点列表", notes = "知识点列表")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiProductPointVo.class)
    })
    @PostMapping(value = "/pointInfoList")
    public FebsResponse pointInfoList(@RequestBody @Validated ApiProductInfoDto dto) {
        return aiProductService.pointInfoList(dto);
    }
}
src/main/java/cc/mrbird/febs/ai/res/memberTalk/ApiMemberTalkStreamVo.java
@@ -13,4 +13,7 @@
    @ApiModelProperty(value = "消息")
    private String content;
    @ApiModelProperty(value = "思考")
    private String reasoningContent;
}
src/main/java/cc/mrbird/febs/ai/service/AiProductService.java
@@ -26,4 +26,6 @@
    FebsResponse productList(ApiProductPageDto dto);
    FebsResponse productInfo(ApiProductInfoDto dto);
    FebsResponse pointInfoList(ApiProductInfoDto dto);
}
src/main/java/cc/mrbird/febs/ai/service/impl/AiProductServiceImpl.java
@@ -7,6 +7,7 @@
import cc.mrbird.febs.ai.req.product.ApiProductPageDto;
import cc.mrbird.febs.ai.res.product.ApiProductInfoVo;
import cc.mrbird.febs.ai.res.product.ApiProductVo;
import cc.mrbird.febs.ai.res.productPoint.ApiProductPointVo;
import cc.mrbird.febs.ai.service.*;
import cc.mrbird.febs.common.entity.FebsResponse;
import cn.hutool.core.util.StrUtil;
@@ -15,6 +16,8 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * AI产品表 Service实现类
@@ -80,4 +83,12 @@
        vo.setProductPointList(aiProductPointService.listByProductId(id));
        return new FebsResponse().success().data(vo);
    }
    @Override
    public FebsResponse pointInfoList(ApiProductInfoDto dto) {
        String id = dto.getId();
        AiProduct entity = this.getById(id);
        List<ApiProductPointVo> apiProductPointVos = aiProductPointService.listByProductId(id);
        return new FebsResponse().success().data(apiProductPointVos);
    }
}
src/main/java/cc/mrbird/febs/ai/service/impl/AiServiceImpl.java
@@ -379,6 +379,7 @@
                .model("ep-20250805124033-lhxbf")
                .messages(messages)
                .stream(true)
                .thinking(new ChatCompletionRequest.ChatCompletionRequestThinking("enabled"))
                .temperature(0.7)
                .topP(0.9)
                .maxTokens(2048)
@@ -396,11 +397,18 @@
                        return new FebsResponse().success().data("END");
                    }
                    Object contentObj = choice.getMessage().getContent();
                    String content = contentObj == null ? "" : contentObj.toString();
                    ApiMemberTalkStreamVo apiMemberTalkStreamVo = new ApiMemberTalkStreamVo();
                    // 判断是否触发深度思考,触发则打印模型输出的思维链内容
                    ChatMessage message = choice.getMessage();
                    if (message.getReasoningContent()!= null &&!message.getReasoningContent().isEmpty()) {
                        apiMemberTalkStreamVo.setReasoningContent(message.getReasoningContent());
                        System.out.print(message.getReasoningContent());
                    }
                    String content = message.getContent() == null ? "" : message.getContent().toString();
                    apiMemberTalkStreamVo.setContent(content);
                    System.out.print(content);
                    return new FebsResponse().success().data(apiMemberTalkStreamVo);
                })
                .onErrorResume(throwable -> {