写作背景

最近开发了一个基于 DeepSeek API 的 AI 助手项目,核心功能是通过流式接口实现实时对话交互。本文将重点分享后端接口的实现细节和关键技术点。

技术实现

1.接口框架设计

@RestController
public class SeekController {
    private static final Logger logger = LoggerFactory.getLogger(SeekController.class);
    private static final String AI_URL = "https://api.deepseek.com/chat/completions";
    
    @Value("${api.password:}")
    private String apiPassword;
}
  • 采用 Spring Boot 的 @RestController 构建 RESTful 接口

  • API 密钥通过 @Value 注解从配置文件中注入

  • 使用单例模式管理 API 端点地址

 2.流式响应实现:

@GetMapping(value = "/stream")
public void handleSse(String message, HttpServletResponse response) {
    response.setContentType("text/event-stream");
    try (PrintWriter pw = response.getWriter()) {
        getAiResult(pw, message);
        pw.write("data:end\n\n");
    } catch (Exception e) {
        // 异常处理
    }
}

关键技术点:

  • 设置 text/event-stream 响应类型实现 SSE 协议

  • 使用 PrintWriter 保持长连接

  • 手动发送结束标记 data:end

3. DeepSeek API 调用

请求构建:

Map<String, Object> params = new HashMap<>();
params.put("model", "deepseek-chat");
params.put("stream", true);

List<Map> messages = new ArrayList<>();
messages.add(messageMap);
params.put("messages", messages);
  • 必须设置 stream: true 开启流式响应

  • 消息体需包含 role 和 content 字段

  • 使用 OkHttp 的 SSE 支持实现流式接收

4. 事件处理机制

new EventSourceListener() {
    @Override
    public void onEvent(EventSource eventSource, String id, String type, String data) {
        if (!DONE.equals(data)) {
            String content = getContent(data);
            pw.write("data:" + jsonContent + "\n\n");
            pw.flush();
        }
    }
    
    @Override
    public void onFailure(...) {
        // 错误处理
    }
}
  • 通过 CountDownLatch 实现线程同步

  • 实时处理每个事件块并转发给客户端

  • 完善的错误处理机制

关键问题解决:

连接超时问题

  • 配置 OkHttpClient 时设置了 60 秒超时

new OkHttpClient.Builder()
    .connectTimeout(timeout, TimeUnit.SECONDS)
    .readTimeout(timeout, TimeUnit.SECONDS)
    .build();

流式中断处理

  • 通过 onClosed 和 onFailure 回调确保资源释放

  • 使用 eventLatch.await() 保持连接

数据解析

private static String getContent(String data) {
    AiResult aiResult = JsonUtils.convertJson2Obj(data, AiResult.class);
    return aiResult.getChoices().get(0).getDelta().getContent();
}

性能优化:

  1. 使用对象池管理 OkHttpClient 实例

  2. 采用异步处理提升吞吐量

  3. 合理设置超时时间避免资源占用

总结:

通过本次实践,成功实现了:

  • 稳定的流式 API 调用

  • 低延迟的实时交互

  • 健壮的错误处理机制

后续计划

  • 增加对话上下文管理

  • 实现多模态支持

  • 优化异常处理机制

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐