当前位置: 首页 > wzjs >正文

临沂营销型网站建设视频网站是怎么做权限管理的

临沂营销型网站建设,视频网站是怎么做权限管理的,个人开发微信小程序,如何建设考研网站流式数据处理实战&#xff1a;用状态机 scan 优雅过滤 AI 响应中的 <think> 标签 1. 引言&#xff1a;流式数据处理的挑战 在现代 AI 应用开发中&#xff0c;流式 API&#xff08;如 OpenAI、Claude 等&#xff09;能实时返回分块数据&#xff0c;提升用户体验。但流式…

流式数据处理实战:用状态机 + scan 优雅过滤 AI 响应中的 <think> 标签

1. 引言:流式数据处理的挑战

在现代 AI 应用开发中,流式 API(如 OpenAI、Claude 等)能实时返回分块数据,提升用户体验。但流式数据存在一个常见问题:如何跨多个分块处理结构化内容?

例如,某些 AI 会在响应中返回 <think>...</think> 标签(内部是 AI 的推理过程,不应展示给用户)。由于流式数据是分块返回的,可能出现:

  • <think></think> 被拆到不同分块
  • 标签不完整(如只收到 <think> 但未收到 </think>

传统的字符串替换(如 replaceAll)无法处理这种情况。本文将介绍如何用 响应式编程(Reactive Programming)scan 操作符 + 状态机(State Machine) 解决该问题。


2. 核心思路:状态机 + scan

2.1 什么是状态机?

状态机(State Machine)是一种基于状态转移的编程模型,适用于处理有状态的数据流。在我们的场景中:

  • 状态insideThink(是否在 <think> 标签内)
  • 事件:遇到 <think></think>

2.2 什么是 scan?

scan 是响应式编程(如 Reactor、RxJava)中的一个操作符,类似于 reduce,但会在每次元素到达时立即发出累积结果

  • 输入Flux<T>(数据流)
  • 输出Flux<State>(带状态的流)

3. 代码实现

3.1 定义状态机

public class ThinkTagState {private boolean insideThink = false;  // 是否在 <think> 标签内private final StringBuilder buffer = new StringBuilder(); // 有效文本缓冲区public ThinkTagState process(String chunk) {StringBuilder output = new StringBuilder();String remaining = chunk;while (!remaining.isEmpty()) {if (!insideThink) {// 查找 <think> 标签int startIdx = remaining.indexOf("<think>");if (startIdx == -1) {output.append(remaining); // 无标签,直接保留break;}// 保留 <think> 之前的内容output.append(remaining.substring(0, startIdx));insideThink = true;remaining = remaining.substring(startIdx + "<think>".length());} else {// 查找 </think> 标签int endIdx = remaining.indexOf("</think>");if (endIdx == -1) {break; // 未闭合,等待后续分块}// 跳过 </think> 之后的内容insideThink = false;remaining = remaining.substring(endIdx + "</think>".length());}}buffer.append(output);return this;}public String getFilteredText() {return buffer.toString();}public boolean isInsideThink() {return insideThink;}
}

3.2 流式处理 Pipeline

Flux<ChatResponseDTO> filteredStream = aiCallService.stream(new Prompt(messages)).scan(new ThinkTagState(), (state, response) -> {String chunk = response.getResult().getOutput().getText();return state.process(chunk); // 更新状态}).filter(state -> !state.getFilteredText().isEmpty()) // 跳过空内容.map(state -> {ChatResponseDTO dto = new ChatResponseDTO();dto.setAnswer(state.getFilteredText());state.buffer.setLength(0); // 清空缓冲区return dto;});

4. 关键点解析

4.1 状态机如何工作?

  • 初始状态insideThink = false
  • 遇到 <think>insideThink = true(跳过后续内容)
  • 遇到 </think>insideThink = false(恢复正常处理)
  • 跨分块处理:如果只有 <think> 没有 </think>,会等待后续分块

4.2 为什么用 scan 而不是 map

  • map 无记忆能力,无法处理跨分块的状态
  • scan 维护状态,适合流式数据的渐进式处理

4.3 性能优化

  • 缓冲区清空:每次 map 后调用 buffer.setLength(0) 避免内存增长
  • 正则替代方案:如果确定标签不跨分块,可用简单 replaceAll

5. 扩展场景

5.1 处理多个标签(如 <reasoning>

enum TagType { THINK, REASONING, NONE }public class MultiTagState {private TagType currentTag = TagType.NONE;// 类似逻辑,但需处理多种标签
}

5.2 结合元数据(Metadata)

// 使用 Tuple2 保留原始响应
.scan(Tuples.of(new ThinkTagState(), null), (tuple, response) -> {ThinkTagState state = tuple.getT1().process(response.getText());return Tuples.of(state, response); // 保留原始响应
})
.map(tuple -> {ChatResponseMetadata metadata = tuple.getT2().getMetadata();// ...
});

6. 总结

方案优点缺点
状态机 + scan精准处理跨分块标签代码稍复杂
简单 replaceAll实现简单无法处理跨分块

推荐选择

  • 如果 AI 响应可能跨分块 → 状态机 + scan
  • 如果标签保证完整 → 正则替换

7. 进一步阅读

  • Reactor 官方文档 - scan
  • 状态机设计模式

希望这篇博文能帮助你优雅处理流式数据!如果有问题,欢迎留言讨论。 🚀


文章转载自:

http://0qAhgpLe.jhkzL.cn
http://bo395M4f.jhkzL.cn
http://sBuWVUQv.jhkzL.cn
http://lgICrJwo.jhkzL.cn
http://ZY0q8kgG.jhkzL.cn
http://zrvqF54i.jhkzL.cn
http://gSxFSYqA.jhkzL.cn
http://cfwkDk6e.jhkzL.cn
http://o2mk35Jb.jhkzL.cn
http://UfY213j5.jhkzL.cn
http://S25uBKLg.jhkzL.cn
http://V0idQ12u.jhkzL.cn
http://sUvYaLjK.jhkzL.cn
http://FeqHPiFb.jhkzL.cn
http://1TkjHyrJ.jhkzL.cn
http://oweybW9K.jhkzL.cn
http://oRpBqcUR.jhkzL.cn
http://vZrJHZwe.jhkzL.cn
http://JatEqXVM.jhkzL.cn
http://OtdUgFlP.jhkzL.cn
http://Hws87B8Y.jhkzL.cn
http://ovjq8EgE.jhkzL.cn
http://VrxtawlM.jhkzL.cn
http://MflW7KVD.jhkzL.cn
http://ZyipEOv2.jhkzL.cn
http://n7SKes6L.jhkzL.cn
http://XTmiILi8.jhkzL.cn
http://6BzdJidr.jhkzL.cn
http://kmfd2I9b.jhkzL.cn
http://dszmTSJz.jhkzL.cn
http://www.dtcms.com/wzjs/672036.html

相关文章:

  • 城乡建设吧部网站东莞高端网站建设
  • 做网站先做前台还是后台wordpress实现h5翻页效果
  • 网站建设与网页设计案例教程 重庆大学出版社wordpress头像不同步
  • 做影视网站用主机还是用服务器设计本笔记本推荐
  • 什么网站教人做3d效果图如何修改网站后台
  • 住房和城乡建设部网站公告北京建设银行官方网站
  • 什邡网站建设想做电商怎么注册
  • 太仓做企业网站用本机做网站浏览
  • c 网站开发引擎做教育集团的网站
  • 郑州高新区做网站的公司建网站平台
  • 网站 被攻击_主业篡改 被黑了 织梦做的站广告招牌图片大全
  • 公司企业网站建设广州冼村为什么叫土豪村
  • 做外单要上什么网站wordpress 图片裁切
  • 温州网络公司网站建设个人建设网站
  • 网站如何自己做支付静态双语企业网站后台源码
  • 购物平台网站建设框架wordpress 755权限
  • 嘉兴公司制作网站的在线天堂おっさんとわたし
  • 青州网站建设厦门物流网站建设
  • 做网站公司联系方式页面营销型网站建设实战
  • 网站漏洞扫描工具当年的51网站
  • 做蛋糕网站的优点推广找客户平台
  • 成都网站开发公司排名天津外贸公司网站制作
  • 顺德手机网站设计信息中文搜索引擎网站
  • 网站免费广告全国最大的外发加工网
  • 个人网站欣赏的网站网页图片大全
  • 免费空间申请网站制作小程序的方法如何自己制作小程序
  • 网站首页成品应用软件开发工程师做什么
  • 企业网站有哪些社群营销的十大步骤
  • 哈尔滨网站推广服务怎么做个人公众号
  • 网站建设项目经费的报告tst网络设计案例