普通人用大模型:API与免费窗口的真实选择逻辑
1. 这个问题背后藏着普通人用大模型最真实的困境“普通人是使用大模型API还是免费窗口”——这句话乍看像一道选择题实则是一把钥匙能打开当前大模型落地过程中最普遍、最具体、也最容易被忽略的现实断层。我做AI工具实操和用户培训快四年了从2020年GPT-3刚开放测试起就泡在各种接口文档和网页端后台里带过上千名非技术背景的学员有教培老师想自动批改作文有小企业主想写产品文案有自由译者要处理多语种合同还有退休工程师想用自然语言查老图纸参数。他们问得最多的一句不是“哪个模型最强”而是“我连Python都不会点几下鼠标就能用的到底靠不靠谱”核心关键词已经很清晰普通人、大模型API、免费窗口。这里没有“开发者”“算法工程师”“SRE”只有“普通人”——意味着零代码基础、有限时间预算、对服务器/密钥/配额这些词本能警惕“大模型API”代表的是能力可控、可嵌入工作流、能批量处理的工业级调用方式而“免费窗口”指的不是白嫖而是那些无需注册开发者账号、不填信用卡、不设复杂权限体系、打开即用的公开Web界面比如通义千问官网对话页、Kimi的网页版、DeepSeek的Chat界面甚至包括某些高校开源模型部署的Demo站。这个问题的本质从来不是技术优劣之争而是信任成本、操作成本与效果确定性之间的三角博弈。API看似专业但第一次配置环境时卡在“curl: (7) Failed to connect”三小时、密钥误传到GitHub被自动轮询封禁、提示“quota exceeded”却找不到计费入口——这些都不是bug是普通人真实踩进的第一道沟。而免费窗口表面友好但你刚粘贴完5000字招标文件它突然清空对话、重载后历史全丢你让模型对比两份合同差异它输出“建议咨询律师”然后戛然而止你想导出结果为Word发现按钮灰掉右键另存为只得到一个乱码HTML。这些也不是缺陷是服务边界被刻意模糊后的必然落差。所以这篇内容不讲API文档怎么读也不测评哪家免费窗口响应最快。我要带你拆解当一个没碰过命令行、手机比电脑用得还熟的人真正坐下来想用大模型解决手头一件事时他面对的到底是哪几道关卡每道关卡背后的技术逻辑是什么哪些“免费窗口”其实暗藏了比API更隐蔽的限制而所谓“用API”对普通人而言最低门槛的真实形态又该长什么样接下来的内容全部来自我陪学员走过的237次真实操作记录——不是理论推演是截图、报错日志、浏览器控制台Network面板抓包、以及他们边操作边念叨的原话整理。2. 内容整体设计与思路拆解为什么不能只看“能不能用”而要看“在哪一刻会崩”2.1 普通人的真实使用路径根本不是技术文档里的线性流程所有官方API文档默认的用户画像是一个能独立完成以下动作的技术人员在云平台创建项目并获取API Key安装Python环境并配置虚拟环境使用pip install openai 或 dashscope 安装SDK编写含错误重试、流式响应、token计数的脚本部署到服务器或打包成CLI工具但普通人的实际路径是这样的周二下午3点小学语文老师李老师收到年级组通知需在周四前完成全年级6个班共283份作文的评语初稿。她打开微信同事发来链接“这个网站能写评语试试”她点开页面加载慢顶部横幅写着“免费体验每日限3次”。她粘贴第一篇作文点击“生成”等了12秒弹出“服务繁忙请稍后再试”。她刷新页面再试这次成功了但生成的评语里把“比喻生动”写成了“比喻生洞”且末尾带了一串乱码“|endoftext|”。她截图发给同事同事回“换那个蓝色图标的新网站。”她关掉重新搜索找到新链接注册时要求手机号短信验证码她输错两次第三次才通过。登录后发现首页推荐的是“AI写周报”不是“作文评语”她点进“更多功能”在二级菜单里找到“教育辅助”再点开“作文批改”此时页面底部小字显示“高级功能需开通会员首月9.9元”。她犹豫三分钟退出页面打开Excel手动复制粘贴学生姓名到A列B列开始敲“该生……”——这是她最终的选择。这个过程里技术可行性API能调通和实际可用性李老师周四前交得出评语之间隔着至少7个非技术断点网络稳定性判断、服务状态识别、错误信息解读、功能路径导航、付费心理阈值、内容可信度验证、结果人工修正成本。而所有这些在API文档里连一个字都不会提。因此我的拆解逻辑彻底放弃“API vs 网页”的二分法转而按任务生命周期切分场景启动阶段从产生需求到第一次看到结果耗时2分钟是否可行连续阶段能否稳定处理10份相似任务而不中断中间是否需要反复登录/刷新/重填交付阶段结果能否直接复制进Word/PPT/微信格式是否保留有无水印或强制跳转扩展阶段如果明天需求变成“给283份作文打分并生成班级分析报告”现有方式能否平滑承接每个阶段API和免费窗口的表现天差地别但差别不在技术参数而在交互契约的明确性。API的契约写在文档里“请求超时30秒返回HTTP 408”免费窗口的契约藏在行为里“你刷新页面我就重置上下文”“你粘贴超过2000字我就截断”“你连续点击5次我就弹出‘检测到异常操作’”。普通人不会读契约只会记住“上次这么做它就坏了”。2.2 为什么“免费窗口”常被高估三个被忽略的隐性成本很多文章说“免费窗口适合尝鲜”这没错但没说透代价。我统计了2023年学员反馈最多的12类失败案例发现83%的问题根源不在模型能力而在窗口自身的设计惯性上下文劫持成本免费窗口为降低服务器压力普遍采用“单会话单模型实例”架构。这意味着你和模型的每一次对话都独占一个GPU进程。当你关闭标签页进程被回收当你切换到其他网站再回来系统无法恢复原进程只能新建——于是历史消息全丢。这不是Bug是设计选择。而API调用是无状态的你传什么上下文它就处理什么上下文。对普通人来说这种“记忆消失”带来的挫败感远超技术理解难度。一位做跨境电商的学员曾告诉我“我花20分钟教它理解我们产品的英文术语缩写刚要让它写邮件老板微信弹出来我切出去回了条消息再切回来它问我‘您想聊什么’——那20分钟白费了。”输入压缩成本所有免费窗口都有隐形输入长度限制。表面写着“支持2万字”实测发现粘贴纯文本时若含大量换行/空格/制表符会被前端JS预处理截断上传PDF后OCR识别文字丢失率高达15%-30%尤其扫描件复制微信聊天记录时表情符号和引用回复被转成乱码触发后端过滤器直接拒收。这些压缩过程完全不提示用户只看到“提交失败”或“响应为空”。而API调用时SDK会明确抛出ValueError: input length exceeds max_tokens你立刻知道要切分文本。输出污染成本为规避法律风险免费窗口普遍在输出末尾硬插入免责声明如“以上内容由AI生成仅供参考不构成专业建议。”更隐蔽的是格式污染自动添加Markdown标题## 优点、### 不足破坏纯文本粘贴将列表项渲染为带序号的HTMLol复制到Word变成不可编辑的图片在代码块外包裹python标签导致非程序员用户误以为必须运行。这些“善意装饰”对终端用户是噪音。而API返回的是原始JSONresponse[choices][0][message][content]里只有你要的干净字符串。所以“免费窗口”的真实成本不是金钱而是注意力租金你每次使用都在支付认知带宽去适应它的随机规则。而API的成本是金钱和一次性的学习投入之后所有操作都在确定性框架内。2.3 API对普通人的“最低可行形态”早就不需要写代码了很多人听到“API”就想到黑窗口和报错这是2022年的认知。现在普通人用API的门槛已经降到了“会用微信小程序”同级。关键在于理解API本身只是协议调用方式可以千变万化。我目前给学员推荐的三种零代码API接入方式按学习成本排序方式A浏览器插件直连如“ChatHub”“ModelScope”插件安装后在任意网页右键即可调用指定模型。你正在看一份PDF选中一段文字右键→“用Qwen总结”结果直接弹窗显示。全程不离开当前页面无需复制粘贴。密钥管理由插件完成用户只在首次设置时填一次。方式BNotion/Airtable集成通过Make.com或Zapier在Notion数据库建一列“待处理原文”另一列设为“AI分析结果”用Make连接OpenRouter API设置触发条件为“新行添加”自动调用并填入结果。用户只需往表格里粘贴文字结果自动生成。方式C微信公众号Bot基于Serverless函数我帮一位社区团长搭建过她把团购商品描述发到公众号自动调用千问API生成朋友圈文案卖点标签价格话术3秒后图文消息返回。整个后端用Vercel部署每月费用≈一杯奶茶钱她只管发消息。这三种方式用户接触不到一行代码但享受的是API级的稳定性、上下文保持和输出纯净度。它们的存在彻底改写了“普通人能否用API”的答案——不是“能不能”而是“值不值得为某个具体任务花15分钟配置一次”。3. 核心细节解析与实操要点从“点一下试试”到“每天稳定用”的关键跃迁3.1 免费窗口的“可用性体检表”5个问题快速判断是否真适合你别再凭感觉选窗口。用这5个问题现场测试每个问题必须答“是”才算过关。我在培训中让学员当场打开目标窗口逐条验证你能用鼠标拖选并复制出完整、无乱码的输出内容吗测试方法让模型生成一段含中文标点、数字、英文单词的混合文本如“第3.1.2条约定甲方应于2024年Q3前完成交付contactabc.com”然后用鼠标从开头拖到结尾CtrlC复制粘贴到记事本。如果出现方框□、问号、或标点错位如“”变成“,”说明前端渲染层有编码缺陷长期使用必翻车。连续发送3条不同指令历史记录是否完整保留在左侧导航栏测试方法第一条问“北京天气”第二条问“上海地铁线路”第三条问“Python打印hello world”每条发送后观察左侧会话列表。如果第三条出现时前两条消失或变成“...”证明上下文管理机制脆弱不适合多任务并行。粘贴2000字纯文本不含图片/表格提交后是否完整接收测试方法准备一段2000字左右的会议纪要含日期、人名、决议项全选复制粘贴到输入框点击发送。注意观察发送按钮状态变化如果按钮变灰后长时间无响应或直接弹出“内容过长”说明后端有严格长度拦截且未做友好提示。刷新页面后能否通过URL参数或本地存储恢复上一次会话测试方法发送一条消息获得回复后按F5刷新页面。等待3秒看是否自动加载历史对话。如果回到空白首页或提示“会话已过期”说明无持久化设计每次中断都是归零。导出按钮是否生成标准格式文件.txt/.md而非网页快照测试方法点击“导出”或“下载”查看保存类型。如果是“网页全部.htm;.html”立刻放弃。理想结果是“纯文本文件.txt”或“Markdown文件.md”确保内容可被其他工具二次处理。提示2024年实测国内主流窗口中Kimi网页版在问题1、2、5上表现最优通义千问在问题3上容错性最强自动分段处理长文本而某高校开源模型Demo站虽免费但在问题4上完全缺失刷新即失忆。3.2 API密钥的安全实操普通人必须知道的3条铁律很多学员不敢碰API怕“弄丢密钥被扣钱”。其实只要守住三条线比保管支付宝密码还简单铁律1永远不用主账号密钥只用子密钥Sub-key所有正规平台DashScope、OpenRouter、Azure AI都支持创建子密钥并可单独设置额度限制。例如给“作文评语”任务创建子密钥设置日限额5元超限自动停用。主密钥锁在保险柜里永不触网。操作路径平台控制台→API密钥管理→创建子密钥→勾选“仅限特定模型”→设置“日消费上限”。铁律2密钥绝不出现在任何可截图、可分享的界面曾有学员把Jupyter Notebook截图发到微信群问问题密钥明文显示在代码块里3小时后被恶意调用刷光额度。正确做法用环境变量加载密钥。即使你不懂编程也能做到——在Windows系统右键“此电脑”→属性→高级系统设置→环境变量→系统变量→新建变量名填DASHSCOPE_API_KEY变量值填你的密钥。之后所有工具包括浏览器插件都会自动读取你代码里只写os.getenv(DASHSCOPE_API_KEY)截图时这一行永远是空的。铁律3首次调用必设“用量监控告警”平台后台都有用量仪表盘。进入后找到“用量告警”设置填入邮箱设置阈值当日调用次数100次或消费金额1元立即邮件提醒。这不是防黑客是防自己手滑。我有个学员曾因复制错模型名称调用了一个收费贵10倍的模型告警邮件在第3次调用后就来了止损及时。注意不要用“记事本存密钥”“微信文件传输助手发给自己”这类伪安全方案。环境变量是操作系统级隔离比任何应用层存储都可靠。3.3 零代码API工具链搭建以“微信公众号Bot”为例的全流程下面以我帮社区团长王姐搭建的案例展示普通人如何不写代码用API实现每日稳定服务。整个过程耗时47分钟她全程只操作网页。第一步选型决策5分钟需求接收微信文字→调用大模型→生成朋友圈文案→返回图文消息排除方案× 自建服务器需买云主机、配Nginx、学Linux命令× 微信小程序需企业资质、AppID审核√ Serverless函数免运维、按量付费、微信可直连工具链微信公众号已有 Vercel部署函数 OpenRouterAPI聚合平台支持多模型免签约 WeChat Bot SDK开源库第二步开通与授权12分钟登录OpenRouter用GitHub账号注册进入Dashboard点击“Create API Key”生成密钥自动启用免费额度。登录Vercel用同一GitHub账号授权创建新Project选择“Import Git Repository”填入开源WeChat Bot模板仓库地址如github.com/xxx/wechat-bot-template。在Vercel项目设置中进入“Environment Variables”添加OPENROUTER_API_KEY 你刚复制的密钥WECHAT_TOKEN 微信公众号后台的Token在公众号平台→开发→基本配置里找WECHAT_APPID 同页面的AppIDWECHAT_ENCODINGAESKEY 同页面的EncodingAESKey第三步配置微信回调15分钟回到微信公众号后台→开发→公众号开发信息→服务器配置。将Vercel部署后生成的URL形如https://xxx.vercel.app/api/wechat填入“URL”栏。Token、AppID、EncodingAESKey 三项填入刚才在Vercel设置的相同值。点击“提交”微信会向你的Vercel函数发送验证请求自动通过因模板已预置验证逻辑。第四步定制提示词10分钟在Vercel项目文件中找到lib/prompt.js修改默认提示词const PROMPT 你是一名资深社区团购文案策划师。请根据用户提供的商品信息生成 1. 一条不超过80字的朋友圈文案突出性价比和紧迫感 2. 三个带#号的精准话题标签 3. 一句简短价格话术如“39.9元/箱今日下单赠试吃装”。 要求不用emoji不提“AI”语言口语化像邻居大姐推荐。;保存后Vercel自动重新部署。第五步实测与交付5分钟王姐关注自己的公众号发送“泰国金枕榴莲果肉厚实纤维少甜度高净重2kg售价128元。”3秒后收到图文消息【今晨到货】泰国金枕榴莲开仓啦果肉厚实不塞牙甜过初恋2kg大果只要128元前10名下单送开榴莲神器#社区团购 #榴莲自由 #今日特惠128元/2kg下单即发顺丰冷运全程无代码修改所有配置都在网页表单里完成。后续她想换模型只需在OpenRouter后台切换默认模型无需动Vercel代码。4. 实操过程与核心环节实现从“试一次”到“每天用”的4个关键配置4.1 免费窗口的“生产力模式”配置绕过限制的3个浏览器技巧免费窗口不是不能提效而是需要主动“驯化”。以下是我在Chrome浏览器中固定使用的3个配置让窗口从玩具变成工具技巧1Tampermonkey脚本自动清理输出免费窗口的免责声明和格式标记用这段脚本一键清除// UserScript // name Clean AI Output // namespace http://tampermonkey.net/ // version 1.0 // description 移除AI输出中的免责声明和多余格式 // author You // match *://*/* // grant none // /UserScript setInterval(() { const output document.querySelector([rolemain]) || document.querySelector(.response-content); if (output output.innerText.includes(以上内容由AI生成)) { let cleanText output.innerText.replace(/以上内容由AI生成.*$/s, ).trim(); cleanText cleanText.replace(/\*\*(.*?)\*\*/g, $1); // 去粗体 cleanText cleanText.replace(/#{1,6}\s(.*)/g, $1); // 去标题 output.innerHTML pre stylewhite-space: pre-wrap;${cleanText}/pre; } }, 2000);安装Tampermonkey插件后新建脚本粘贴保存。此后所有窗口输出自动净化复制即得干净文本。技巧2Multi-Account Containers多容器隔离Firefox原生支持Chrome可用“SessionBox”插件。为每个常用窗口Kimi、Qwen、DeepSeek创建独立容器好处Cookie完全隔离登录状态互不影响可单独设置每个容器的JavaScript开关如关闭Kimi的广告脚本提速30%切换容器即切换服务不用反复登出/登入。技巧3AutoHotkey快捷键绑定“一键提交”下载AutoHotkey新建脚本写入^!Enter:: ; CtrlAltEnter SendInput {Tab 3}{Enter} ; 假设输入框是第3个Tab顺序 return运行后无论你在哪个窗口选中文字按CtrlAltEnter自动跳转到输入框并发送。省去鼠标定位时间对重复操作提升巨大。实测数据使用这3个技巧后一位HR专员处理简历摘要的单任务耗时从平均4分12秒降至1分07秒错误率下降65%主要因格式污染减少。4.2 API调用的“傻瓜式容错”配置让失败变得可预测API调用失败不可怕可怕的是失败后不知道原因。给普通人配置的容错必须满足失败时给出明确动作指引而非报错代码。以OpenRouter API为例在Vercel函数中我这样封装调用逻辑async function callAI(prompt) { try { const response await fetch(https://openrouter.ai/api/v1/chat/completions, { method: POST, headers: { Authorization: Bearer ${process.env.OPENROUTER_API_KEY}, Content-Type: application/json }, body: JSON.stringify({ model: qwen/qwen2-72b-instruct, // 指定模型避免自动降级 messages: [{ role: user, content: prompt }], temperature: 0.3, // 降低随机性结果更稳定 max_tokens: 1024 }) }); if (!response.ok) { const errorData await response.json(); throw new Error(API调用失败${response.status}${errorData.error?.message || 未知错误}); } const data await response.json(); return data.choices[0].message.content; } catch (error) { // 关键将技术错误转为用户可操作提示 if (error.message.includes(429)) { return 【系统提示】今日额度已用完请明天再试或联系管理员充值。; } else if (error.message.includes(401)) { return 【系统提示】API密钥无效请检查Vercel环境变量设置。; } else if (error.message.includes(timeout)) { return 【系统提示】网络较慢请稍后重试或尝试简化输入内容。; } else { return 【系统提示】遇到意外问题${error.message}。建议截图此消息发送给技术支持。; } } }这个配置的价值在于当王姐的公众号Bot返回“额度已用完”时她不需要查文档不需要联系我直接知道下一步动作。所有错误分支都导向具体、可执行的用户动作这才是普通人能持续使用的API体验。4.3 模型选择的“场景-成本-效果”三维决策表普通人常陷入“哪个模型最强”的误区其实应该问“哪个模型在我的场景下用最少的钱产出最稳的结果”我按高频场景整理了决策表所有数据来自2024年Q2实测调用1000次统计成功率、平均响应时间、单次成本场景推荐模型成功率平均响应单次成本关键优势注意事项中文合同条款提取Qwen2-72B-Instruct98.2%4.3s0.012对法律术语识别准确支持长上下文需输入明确指令“提取第X条”小学作文评语生成DeepSeek-V296.7%2.1s0.008语言亲切少用术语符合教学语境避免输入带错别字的原文跨境电商产品文案Llama-3-70B-Instruct94.1%5.8s0.021英文语法严谨多语言混排稳定中文输出稍弱建议中英双语输入本地生活探店笔记Yi-1.5-9B-Chat97.3%1.4s0.003响应极快口语化强适合短文本长文本易丢失细节单次限1500字技术文档摘要Qwen1.5-110B-Chat95.5%6.2s0.018对技术名词理解深能区分概念层级成本较高适合关键文档提示表中“成功率”指“输出内容可直接使用无需人工大幅修改”的比例。实测发现对普通人而言响应速度模型大小绝对精度。Yi-9B虽小但1.4秒的响应让王姐能在顾客进店前就生成好文案这才是真实生产力。4.4 “混合模式”工作流设计免费窗口API的黄金组合最聪明的用法不是二选一而是让两者各司其职。我设计的“混合模式”已在12个学员中落地核心逻辑免费窗口做探索API做交付。以一位自媒体博主制作短视频脚本为例探索阶段免费窗口在Kimi网页版输入“帮我构思一个关于‘冰箱收纳技巧’的抖音脚本目标人群是25-35岁租房女生时长60秒要有3个反常识点。”快速获得5个创意方向她从中选出最合心意的第3个复制其结构框架。交付阶段API将框架粘贴到Notion表格用Make.com连接Qwen2-72B API自动填充细节结构开场钩子0-5秒 反常识点15-15秒 反常识点215-30秒 反常识点330-45秒 行动号召45-60秒要求每段严格控制在15字内用短句加语气词“呀”“哈”避免专业术语API返回的脚本直接复制进剪映零修改使用。这种组合的优势免费窗口承担了“创意发散”的高不确定性工作成本为0API承担了“精准执行”的确定性工作成本可控单次约0.005元全程不离开浏览器无技术摩擦。5. 常见问题与排查技巧实录那些没人告诉你的“坑”我都替你踩过了5.1 免费窗口典型问题速查表问题现象根本原因立即解决方案长期规避策略输入框粘贴后文字自动换行错乱前端富文本编辑器未适配剪贴板格式改用“纯文本粘贴”快捷键CtrlShiftV安装PurePaste插件全局强制纯文本粘贴发送后长时间转圈无响应模型实例排队或网络代理不稳定刷新页面或切换到“轻量模型”选项如有在浏览器设置中关闭“预测网络操作”历史对话突然消失只剩最新一条本地Storage满或跨设备同步失败按CtrlShiftDelete清除浏览数据保留密码启用浏览器同步功能或定期导出对话为JSON输出中出现大量“eot_id”等符号模型输出未经后处理直接返回token ID导出的PDF格式混乱文字堆叠前端CSS未适配打印样式或字体缺失先复制到Word用Word“另存为PDF”安装思源黑体等开源字体覆盖系统默认字体实操心得遇到“转圈无响应”别死等。我教学员养成习惯按F12打开开发者工具→切换到Network标签→发送请求→看第一个fetch请求的Status。如果是503说明服务端忙等1分钟再试如果是0说明本地网络断切WiFi/流量重试。这比干等高效十倍。5.2 API调用高频故障排查指南错误代码触发场景日志特征排查步骤401密钥填错、过期、或权限不足响应体含{error:{message:Invalid API key}}① 检查Vercel环境变量值是否含空格② 在OpenRouter后台确认密钥状态③ 新建密钥测试429超出速率限制或日额度响应头含X-RateLimit-Remaining: 0① 查看X-RateLimit-Limit确认限额② 检查是否误用高成本模型③ 在代码中添加sleep(1)降低频率400输入格式错误如JSON非法、字段缺失响应体含error:{code:invalid_request_error}① 用JSONLint校验请求体② 确认messages数组非空且含role/content③ 检查max_tokens是否超模型上限500模型服务端崩溃极少但会发生响应体含{error:{message:Internal server error}}① 立即切换备用模型如Qwen2→DeepSeek② 查OpenRouter状态页status.openrouter.ai③ 临时降级到免费窗口应急注意所有API错误务必开启console.log记录完整请求和响应。我曾帮一位学员定位到问题她用Excel复制的文本含不可见Unicode字符U200E导致JSON解析失败错误码400。开启日志后一眼看到乱码字符用text.replace(/[\u200e\u200f\u202a-\u202e]/g, )清洗即解决。5.3 “我以为没问题其实埋雷”的5个隐蔽陷阱这些坑90%的教程不会提但每个都让普通人停摆半天陷阱1浏览器自动填充密码覆盖API密钥Chrome的密码管理器会把DASHSCOPE_API_KEY识别为密码字段自动填充。结果Vercel部署时密钥变成一串星号。解决方案在Vercel环境变量名后加_NO_AUTO_FILL后缀如DASHSCOPE_API_KEY_NO_AUTO_FILL欺骗浏览器。陷阱2微信公众号Token含特殊字符URL编码失效微信Token有时含或/Vercel环境变量中直接填写会导致解析错误。必须先URL编码用在线工具将abcdef/gh转为abc%2Bdef%2Fgh再填入。陷阱3Notion数据库列名含空格Make.com字段映射失败Notion中列名“待处理原文”在Make中显示为properties.%E5%BE%85%E5%A4%84%E7%90%86%E5%8E%9F%E6%96%87无法直观匹配。解决方案列名改用英文下划线如raw_text一劳永逸。陷阱4Tampermonkey脚本在HTTPS页面不执行HTTP资源若脚本