Claude API调用避坑清单,深度解析Rate Limit突增、Context截断、Token泄漏三大生产级故障(附实时监控脚本)
更多请点击 https://kaifayun.com第一章Claude API调用避坑清单总览调用 Claude API 时看似简单的 HTTP 请求背后隐藏着多个高频出错点认证失败、消息格式不合规、流式响应处理异常、上下文长度超限、以及速率限制误判等。本章聚焦实战中真实踩过的坑提供可立即验证的检查项与修复方案。身份认证与请求头配置必须确保anthropic-version请求头精确匹配当前 API 版本如2023-06-01且Authorization头使用Bearer sk-ant-api03-...格式密钥。遗漏或拼写错误将直接返回401 Unauthorized。消息结构必须严格遵循角色顺序Claude 要求消息数组以user开始交替出现assistant和user且不可连续两个user。错误示例如下[ {role: user, content: 你好}, {role: user, content: 再问一个问题} // ❌ 连续 user触发 400 错误 ]正确结构应为[ {role: user, content: 你好}, {role: assistant, content: 你好}, {role: user, content: 再问一个问题} // ✅ 合法 ]流式响应需按 chunk 解析不可直接 JSON.parse启用stream: true时响应是 Server-Sent EventsSSE格式每行以data:开头。需逐行分割并过滤空行与事件前缀// 示例Node.js 流式解析逻辑 response.on(data, (chunk) { const lines chunk.toString().split(\n).filter(line line.trim() ! ); for (const line of lines) { if (line.startsWith(data: )) { const jsonStr line.slice(6); // 剥离 data: const parsed JSON.parse(jsonStr); if (parsed.type content_block_delta) { process.stdout.write(parsed.delta.text || ); } } } });常见错误码与应对策略HTTP 状态码典型原因建议动作429超出账户配额或请求频率限制检查 Anthropic 控制台配额用量添加指数退避重试逻辑400max_tokens 超出模型支持上限如 claude-3-haiku-20240307 最高 4096动态校验模型最大输出长度截断或降级请求第二章Rate Limit突增故障的成因与防御体系2.1 Rate Limit机制原理与Claude官方配额模型解析核心限流策略Claude采用令牌桶Token Bucket与请求窗口Sliding Window双机制协同控制前者平滑突发流量后者保障时段内总量合规。官方配额结构模型版本每分钟请求上限每分钟Token上限Claude-3-Haiku10050,000Claude-3-Sonnet5030,000客户端重试逻辑示例# 根据429响应动态退避 if response.status_code 429: retry_after int(response.headers.get(Retry-After, 1)) time.sleep(min(retry_after * (1.5 ** attempt), 60)) # 指数退避上限60秒该逻辑依据HTTP标准Retry-After头实现自适应等待避免盲目轮询指数因子1.5平衡收敛速度与服务压力。2.2 请求频率误判场景复现与埋点验证含curlPython双验证脚本误判场景复现逻辑当限流器未区分客户端真实IP如反向代理透传缺失Nginx $remote_addr 恒为上游负载均衡IP导致多用户共享同一限流桶触发误限。双模验证脚本curl -H X-Real-IP: 192.168.1.101 http://api.example.com/test模拟指定源IP发起请求验证服务端是否正确解析并计数。# validate_rate_limit.py import requests for i in range(5): resp requests.get(http://api.example.com/test, headers{X-Real-IP: f192.168.1.{100i}}) print(fReq {i1}: {resp.status_code} | X-RateLimit-Remaining: {resp.headers.get(X-RateLimit-Remaining)})脚本循环发送带不同 X-Real-IP 的请求比对响应头中剩余配额确认埋点是否按真实IP独立计数。埋点有效性对照表验证维度预期行为实际观测同一IP多次请求Remaining递减✓ 符合不同IP并发请求各自独立计数✗ 初始版本共用桶2.3 指数退避令牌桶双策略实现带线程安全TokenBucket类双策略协同设计原理指数退避应对突发失败令牌桶控制请求速率。二者正交组合退避决定“何时重试”令牌桶决定“能否发送”。线程安全TokenBucket实现type TokenBucket struct { mu sync.RWMutex capacity int64 tokens int64 rate float64 // tokens per second lastTime time.Time } func (tb *TokenBucket) TryTake() bool { tb.mu.Lock() defer tb.mu.Unlock() now : time.Now() elapsed : now.Sub(tb.lastTime).Seconds() tb.tokens min(tb.capacity, tb.tokensint64(tb.rate*elapsed)) tb.lastTime now if tb.tokens 0 { tb.tokens-- return true } return false }TryTake原子判断并消耗令牌rate控制填充速度capacity设定最大突发量min防溢出。策略协同流程请求失败 → 启动指数退避初始100ms倍增至2s上限重试前 → 调用TokenBucket.TryTake()获取许可令牌不足 → 立即返回失败避免阻塞等待2.4 多租户/多模型场景下的配额隔离设计基于Request ID与Model ID路由路由决策核心逻辑请求进入网关后依据X-Request-ID和X-Model-ID两级键构造唯一配额槽位标识实现租户与模型维度的双重隔离。// 构建配额KeytenantID:modelID:requestID_prefix func buildQuotaKey(req *http.Request) string { tenant : req.Header.Get(X-Tenant-ID) model : req.Header.Get(X-Model-ID) reqID : req.Header.Get(X-Request-ID) return fmt.Sprintf(%s:%s:%s, tenant, model, reqID[:8]) // 前8位防Key爆炸 }该函数确保同一租户下不同模型请求不共享配额且同模型内高频请求通过 requestID 前缀实现细粒度分流避免单点打爆。配额策略映射表租户类型默认QPS模型白名单熔断阈值enterprise100all95%trial5gpt-3.5-turbo80%动态限流执行流程→ 请求解析 → Key生成 → Redis原子计数 → 比较配额阈值 → 允许/拒绝/降级2.5 生产环境Rate Limit实时熔断与自动降级方案附Prometheus告警规则动态阈值熔断机制基于滑动窗口异常率双因子触发熔断当5分钟内错误率30%且QPS超限阈值120%自动切换至降级响应。Prometheus告警规则示例groups: - name: rate_limit_alerts rules: - alert: RateLimitBreached expr: sum(rate(http_request_total{status~429|503}[5m])) / sum(rate(http_request_total[5m])) 0.3 and sum(rate(http_request_total[5m])) 120 for: 2m labels: {severity: critical} annotations: {summary: Rate limit breached, triggering auto-degrade}该规则每2分钟评估一次结合错误率与绝对请求量双重判定避免瞬时毛刺误触发。降级策略执行流程熔断器状态由Redis原子计数器维护网关层拦截请求并返回预置JSON降级模板异步通知配置中心刷新全局限流策略第三章Context截断导致语义失真的诊断与修复3.1 Claude上下文窗口分层结构与截断触发边界实测含tokenize对比实验分层结构解析Claude的上下文窗口采用三级缓存结构全局会话层200K tokens、对话轮次层动态分配、单消息层硬限16K。实际截断优先级为单消息 轮次总长 全局上限。Tokenize对比实验from anthropic import Anthropic client Anthropic(api_key...) # 测试不同编码器对同一文本的token计数 text Hello, 世界 * 500 print(Claude-3 tokenizer:, len(client.count_tokens(text))) print(OpenAI tiktoken (cl100k_base):, len(tiktoken.get_encoding(cl100k_base).encode(text)))实测显示Claude专用tokenizer对CJK字符压缩率高约18%但标点符号计数更严格导致相同语义文本在Claude中token数平均少于GPT-4-Turbo约12%。截断边界验证结果输入长度(tokens)实际接收长度截断位置199999199999无截断200000199998末尾2 token强制丢弃3.2 智能消息压缩算法保留指令槽剥离冗余对话历史Python实现核心设计思想该算法聚焦于LLM交互场景中的语义保真压缩仅保留用户原始指令、关键参数槽位如date、location及最新一轮系统响应自动剔除中间冗余轮次与重复确认语句。Python实现示例def compress_conversation(history: list) - list: # 提取最后一条用户指令中的结构化槽位 last_user next((msg for msg in reversed(history) if msg[role] user), {}) slots extract_slots(last_user.get(content, )) # 保留首条系统指令含prompt模板和最新一轮完整交互 return [ history[0], # system prompt {role: user, content: reconstruct_instruction(slots)}, {role: assistant, content: history[-1][content]} ]逻辑上分三步①逆序定位最新用户消息②调用extract_slots()解析命名实体③重构精简指令并拼接最终响应。参数history为标准ChatML格式消息列表。压缩效果对比指标原始对话12轮压缩后Token数1842327关键槽位保留率100%100%3.3 Streaming响应中动态截断位置检测与重试补偿机制截断位置动态识别客户端通过解析 Content-Range 响应头与流式 chunk 边界标记实时定位截断点。服务端在每次 chunk 发送前注入唯一序列号与校验哈希// 每个chunk携带位置元数据 chunk : fmt.Sprintf(data: %s\nid: %d\nhash: %x\n\n, payload, seqID, sha256.Sum256([]byte(payload)))seqID用于重建顺序hash支持完整性校验避免重传时数据错位。重试补偿策略基于 HTTP 308 Resume Incomplete 状态码触发条件重试客户端缓存最近3个seqID及其offset字节偏移状态映射表状态码语义重试动作408请求超时回退至前一完整 chunk 起始点503服务不可用按指数退避 seqID 对齐重发第四章Token泄漏风险的全链路防控实践4.1 请求体/响应体敏感字段自动识别与脱敏基于正则LLM辅助标注双模识别架构采用正则规则快速匹配常见敏感模式如身份证、手机号再由轻量化微调LLM对边界案例如“紧急联系人电话”“监护人证件号”等语义化字段进行上下文感知标注提升泛化能力。脱敏策略配置示例func NewSanitizer() *Sanitizer { return Sanitizer{ Rules: []Rule{ {Pattern: \b\d{17}[\dXx]\b, Type: IDCARD, Mask: XXXXXX****XXXXXX}, {Pattern: \b1[3-9]\d{9}\b, Type: PHONE, Mask: 1**** ${4:4}}, }, LLMThreshold: 0.85, // LLM置信度阈值 } }该代码定义了结构化脱敏规则集Pattern为Go正则表达式Type标识敏感类型便于审计追踪Mask支持占位符动态截取LLMThreshold控制LLM介入粒度避免低置信误标。识别效果对比方法准确率召回率平均延迟(ms)纯正则92.1%76.3%0.8正则LLM95.7%93.2%12.44.2 HTTP客户端层TLS证书固定与中间人攻击防护配置证书固定核心机制TLS证书固定Certificate Pinning通过将服务器公钥或证书哈希值硬编码于客户端绕过传统CA信任链校验有效抵御恶意CA或网络劫持导致的中间人攻击。Go语言实现示例func createPinnedClient() *http.Client { rootCAs : x509.NewCertPool() // 加载可信根证书 if ok : rootCAs.AppendCertsFromPEM(pemBytes); !ok { panic(failed to append PEM) } return http.Client{ Transport: http.Transport{ TLSClientConfig: tls.Config{ RootCAs: rootCAs, ServerName: api.example.com, VerifyPeerCertificate: func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error { // 提取并校验证书公钥哈希SHA256 if len(rawCerts) 0 { return errors.New(no certificate) } cert, _ : x509.ParseCertificate(rawCerts[0]) pubKeyHash : sha256.Sum256(cert.RawSubjectPublicKeyInfo) expected : a1b2c3...f8e9 // 预置哈希值 if fmt.Sprintf(%x, pubKeyHash) ! expected { return errors.New(certificate pin mismatch) } return nil }, }, }, } }该代码在TLS握手后主动提取证书公钥信息并比对预置哈希值确保仅接受指定密钥签发的证书阻断伪造证书的连接建立。常见固定策略对比策略类型灵活性维护成本抗失效能力公钥哈希固定高支持密钥轮换中强证书哈希固定低每次更新需改码高弱证书过期即中断4.3 日志系统中Token残留过滤器兼容ELK与Loki的LogProcessor设计目标在微服务日志采集链路中原始日志常含临时认证Token如JWT、API Key需在落盘前脱敏同时适配Elasticsearch的Ingest Pipeline与Loki的Promtail阶段处理。核心过滤逻辑func TokenResidueFilter(log map[string]interface{}) { if msg, ok : log[message].(string); ok { log[message] regexp.MustCompile((?i)(token|auth|key)\s*[:]\s*[]?[\w\-]{16,}). ReplaceAllString(msg, $1: [REDACTED]) } }该函数基于正则识别常见Token模式支持大小写不敏感匹配并保留字段语义结构[\w\-]{16,}确保仅过滤长凭证避免误删短ID。适配差异对比组件注入方式生效阶段ELKIngest Pipeline processorES写入前LokiPromtail stage regex labels客户端日志转发时4.4 内存中临时Token对象的安全销毁协议Python weakrefatexit协同核心设计目标确保敏感Token对象在生命周期结束时被立即、不可逆地清除避免GC延迟导致的内存残留风险。协同机制原理weakref.ref避免强引用延长对象存活期atexit.register()提供进程退出前的最终清理钩子二者结合实现“弱引用监听 确保销毁”的双重保障import weakref, atexit class SecureToken: def __init__(self, value): self._value bytearray(value.encode()) # 可变字节缓冲区 def destroy(self): if hasattr(self, _value) and self._value: self._value[:] b\x00 * len(self._value) del self._value token SecureToken(session_abc123) weak_token weakref.ref(token) atexit.register(lambda: weak_token() and weak_token().destroy())该代码创建弱引用并注册退出回调仅当对象仍存在时调用destroy()清零敏感字节bytearray支持原地覆写规避字符串不可变性带来的内存残留。销毁时机对比机制触发时机可靠性__del__GC回收时不确定低可能永不触发weakrefatexit显式销毁或进程退出高确定执行第五章附录——生产级监控脚本与故障快查指南核心监控脚本实时检测 CPU 与内存异常# 检测连续3次CPU使用率90%且内存剩余512MB触发告警 threshold_cpu90; threshold_mem512 cpu_avg$(top -bn1 | grep %Cpu | awk {print $2} | cut -d% -f1 | awk {printf %.0f, $1}) mem_free$(free -m | awk NR3{print $4}) if [[ $cpu_avg -gt $threshold_cpu ]] [[ $mem_free -lt $threshold_mem ]]; then echo $(date): CRITICAL - CPU${cpu_avg}%, MEM_FREE${mem_free}MB | logger -t monitor-alert curl -X POST -H Content-Type: application/json \ -d {alert:high_cpu_mem,severity:critical} \ https://alert-api.example.com/v1/notify fi常见故障现象与定位路径服务响应延迟突增 → 检查netstat -s | grep -i retransmit是否存在重传激增K8s Pod 处于CrashLoopBackOff→ 查看kubectl logs pod --previous及 init container 错误数据库连接池耗尽 → 执行SELECT * FROM pg_stat_activity WHERE state idle in transactionPostgreSQL关键指标阈值速查表指标健康阈值危险信号典型根因磁盘 inode 使用率 85% 95%日志未轮转、临时文件堆积Redis connected_clients maxclients × 0.7 maxclients × 0.95客户端连接泄漏、未正确关闭连接日志采样诊断流程图[tail -f /var/log/app/error.log] → 匹配 ERROR/WARN 行 → 提取 trace_id →↓[grep trace_id /var/log/app/access.log] → 定位请求路径与响应码 →↓[jq .duration_ms 2000 metrics.json] → 关联慢调用链路

相关新闻

HarmonyOS RDB 查询顺序不稳定怎么办:中式美食收藏页怎么用排序字段和兜底排序

HarmonyOS RDB 查询顺序不稳定怎么办:中式美食收藏页怎么用排序字段和兜底排序

收藏页最怕的不是查不到数据,而是查到了以后顺序飘。用户刚收藏的一道菜,返回列表后应该排在前面;如果刷新一下跑到中间,用户会怀疑收藏没成功。这个问题看起来像 UI 列表问题,真正原因通常是数据查询没有明确排序口径…

2026/10/9 9:35:14 阅读更多 →
EscapeFromTarkov-Trainer完全指南:内部辅助工具终极入门,解锁30+核心功能

EscapeFromTarkov-Trainer完全指南:内部辅助工具终极入门,解锁30+核心功能

EscapeFromTarkov-Trainer完全指南:内部辅助工具终极入门,解锁30核心功能 【免费下载链接】EscapeFromTarkov-Trainer Escape from Tarkov (EFT) Trainer - Internal 项目地址: https://gitcode.com/gh_mirrors/es/EscapeFromTarkov-Trainer Esca…

2026/10/7 10:12:05 阅读更多 →
HarmonyOS ArkUI 重复点击导致重复入库怎么办:中式美食详情页怎么给按钮加忙碌态和幂等保护

HarmonyOS ArkUI 重复点击导致重复入库怎么办:中式美食详情页怎么给按钮加忙碌态和幂等保护

做详情页按钮时,我一开始也容易把事情想简单:收藏就写收藏表,加入购物清单就写购物清单表,按钮点了以后刷新一下页面就行。可中式美食这种真实应用不是玩具页面,用户可能连续点两次,也可能网络慢半拍&#…

2026/10/11 15:15:05 阅读更多 →

最新新闻

WPS网页表单自动化:Selenium稳定定位与抗UI改版实战

WPS网页表单自动化:Selenium稳定定位与抗UI改版实战

1. 项目概述:为什么一个“自动填表”动作值得花时间深挖最近在某高校实验室做数据归档支持时,连续三天被同一个任务卡住:每天要往WPS在线表格里录入37份学生实验报告的基础信息——姓名、学号、日期、设备编号、结果状态。手动复制粘贴不是不…

2026/10/12 11:01:11 阅读更多 →
Git基本命令并不难:先搞懂三区与快照,再谈工作流

Git基本命令并不难:先搞懂三区与快照,再谈工作流

简介:围绕Git命令行操作核心场景,整理了一份入门级速查资料,面向Git初学者和日常参与协作开发的程序员,解决版本控制中从环境配置到分支管理的常见问题。内容系统覆盖SSH密钥生成与验证、仓库克隆与拉取更新、代码提交与历史查看、…

2026/10/12 11:01:11 阅读更多 →
Qt图像裁剪的像素级坐标对齐与内存安全实践

Qt图像裁剪的像素级坐标对齐与内存安全实践

1. 这不是简单的“截图”——Qt图像区域裁剪的本质是像素级坐标映射与内存管理很多人第一次看到“Qt读图→切区域→保存”这个需求时,下意识会想:不就是用QLabel显示图片,然后画个矩形框,再调用QPixmap::copy()吗?我试…

2026/10/12 11:01:11 阅读更多 →
Spring Boot集成Zxing生成高清二维码的完整实践指南

Spring Boot集成Zxing生成高清二维码的完整实践指南

1. 项目概述:为什么一个二维码生成功能值得单独深挖?最近在帮某高校实验室做一套教学设备管理后台,其中有个刚需场景:给每台实验仪器生成唯一身份码,扫码就能跳转到该设备的电子档案页。一开始我随手搜了几个“Spring …

2026/10/12 11:01:11 阅读更多 →
Windows开放端口连通失败的三大根源:绑定地址、防火墙规则与网络配置

Windows开放端口连通失败的三大根源:绑定地址、防火墙规则与网络配置

简介:本资源是一份面向Windows系统管理员、运维工程师及初学者的端口配置实操指南,聚焦解决生产环境中常见服务(如Web应用、测试服务器)需开放特定端口的实际问题,以8080端口为典型场景展开。文档以图文结合方式完整呈…

2026/10/12 11:01:10 阅读更多 →
Qt图像裁切实战:QImage::copy()实现精准ROI提取

Qt图像裁切实战:QImage::copy()实现精准ROI提取

1. 项目概述:一张图里切出你要的“那一块”最近在某高校实验室带学生做图像处理小项目,经常遇到一个看似简单、实操却容易卡壳的需求:Qt:读入一张图片,切割特定区域的图片并保存。这个词组在技术社区里高频出现&#x…

2026/10/12 11:00:10 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →