FEL 响应式大模型编程范式:从零接入 DeepSeek 的完整实战指南
人工智能大模型AI 应用后端AI AgentRAG流程编排微服务【免费下载链接】fit-frameworkFIT: 企业级AI开发框架提供多语言函数引擎FIT、流式编排引擎WaterFlow及Java生态的LangChain替代方案FEL。原生/Spring双模运行支持插件热插拔与智能聚散部署无缝统一大模型与业务系统。项目地址https://gitcode.com/ModelEngine/fit-framework点击查看免费下载导读本文以 FIT 开源框架中为大模型量身定制的 Java 响应式编程范式 FEL 为主线从环境准备、依赖引入、application.yml配置到普通调用与流式调用的完整代码实现带你一步步接入 DeepSeek以及任何兼容 OpenAI API 的大模型。读完本文你将掌握 FEL 聊天模型ChatModel的核心用法、ChatOption全部参数语义、底层 OpenAI 适配器的实现原理并了解基于AiFlows的智能应用编排方式为后续构建 RAG、Agent 等复杂应用打下基础。什么是 FEL为 Java 量身定制的响应式大模型编程范式FELFull-stack Easy-coded LLM framework是 FIT 框架中面向 Java 生态的大模型应用开发套件。如果你熟悉 LangChain可以把 FEL 看作是 Java 版本的 LangChain它围绕大模型应用开发中反复出现的共性需求——模型接入、提示词模板、RAG 检索、记忆、输出解析、Agent——沉淀出一套响应式、可编排的编程范式。与大多数回调式或阻塞式的大模型 SDK 不同FEL 的每一次模型调用都返回一个响应式流对象ChoirT位于 Choir.java表示拥有 0 到 N 个数据的发布者调用方既可以阻塞式地取出最终结果也可以让数据像流水一样持续流转天然支撑流式输出、多轮会话与复杂流程编排。本篇文章将从一个最小可运行的示例入手接入当下热门的 DeepSeek 模型完成普通调用与流式调用两种体验。快速上手在 FIT 工程中接入 DeepSeek1. 准备环境与获取示例获取 FIT-Framework 项目代码参照项目中的入门指南部署 FIT 环境FIT 的启动器、IoC 容器与 Web 服务能力是 FEL 示例的运行底座。本文配套的完整可运行示例位于 examples/fel-example/01-model示例工程通过DemoApplication.main调用FitStarter.start启动见 DemoApplication.java。FEL 模块不仅支持 DeepSeek还支持任何符合 OpenAI API 标准的模型服务并在此基础上提供丰富的工具与大模型操作原语。2. 在 pom.xml 中加入 FEL 依赖在示例工程的 pom.xml 中需要引入以下五类依赖FIT 启动器、Web 插件启动器、HTTP 客户端、FEL 核心包以及 OpenAI 模型插件dependencies dependency groupIdorg.fitframework/groupId artifactIdfit-starter/artifactId version${fit.version}/version /dependency dependency groupIdorg.fitframework/groupId artifactIdfit-plugins-starter-web/artifactId version${fit.version}/version /dependency dependency groupIdorg.fitframework.plugin/groupId artifactIdfit-http-client-okhttp/artifactId version${fit.version}/version /dependency dependency groupIdorg.fitframework.fel/groupId artifactIdfel-core/artifactId version${fel.version}/version /dependency dependency groupIdorg.fitframework.fel/groupId artifactIdfel-model-openai-plugin/artifactId version${fel.version}/version /dependency /dependencies其中fel-model-openai-plugin是 OpenAI 协议模型服务的适配实现对应 fel-community 模块下的 model-openai正是它让 FEL 能够对接 DeepSeek 以及硅基流动等兼容 OpenAI API 的平台。3. 在 application.yml 中配置 DeepSeek 接入信息在示例工程的resources/application.yml中配置 API 密钥、API 地址与模型名称fel: openai: api-base: https://api.siliconflow.cn/v1 api-key: your-api-key example: model: deepseek-ai/DeepSeek-R1配置项说明fel.openai.api-base大模型服务地址。示例使用的是硅基流动SiliconFlow平台地址该平台提供一定免费额度注册账号后创建API 密钥即可使用如果你直接使用 OpenAI 官方服务可替换为https://api.openai.com/v1/。fel.openai.api-key你的 API 密钥将占位值your-api-key替换为真实密钥即可。example.model要调用的模型名称示例中为硅基流动平台上的deepseek-ai/DeepSeek-R1。从源码角度看这些配置由 OpenAiConfig.java 通过AcceptConfigValues(fel.openai)注解接收其默认值为https://api.openai.com/v1/同时支持自定义连接超时connectTimeout默认 30000ms与读取超时readTimeout默认 30000ms可用于调优请求慢场景下的超时表现。4. 编写接入代码普通调用与流式调用示例控制器 ChatModelExampleController.java 展示了 FEL 最基础的两种大模型调用方式。普通调用一次性返回完整结果Component RequestMapping(/ai/example) public class ChatModelExampleController { private final ChatModel chatModel; Value(${example.model}) private String modelName; public ChatModelExampleController(ChatModel chatModel) { this.chatModel chatModel; } GetMapping(/chat) public ChatMessage chat(RequestParam(query) String query) { ChatOption option ChatOption.custom().model(this.modelName).stream(false).build(); return this.chatModel.generate(ChatMessages.from(new HumanMessage(query)), option).first().block().get(); } }流式调用以 SSE 流形式逐步返回结果GetMapping(/chat-stream) public ChoirChatMessage chatStream(RequestParam(query) String query) { ChatOption option ChatOption.custom().model(this.modelName).stream(true).build(); return this.chatModel.generate(ChatMessages.from(new HumanMessage(query)), option); }理解这段代码的三个关键点ChatOption指定调用参数通过ChatOption.custom()...build()构建其中.model(...)指定模型名称.stream(true)表示以流式方式获取结果见 ChatOption.java 的构建器入口。generate发起一次模型调用返回结果是一个响应式流对象ChoirChatMessage。普通调用时通过.first().block().get()阻塞取回第一条消息流式调用时直接将Choir返回FIT 框架会自动以 SSE 格式输出。ChatMessages.from(...)构造提示词ChatMessages是Prompt接口的默认实现见 ChatMessages.javaHumanMessage则封装用户输入的文本消息支持携带多媒体Media列表见 HumanMessage.java。ChatModel接口本身非常简洁——接收提示词与参数返回聊天消息流根据stream参数决定返回一条还是多条消息见 ChatModel.javapublic interface ChatModel { ChoirChatMessage generate(Prompt prompt, ChatOption chatOption); }5. 启动程序并验证配置完成后通过 IDEA 直接启动DemoApplication。当控制台出现如下日志时表示启动成功Start netty http server successfully.体验普通调用在浏览器输入示例请求地址http://localhost:8080/ai/example/chat?query你好DeepSeek可以看到类似如下的 JSON 响应toolCalls为空表示本次未触发工具调用{ content: think\n\n/think\n\n你好我是DeepSeek-R1一个由深度求索公司开发的智能助手我会尽我所能为你提供帮助。请问有什么可以为你服务的, toolCalls: [] }注意响应中的think与/think标签DeepSeek-R1 这类推理模型会先输出思考过程再输出正式回答。FEL 的 OpenAI 适配器在 OpenAiModel.java 中专门对reasoning_content做了适配非流式场景下将推理内容与最终回答拼装为think{0}/think{1}格式返回。体验流式调用在浏览器输入示例请求地址http://localhost:8080/ai/example/chat-stream?query你好DeepSeek浏览器会收到类似如下的 SSE 流式数据内容逐段到达data:{content:think,toolCalls:[]} data:{content:\n\n,toolCalls:[]} data:{content:/think,toolCalls:[]} data:{content:\n\n,toolCalls:[]} data:{content:你好,toolCalls:[]} data:{content:,toolCalls:[]} data:{content:我是,toolCalls:[]} data:{content:Deep,toolCalls:[]} data:{content:Se,toolCalls:[]} data:{content:ek,toolCalls:[]} ...流式模式下FEL 的 OpenAI 适配器会读取服务端返回的每个 chunk过滤掉结束标记[DONE]逐条反序列化为聊天消息后以响应式流逐段推送见 OpenAiModel.java对于推理模型还会在第一个reasoning_contentchunk 前插入think标签、在第一个正式内容 chunk 前插入/think标签见 OpenAiModel.java保证思考过程与回答的边界清晰可读。深入解析 ChatOption完整的模型调用参数ChatOption是 FEL 中定义模型调用参数的统一入口见 ChatOption.java。除示例中已使用的model与stream外它还提供了以下常用参数参数类型说明modelString要调用的模型名称streamBoolean是否使用流式接口true为流式false为普通接口baseUrlString大模型服务端地址可覆盖配置文件中的fel.openai.api-baseapiKeyString模型接口密钥可覆盖配置文件中的fel.openai.api-keymaxTokensInteger生成文本的最大长度frequencyPenaltyDouble频率惩罚系数取值范围-2.0 ~ 2.0正值惩罚已频繁出现的词以降低重复抑制重复的合理取值约为0.1 ~ 1最大可到2可能影响输出质量负值则会增加重复可能性presencePenaltyDouble出现惩罚系数取值范围-2.0 ~ 2.0正值鼓励模型谈论新主题默认0。与frequencyPenalty的区别在于前者惩罚随 token 出现次数增加而不断加强后者只区分是否出现过stopListString停止字符串列表模型输出中出现其中任一字符串即停止生成temperatureDouble采样温度取值范围0.0 ~ 2.0值越高输出越随机多样值越低输出越确定可预测topPDouble采样率取值范围0.0 ~ 1.0例如0.1表示只考虑概率质量前 10% 的 token与temperature不建议同时设置toolsListToolInfo模型可以使用的工具列表用于支持 Function Calling / 工具调用secureConfigSecureConfig调用大模型服务的 HTTPS 安全配置extensionsMapString, Object扩展信息用于透传额外参数以baseUrl与apiKey为例在 OpenAiModel.java 的generate实现中若ChatOption显式指定了baseUrl/apiKey则优先使用选项中的值否则回退到配置文件中OpenAiConfig提供的默认值StringUtils.blankIf(chatOption.apiKey(), this.defaultApiKey)最终通过Authorization: Bearer key请求头发送密钥见HttpUtils.setBearerAuth。底层原理FEL 如何与 OpenAI 兼容服务交互FEL 的模型接入遵循接口定义 插件适配的架构核心层只定义抽象接口具体模型服务由插件实现。接口层ChatModel、ChatOption、Prompt、ChatMessage、MessageType等全部位于 fel-core 模块。其中ChatMessage定义了消息的type()、text()、medias()、toolCalls()等能力见 ChatMessage.javaMessageType枚举覆盖SYSTEM、HUMAN、AI、TOOL四种角色见 MessageType.java。适配层OpenAiModel.java 是一个Component同时实现了EmbedModel、ChatModel、ImageModel、RerankModel四个接口。聊天请求通过 FIT 的HttpClassicClient发送到{baseUrl}/chat/completions端点见 OpenAiApi.java请求体为OpenAiChatCompletionRequest响应体反序列化为OpenAiChatCompletionResponse。流式处理streamtrue时通过request.exchangeStream(String.class)逐行读取 SSE 数据过滤[DONE]标记后逐条反序列化并映射为ChoirChatMessage输出。因此只要目标平台DeepSeek、Qwen、硅基流动等提供兼容 OpenAI Chat Completions 协议的接口都可以通过fel-model-openai-plugin无缝接入这也是一个适配器处处可接入的设计价值。进阶视野用 AiFlows 编排完整的智能应用普通调用只是 FEL 的起点。FEL 真正的核心能力在于直观的编排方式——通过AiFlows以链式 API 组装检索 → 生成 → 格式化的完整 AI 流程。例如一个包含知识库检索与大模型的智能助手编排代码如下AiProcessFlowString, String smartAssistantFlow AiFlows.Stringcreate() .map(query - Tip.from(query, query)) // 将用户输入转换为内部格式 .retrieve(new DefaultVectorRetriever(vectorStore)) // 检索相关信息 .generate(new ChatFlowModel(chatModel, chatOption)) // 调用大模型生成回答 .format(new JsonOutputParser(serializer, Response.class)) // 格式化输出 .close();从源码看AiFlows.create()会创建一个水流WaterFlow流程的头结点并包装为AiProcessFlow见 AiFlows.javaAiProcessFlow在底层AiFlow之上增加了流程间数据流转能力并对外提供对话语义见 AiProcessFlow.java。其中每一步操作都是一个原语operatorretrieveRAG 检索。DefaultVectorRetriever封装了VectorStore.search(query, searchOption)见 DefaultVectorRetriever.java从向量库中提取相关信息。generate大模型接入。ChatFlowModel把ChatModel与ChatOption包装为流程内可调用的模型节点见 ChatFlowModel.java调用时仍返回ChoirChatMessage响应式流。format输出解析。OutputParserO接口同时承担给出格式化指令FormatProvider.instruction()与把字符串解析为对象ParserString, O两个职责见 OutputParser.javaJsonOutputParser即其 JSON 实现。FEL 提供的大模型操作原语FEL 框架内置了丰富的大模型操作原语覆盖智能应用的常见场景RAG 检索retrieve从海量数据中快速提取相关信息提示词模板prompt通过预定义模板快速生成结构化输入大模型接入generate无缝接入 DeepSeek 等大模型实现智能对话与生成记忆memory支持多轮对话记忆提升对话体验Agentdelegate通过智能体实现复杂任务的分解与执行。这些原语之上还有通用的流操作原语配合 FIT 框架基于接口设计的核心思想多种原语操作均基于接口抽象如果你有自定义功能可以轻松集成自定义原语打造专属智能应用。相关使用细节可继续阅读 FEL 指导手册中的 聊天模型使用 等章节。小结本文从 FEL 的定位讲起完整演示了在 FIT 工程中接入 DeepSeek 的五个步骤准备环境、引入依赖、配置application.yml、编写普通/流式调用代码、启动验证随后深入ChatOption全部参数语义与OpenAiModel底层实现最后展望了基于AiFlows的智能应用编排范式。从一次最简单的模型调用出发你已经掌握了 FEL 响应式编程范式的核心脉络——后续文章将围绕 RAG、Agent、记忆等原语继续展开这一为大模型量身定制的响应式编程范式的更多能力。赞分享人工智能大模型AI 应用后端AI AgentRAG流程编排微服务【免费下载链接】fit-frameworkFIT: 企业级AI开发框架提供多语言函数引擎FIT、流式编排引擎WaterFlow及Java生态的LangChain替代方案FEL。原生/Spring双模运行支持插件热插拔与智能聚散部署无缝统一大模型与业务系统。项目地址https://gitcode.com/ModelEngine/fit-framework点击查看免费下载相关推荐Spring WebFlux响应式编程深度探索Spring WebFlux响应式编程深度探索 本文深入探讨了Spring WebFlux响应式编程框架的核心架构与实现原理。首先介绍了响应式编程模型和Reac后端Web框架依赖注入Oxygine-Framework渲染原理深度剖析从像素到屏幕的完整流程Oxygine Framework渲染原理深度剖析从像素到屏幕的完整流程 Oxygine Framework是一款强大的C 2D游戏引擎支持iOS、An游戏开发图形学UFO 接入 DeepSeek 模型完整配置指南HOST_AGENT 与 APP_AGENT 的纯文本模式实战UFO 接入 DeepSeek 模型完整配置指南HOST_AGENT 与 APP_AGENT 的纯文本模式实战 本文以官方文档《DeepSeek Model》人工智能AI Agent自主智能体GUI 自动化Agent 编排多智能体RAG上一篇终极Draw.io ECE自定义形状库使用指南快速上手电子工程绘图下一篇TotalSegmentator快速入门医学图像分割的完整安装配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考