20 lines
1.6 KiB
Markdown
20 lines
1.6 KiB
Markdown
# Evidence
|
||
|
||
## Evidence-driven 结论
|
||
|
||
| 结论 | 证据来源 | 验证方式 |
|
||
|---|---|---|
|
||
| `ReactAgent.builder().model()` 接受 `ChatModel` 接口 | javap 反编译 Agent Framework | 静态验证 |
|
||
| `ChatModel` 应通过 Spring Boot 自动注入 | DashScope/DeepSeek/OpenAI starter 均自动注册 Bean | 脚本验证:`ChatAndEmbeddingSmokeTest` |
|
||
| `RagService` 可用 `ChatModel.stream()` 替代 `Generation` | Spring AI `stream(Prompt)` 返回 `Flux<ChatResponse>` | 代码审查 |
|
||
| `EmbeddingModel` 支持批量调用 | `EmbeddingModel.embed(List<String>)` 返回 `List<float[]>` | 脚本验证:`FullPipelineSmokeTest#embeddingBatchWorks` |
|
||
| `DeepSeekChatModel` 兼容 DeepSeek V4 Flash | Spring AI 1.1.7 原生 `spring-ai-starter-model-deepseek` | 脚本验证:`FullPipelineSmokeTest#chatDeepSeekWorks` |
|
||
| BGE-M3 via SiliconFlow 返回 1024 维向量 | `OpenAiEmbeddingModel.embed()` → 1024-dim `float[]` | 脚本验证:`FullPipelineSmokeTest#embeddingBgeM3Works` |
|
||
| `OpenAiChatModel` 不兼容 DeepSeek V4 | curl 200, Spring AI 400 `Model does not exist` | 实验对比:curl vs Java, 3 次重试均失败 |
|
||
|
||
## 技术决策依据
|
||
|
||
- **用原生 DeepSeek starter 而非 OpenAI 兼容模式**:Spring AI 1.1.0 `OpenAiChatModel` 的请求体含 DeepSeek V4 不识别的字段,原生 `DeepSeekChatModel` 直接适配
|
||
- **SiliconFlow Embedding 独立配置**:Chat 和 Embedding 不同厂商、不同 base-url,Spring AI auto-config 不支持单前缀拆两地址,需手动 `OpenAiApi`
|
||
- **yml 驱动路由**:`model-routing.chat/embedding` 关键字 → Bean 名/类名匹配 → @Primary,比硬编码 @Qualifier 更灵活
|