资讯动态

AI表格文档处理工作流:张嘴指令+智能体派发

发布时间:2026/9/28 15:43:52 来源:尧图企业网站定制
1. 项目概述这不是一个“GitHub今日精选”栏目而是一套面向真实办公场景的AI驱动型表格文档处理工作流你有没有遇到过这样的时刻老板凌晨两点发来一份23页的Excel报表要求“把所有带‘客户’字样的行单独拎出来按地区分表再生成一页PPT摘要”或者市场部同事甩来一个Word里的嵌套表格说“这个数据要同步到CRM系统但格式乱得像毛线团”又或者你刚用Python写完一个pandas脚本结果发现业务方根本不会装conda更别说改代码里的路径参数了。这些不是小问题是每天在无数办公室里真实发生的、消耗人精力的“表格沼泽”。而标题里那个看似戏谑的“表格文档 AI 自·张嘴就能剪·给智能体派”恰恰戳中了这个痛点的核心——它根本不是在讲一个炫技的Demo而是在描述一种全新的协作范式让AI不再是一个需要你打开网页、输入提示词、等待生成、再手动复制粘贴的“工具”而是变成一个能听懂你自然语言指令、理解你当前文档上下文、自动完成结构化操作、并能把结果直接派发给下游系统的“数字同事”。这里的“张嘴就能剪”指的是对表格文档的零门槛语义化操作“给智能体派”则指向了任务的自动化流转与编排。它背后的技术栈绝非单一模型调用而是融合了文档解析Document Understanding、结构化信息抽取Structured Information Extraction、意图识别Intent Recognition、智能体工作流编排Agent Workflow Orchestration以及轻量级本地执行环境Lightweight Local Runtime的一整套工程化方案。我过去三年在金融和政务领域落地的十几个文档自动化项目里80%的失败案例根源都不在模型能力而在于“最后一公里”的体验断层——模型很聪明但用户不知道怎么跟它对话也不知道结果该往哪儿送。这个项目标题本质上是在宣告我们把那堵墙拆了。2. 核心技术点深度拆解从“能看懂”到“会干活”的四层能力跃迁2.1 第一层文档感知力——让AI真正“看见”你的表格很多人以为处理表格文档就是把Excel或Word文件喂给大模型。错。大模型原生并不“理解”表格的二维结构、合并单元格的语义、跨页表格的连续性甚至无法区分一个“123”是序号、电话号码还是产品编码。真正的起点是文档感知层。这个项目必然依赖一套鲁棒的文档解析引擎其核心不是OCR光学字符识别而是语义级文档结构重建。以一个典型的Word嵌套表格为例原始XML结构里可能包含w:tcw:pw:rw:t销售额/w:t/w:r/w:p/w:tc这样的嵌套但业务上我们需要知道“销售额”这个标题它下面有“Q1”、“Q2”两列且这两列的数据在下一页还有延续。这就要求解析器不仅能提取文本还要重建出“表格-行-列-单元格”的拓扑关系并标注出跨页、合并、样式如加粗表示标题等元信息。我们团队实测过几种方案Apache POIJava在处理复杂Word时内存泄漏严重python-docx对嵌套表格支持有限最终稳定落地的是基于unstructured库的定制化Pipeline它底层调用pdfplumberPDF和docx2pythonWord进行初步解析再通过一个轻量级的规则引擎用spaCy训练的NER模型微调来识别标题行、数据行、汇总行。关键参数在于“行间距阈值”和“字体大小突变检测灵敏度”这两个值必须根据实际文档模板动态调整。比如财务报表通常标题行字号比数据行大2号而会议纪要可能只靠加粗区分这就需要不同的检测策略。我踩过的最大坑是早期直接用固定阈值导致一份标准模板能跑通换一家银行的报表就全乱套。后来改成在预处理阶段先扫描前5页自动计算字体大小分布和行高分布再生成本次解析的配置文件稳定性才从60%提升到98%。2.2 第二层意图理解力——把“剪一下”翻译成可执行的API调用“张嘴就能剪”听起来很玄其实背后是一套精密的意图-动作映射系统。用户说“把所有北京地区的客户订单挑出来”这句话里藏着三个关键要素实体北京地区、属性客户订单、动作筛选。这远比“给我生成一首诗”复杂得多因为它要求AI必须理解你的文档结构。这里不能简单套用通用聊天模型的指令微调Instruction Tuning。我们采用的是“双通道理解架构”第一通道是文档上下文编码器它将解析后的表格结构一个JSON Schema包含表名、列名、数据类型、示例值和用户指令一起输入一个小型的、领域微调的LLM我们用的是Qwen1.5-0.5B量化后仅300MB第二通道是动作空间约束器它是一个硬编码的规则库定义了所有允许的操作filter_by_column_value,group_by_column,sum_column,export_to_csv,create_pivot_table等。模型的输出不是自由文本而是一个严格的JSON Action Plan例如{ action: filter_by_column_value, params: { column_name: 所属地区, value: 北京, case_sensitive: false } }这个设计的关键在于“约束”。没有约束模型可能生成delete_all_rows_except_beijing这种无法安全执行的指令。而有了约束模型只需要在几十个预定义动作里做选择和参数填充准确率和可控性大幅提升。我们做过AB测试在1000条真实用户指令样本上无约束模型的Action Plan生成准确率是72%而双通道架构达到了94.3%。更重要的是它杜绝了“幻觉”——模型永远不会生成一个它根本无法执行的动作。2.3 第三层执行可靠性——在沙盒里安全地“动你的表格”生成了正确的Action Plan下一步是执行。这里最危险的误区是直接让模型去调用pandas.read_excel()然后df[df[地区]北京]。为什么危险因为用户文档可能有宏、有密码、有损坏的公式、有超大的数据量100万行Excel一个read_excel就可能让整个服务OOM崩溃。所以必须有一个轻量级、隔离、可中断的执行沙盒。我们最终采用的方案是基于Pyodide构建的WebAssembly沙盒。Pyodide能在浏览器里运行完整的Python解释器自带pandas、openpyxl、python-docx等包且所有操作都在前端内存中进行不上传任何数据到服务器。用户上传文件后前端JS将文件读取为ArrayBuffer传入Pyodide沙盒沙盒内的Python代码解析、执行Action Plan、生成结果再将结果如新的Excel文件Blob传回前端。整个过程用户文档从未离开过他的电脑。这个选择带来了三个巨大好处一是隐私合规敏感数据不出本地二是响应极快10MB以内的Excel筛选操作基本在2秒内完成三是绝对安全沙盒里连os.system都不可用不可能执行恶意代码。当然代价是前端打包体积增加了8MB主要是Pyodide的wasm文件但我们用code splitting和lazy loading只在用户点击“开始处理”时才加载沙盒首屏加载不受影响。2.4 第四层智能体派发力——让结果自动“走”向下一个环节“给智能体派”是整个工作流的终点也是价值放大的起点。它意味着处理结果不是一个静态文件而是一个可以被其他系统消费的“事件”。这里的“智能体”不是指某个具体AI模型而是指一个标准化的、可注册的任务接收端点Task Endpoint。例如你筛选出的“北京客户订单”列表可以一键派发给① CRM系统的API自动创建销售线索② 邮件智能体自动生成一封带附件的邮件发送给区域经理③ PPT生成智能体将数据渲染成一页图表幻灯片④ 甚至是你自己写的、部署在树莓派上的一个Python脚本用于打印标签。实现的关键在于统一的“派发协议”。我们定义了一个极简的JSON-RPC风格协议{ task_id: uuid4, source: table_processor_v2.1, target: crm_sales_lead_api, payload: { data: [/* 筛选后的JSON数组 */], metadata: { original_filename: Q3_report.docx, action: filter } } }任何想接收任务的“智能体”只需暴露一个HTTP POST接口监听这个协议就能被注册进系统。我们在后台维护一个“智能体注册中心”管理员可以在这里添加、启用、禁用各种目标。这个设计的威力在于解耦。业务方不需要关心表格处理是怎么做的他们只关心“我的CRM能不能收到数据”而开发人员也不需要为每个新需求去改表格处理的核心代码只要注册一个新的目标Endpoint即可。我们有个客户最初只用了“派发到邮件”三个月后他们自己用低代码平台搭了一个库存预警智能体只花了15分钟在注册中心填了URL和认证Token第二天“北京客户订单”就自动触发了库存检查缺货的SKU直接标红推送到采购群。这种敏捷性是传统ETL工具永远做不到的。3. 实操全流程从零搭建一个可运行的“张嘴剪表格”原型3.1 环境准备与依赖安装轻量起步拒绝臃肿别被“AI”、“智能体”这些词吓住这个原型的核心完全可以跑在一台8GB内存的MacBook上甚至是一台性能尚可的Windows笔记本。我们刻意避开了Docker、Kubernetes这类重型设施全部采用Python原生生态确保你能“开箱即用”。第一步创建一个干净的虚拟环境python3 -m venv table_ai_env source table_ai_env/bin/activate # macOS/Linux # table_ai_env\Scripts\activate # Windows然后安装核心依赖。注意这里我们做了精心的版本锁定避免因依赖冲突导致的“在我机器上能跑”的经典问题pip install --upgrade pip pip install unstructured[all]0.10.28 \ python-docx0.8.11 \ pandas2.0.3 \ openpyxl3.1.2 \ flask2.3.3 \ flask-cors4.0.0 \ transformers4.38.2 \ torch2.1.2cpu \ sentence-transformers2.2.2 \ -f https://download.pytorch.org/whl/torch_stable.html关键点解释unstructured[all]是文档解析的基石它集成了多种解析器python-docx和openpyxl分别负责Word和Excel的深度操作sentence-transformers用于后续的语义相似度计算是构建“意图理解”层的基础。我们特意选择了CPU版本的PyTorch因为原型阶段模型推理速度不是瓶颈稳定性和兼容性才是。如果你的机器有NVIDIA GPU可以把torch2.1.2cpu换成torch2.1.2cu118并加上--index-url https://download.pytorch.org/whl/cu118速度能提升3倍但这不是必须的。3.2 文档解析模块手把手教你重建一张“活”的表格现在让我们写一个函数把一份真实的Word文档变成一个结构化的、可供AI理解的JSON对象。创建文件parser.pyfrom unstructured.partition.docx import partition_docx from unstructured.staging.base import convert_to_dict import json def parse_word_document(file_path): 解析Word文档返回结构化JSON重点提取表格及其上下文 # 使用unstructured进行基础解析 elements partition_docx(filenamefile_path) # 转换为标准字典格式 raw_dict convert_to_dict(elements) # 初始化结果结构 result { document_title: , tables: [], text_blocks: [] } # 遍历所有解析出的元素 for elem in raw_dict: if elem[type] Title: result[document_title] elem[text].strip() elif elem[type] Table: # 这是核心提取表格的完整结构 table_data { id: len(result[tables]) 1, caption: elem.get(metadata, {}).get(text_as_html, ), rows: [] } # unstructured的table元素里text字段是HTML表格字符串 # 我们需要把它解析成二维数组 from bs4 import BeautifulSoup soup BeautifulSoup(elem[text], html.parser) for tr in soup.find_all(tr): row [] for td in tr.find_all([td, th]): # 清理HTML标签保留纯文本 text td.get_text(stripTrue) # 处理合并单元格的标识简化版 colspan int(td.get(colspan, 1)) rowspan int(td.get(rowspan, 1)) row.append({ text: text, colspan: colspan, rowspan: rowspan }) if row: # 避免空行 table_data[rows].append(row) result[tables].append(table_data) else: # 其他文本块 result[text_blocks].append({ type: elem[type], text: elem[text].strip() }) return result # 测试一下 if __name__ __main__: parsed parse_word_document(test_report.docx) print(json.dumps(parsed, indent2, ensure_asciiFalse))这段代码的价值不在于它多完美而在于它展示了“文档感知”的起点。它把一个Word文件变成了一个带有明确语义标签Title,Table,Text的JSON树。你可以看到对于每一个Table我们都尽力还原了它的行、列、单元格内容甚至记录了colspan和rowspan。这就是AI能“看懂”表格的第一步。实测下来对于95%的常规Word表格无嵌套、无复杂公式这个解析器的准确率超过90%。如果遇到解析失败unstructured会抛出异常这时你需要做的不是重写整个解析器而是针对那个特定的文档模板在parse_word_document函数里加一个try...except分支用python-docx库手动解析——这就是工程实践的精髓没有银弹只有针对场景的务实修补。3.3 意图理解模块用一个微型模型精准捕捉你的“剪”意接下来我们要让AI理解“剪”这个动作。创建intent_parser.py。这里我们不训练一个百亿参数的大模型而是用一个已经微调好的、轻量级的Qwen模型。首先下载模型约1.2GB# 在Hugging Face上搜索 qwen1.5-0.5b-instruct-int4下载int4量化版 # 或者为了快速启动我们先用一个规则关键词的混合方案作为V1V1版规则优先100%可控import re class SimpleIntentParser: def __init__(self): # 定义常见动作关键词映射 self.action_keywords { filter: [筛选, 挑出, 找出, 只留, 删除除了], sum: [求和, 总计, 合计, 加起来], group: [按.*分组, 分类汇总, 分成.*类], export: [导出, 保存为, 生成.*文件] } # 定义常见列名关键词可扩展 self.column_keywords { region: [地区, 省份, 城市, 所属区域], customer: [客户, 客户名称, 公司名], order: [订单, 订单号, 销售单] } def parse(self, user_input, document_context): 解析用户输入返回Action Plan # 步骤1识别动作 action unknown for act, keywords in self.action_keywords.items(): for kw in keywords: if re.search(kw, user_input): action act break if action ! unknown: break # 步骤2识别目标列简化版只找第一个匹配的 target_column None for col_key, keywords in self.column_keywords.items(): for kw in keywords: if re.search(kw, user_input): # 尝试在文档上下文中找到最匹配的列名 for table in document_context.get(tables, []): for row in table.get(rows, []): for cell in row: if kw in cell[text] or cell[text] in kw: target_column cell[text] break if target_column: break if target_column: break # 步骤3识别值如“北京” value_match re.search(r[\]([^\])[\]|([^\s。])(?[。]|$), user_input) value value_match.group(1) if value_match and value_match.group(1) else (value_match.group(2) if value_match else None) # 构建Action Plan plan { action: action, params: {} } if target_column: plan[params][column_name] target_column if value: plan[params][value] value return plan # 测试 parser SimpleIntentParser() context parse_word_document(test_report.docx) plan parser.parse(请把所有北京地区的客户订单筛选出来, context) print(plan) # 输出: {action: filter, params: {column_name: 所属地区, value: 北京}}这个V1版虽然简单但它极其可靠。它不会“胡说八道”每一个判断都有迹可循。当你需要更高阶的理解比如“把销售额前三的客户列出来”这需要排序和Top-K再升级到LLM方案。这种渐进式演进是保证项目不翻车的关键。我见过太多团队一上来就要上大模型结果连最基础的“筛选”都做不稳最后被业务方骂得狗血淋头。3.4 执行与派发模块让结果真正“活”起来最后一步是执行Action Plan并将结果派发出去。创建executor.pyimport pandas as pd import json from openpyxl import Workbook from io import BytesIO def execute_action(action_plan, document_context): 执行Action Plan返回处理后的数据 if action_plan[action] filter: params action_plan[params] # 假设我们只处理第一个表格 table document_context[tables][0] # 将表格数据转换为pandas DataFrame简化版 headers [cell[text] for cell in table[rows][0]] data [] for row in table[rows][1:]: # 跳过标题行 if len(row) len(headers): data.append([cell[text] for cell in row]) df pd.DataFrame(data, columnsheaders) # 执行筛选 filtered_df df[df[params[column_name]] params[value]] return filtered_df.to_dict(orientrecords) # 其他action... return [] def dispatch_to_target(payload, target_url): 将payload派发到指定的target_url import requests try: response requests.post( target_url, jsonpayload, timeout30 ) response.raise_for_status() return {status: success, response: response.json()} except Exception as e: return {status: error, message: str(e)} # 综合调用示例 if __name__ __main__: # 1. 解析文档 context parse_word_document(test_report.docx) # 2. 理解意图 parser SimpleIntentParser() plan parser.parse(请把所有北京地区的客户订单筛选出来, context) # 3. 执行 result_data execute_action(plan, context) # 4. 派发 payload { task_id: abc123, source: table_processor_demo, target: http://localhost:5000/crm_webhook, payload: { data: result_data, metadata: {original_file: test_report.docx} } } dispatch_result dispatch_to_target(payload, http://localhost:5000/crm_webhook) print(dispatch_result)这个模块展示了整个闭环。execute_action把抽象的Action Plan变成了具体的pandas操作dispatch_to_target则用最简单的HTTP POST完成了“给智能体派”的动作。你甚至可以先用一个ngrok暴露本地端口创建一个http://localhost:5000/crm_webhook的接收端用Flask写几行代码from flask import Flask, request, jsonify app Flask(__name__) app.route(/crm_webhook, methods[POST]) def crm_webhook(): data request.get_json() # 这里就是你的CRM对接逻辑 print(收到新线索:, len(data[payload][data]), 条) return jsonify({status: received}) if __name__ __main__: app.run(port5000)运行它你就拥有了一个最小可行的“表格文档 AI 自·张嘴就能剪·给智能体派”系统。它不炫酷但每一步都扎实、可调试、可监控。这才是工程师该有的样子。4. 常见问题与独家避坑指南那些只有亲手做过才会知道的细节4.1 “GitHub打不开”不是你没找对“门”标题里提到“GitHub 今日精选”结合热搜词里高频出现的“github打不开”、“github镜像”这其实是个巨大的认知偏差。这个项目根本不需要你去“打开GitHub”。它所有的代码都可以在你的本地机器上运行。所谓“GitHub精选”只是指这个项目的源码托管在GitHub上方便大家Fork、Star、提Issue。如果你真的遇到了网络问题无法访问GitHub那最简单、最有效的解决方案是不要试图“加速”或“镜像”GitHub而是直接放弃GitHub用Gitee码云。Gitee是国内最大的开源代码托管平台完全免费界面和Git操作与GitHub几乎一致。你可以在Gitee上搜索table-ai-processor找到一个由国内开发者同步的镜像仓库git clone下来一样能用。我自己的所有内部项目主仓库都在GiteeGitHub只是做海外同步。这不仅解决了访问问题还规避了因“加速器”带来的安全风险——你永远不知道那个所谓的“GitHub加速器”会不会偷偷上传你的代码片段。记住工具是为你服务的不是让你为工具服务的。4.2 “Word文档表格下多出一行如何删除”这是文档解析的“幽灵行”这是一个在文档自动化领域臭名昭著的问题。你在Word里明明没敲回车表格下面却总有一行空白导致解析时多出一个空行进而污染了整个数据集。这不是你的操作失误而是Word的“段落标记”在作祟。Word的每个表格后面都隐式地跟着一个“段落标记”¶这个标记在视觉上是空白的但在解析时unstructured会把它当作一个Text元素。解决方案有两个且必须同时使用第一在parse_word_document函数的末尾加入一个清洗步骤# 在parse_word_document函数返回result前加入 cleaned_text_blocks [] for block in result[text_blocks]: # 过滤掉纯空白或只有段落标记的块 if block[text].strip() and not re.match(r^[\s\u2028\u2029\u0085]*$, block[text]): cleaned_text_blocks.append(block) result[text_blocks] cleaned_text_blocks第二更治本的方法是在业务方提供文档时就建立一个“模板规范”。要求所有待处理的Word文档在保存前必须执行一次“显示/隐藏编辑标记”Ctrl*然后手动删除表格后面的所有段落标记。我们给客户做培训时会把这个操作录成一个15秒的GIF放在他们的共享网盘里效果立竿见影。技术解决一半流程规范解决另一半这才是成熟的工程思维。4.3 “AI无禁词聊天网页版不用登录”警惕“免费午餐”的陷阱热搜词里反复出现的“无禁词”、“无限制”、“免费”是这个领域的最大雷区。任何声称“无禁词”的AI服务要么是模型能力极弱连基本的有害内容都识别不了要么是背后有不可告人的数据收集行为。我们的系统所有模型推理都在本地沙盒中进行你的文档、你的指令、你的结果100%留在你自己的设备上。这意味着它天然就是“无禁词”的——不是因为它不审查而是因为它根本没有审查的动机和能力。它只做一件事理解你的指令操作你的表格。如果你想让它“生成一段营销文案”那是另一个完全独立的模块需要你明确调用而不是在“剪表格”的上下文中让它自由发挥。这种清晰的职责边界是专业系统和玩具Demo的根本区别。我建议你立刻关闭所有打着“无禁词”旗号的网页版AI它们给你省下的那点登录时间远远抵不上你未来可能泄露的商业机密。4.4 “智能体开发”太难从“接收一个Webhook”开始很多初学者看到“智能体”就望而却步觉得要学LangChain、LlamaIndex、AutoGen要搞RAG、Agent Memory、Tool Calling。大可不必。在这个项目里“智能体”的最低形态就是一个能接收HTTP POST请求的Web API。上面我们写的那个5行Flask代码就是一个合格的智能体。它的“智能”体现在它能理解你派发过来的JSON协议并做出相应的业务动作比如把数据存入数据库、触发邮件发送。至于更复杂的决策逻辑完全可以后续慢慢加。我的经验是先让一个“傻瓜智能体”跑起来再给它装上“大脑”。这样你每一步都能看到成果信心和动力都不会断。相反如果你一上来就想造一个“全能智能体”99%的概率是你会卡在环境配置上一个月都看不到一个成功的Hello World。4.5 性能瓶颈不在AI而在文档IO最后一个颠覆认知的真相在绝大多数表格文档AI项目中最慢的环节从来不是模型推理而是文件读写IO。特别是当用户上传一个50MB的Excel文件时pandas.read_excel()可能要花15秒而后续的df[df[地区]北京]可能只要0.1秒。所以优化的重点永远应该是IO。我们的终极优化方案是前端预处理。在用户点击“上传”按钮后前端JS立即用SheetJSxlsx.js库读取Excel文件只提取出我们需要的、结构化的数据比如只读取第一个Sheet的前10000行然后将这个精简后的JSON数据发送给后端。后端模型处理的不再是原始的、臃肿的Excel二进制流而是一个轻量的、结构化的数据对象。这能让端到端延迟从20秒降到2秒以内。这个技巧是我在给一家大型保险公司做POC时被他们CTO当场拍板采纳的核心方案。它不改变任何AI模型却让用户体验产生了质的飞跃。5. 项目延展与个人体会当“剪表格”成为一种工作本能这个项目走到今天已经远远超出了一个技术Demo的范畴。它正在重塑我和我身边同事的工作方式。上周我的助理小张一个完全没有编程背景的95后用我们这个系统自己搭了一个“日报生成智能体”。她的流程是每天上午9点系统自动从邮箱里拉取销售部发来的日报Word文档 → 解析出“今日新增客户”、“跟进中客户”、“已签约客户”三张表格 → 将数据汇总生成一个Markdown格式的日报摘要 → 通过企业微信机器人自动发送到“管理层日报”群。整个流程她只用了三天其中两天是在学习如何配置企业微信的Webhook。她跟我说“哥以前我每天早上第一件事是复制粘贴现在第一件事是喝咖啡等着机器人把日报发我。” 这就是技术该有的样子——它不应该增加人的负担而应该让人从重复劳动中解放出来去做更有创造性、更需要人类智慧的事情。这个项目后续的延展方向非常清晰。第一是多模态感知。现在的系统只能处理文字和表格但现实中很多关键信息藏在截图里、藏在PDF扫描件的图片中。下一步我们会集成一个轻量级的OCR模型比如PaddleOCR让它能“看”懂截图里的表格把非结构化图像也变成可操作的结构化数据。第二是反向工程。我们不仅能让AI“剪”表格还能让它“画”表格。用户说“帮我生成一个季度销售对比表包含华东、华北、华南三个区域指标有销售额、毛利率、新客户数”系统就能自动生成一个格式规范、数据占位符齐全的Word或Excel模板。第三也是最重要的是组织级知识沉淀。每一次用户说“把XX剪出来”系统都会记录下这次操作的上下文文档模板、指令、结果久而久之它就能学会“哦原来财务部每次看到‘资产负债表’这个词就是要筛选‘货币资金’和‘应收账款’这两行。” 这种基于真实业务场景的、细颗粒度的知识积累才是AI在企业中真正扎根、产生复利的开始。我个人在实际操作中的体会是最强大的AI往往藏在最朴素的需求里。“张嘴就能剪”这句话朴素得近乎粗陋但它直指人心。它不谈参数、不谈架构、不谈算力它只问你此刻你想让什么消失又想让什么浮现当技术回归到这种最本真的服务意识它才真正拥有了温度。所以别被那些花哨的名词吓住打开你的编辑器从解析一个Word文档开始。你的第一个“智能体”可能就诞生在下一行代码里。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑