☰
DeepSeek多智能体:构建可复现的科研数据流水线
2026/11/6 2:10:07 网站建设 项目流程

简介:这份PDF文档围绕清华大学沈阳团队与何静团队自研的DeepSeek+DeepResearch展开,面向希望借助AI提升科研效率的研究生、科研人员与数据工作者,重点说明如何以多agent方式把数据采集、清洗整合、分析挖掘和可视化串成完整流程,让科研操作更接近对话式交互。压缩包内为1个PDF文件,约5.66MB,内容集中、便于通读,适合作为工具认知与方案参考。文档结合具体提示词任务,横向对比DeepSeek R1、OpenAI o3 mini、Claude 3.5 sonnet、Kimi k1.5在联网查询网址、生成爬虫脚本、读取文件并整理表格、集成中长文本等场景中的响应速度、结果完整度与调试成本,也讨论低延迟、轻量化、垂直领域优化、多模态和长文本处理等模型特点,并涉及社交媒体、数据库、文本与接口数据采集及统计图、热力图、网络关系图、词云等可视化输出。已有379人学习,读者可据此理解各模型的能力边界与适用任务,借鉴实验设计、提示词组织及常见失败情形的排查思路。

1. DeepSeek 加持下的科研流水线,真正的瓶颈不在“写”

科研里最耗时的环节通常不是想问题,而是把散落在网页、附件和数据库里的数据搬成一张能看的表。DeepSeek+DeepResearch 这套方案把这件事拆成一条多 agent 流水线:采集、处理、分析、可视化各司其职,人只在关键节点做决定。它面向的是要交一份完整数据分析方案的学生,也面向需要快速验证数据假设的从业者。其中反直觉的一点是,重点并不在于让模型替你写论文,而在于让模型替你完成繁琐的数据搬运;一份方案能不能落地,取决于链路每一段都能复现,而不取决于某一次回答看起来多聪明。这也是后面所有设计和验收都围绕“可复现”展开的原因。

2. 总体架构设计:四层 agent 链路与四种模型的分工边界

2.1 从原始网页到可视化图表的四层职责

这套方案的核心并不在于做一个全能对话框,而在于把科研数据处理拆成四层,每层有明确的输入、输出和失败信号。拆开的好处是失败可定位:出问题时你知道是采集没抓到,还是清洗把字段搞丢了,而不是对着一段“看起来挺对”的长回答反复猜测。

层级主要动作输入输出典型失败信号
数据采集写爬虫、查数据库、读文件、调接口网址列表、附件、库表、API原始记录(HTML、txt、csv、json)脚本能跑但结果为空
数据处理清洗、集成、变换、特征工程原始记录结构化宽表空值率高、日期重复
数据分析诊断、预测、关联、聚类宽表指标、异常清单、结论结论没有数值支撑
数据应用与呈现分类、网络分析、时序挖掘、绘图指标与宽表图、结论段落图上数字和表对不上

采集层负责把“外面”的东西拿进来,常见来源是社交媒体页面、数据库内容、文本文件和接口返回。处理层做四件事:纠错、整合、格式转换、特征提取,这一步决定后面分析有没有可信输入。分析层做诊断、预测、关联、聚类,落到具体场景就是问题定位、需求预测、推荐逻辑和异常检测。应用层则做分类、社交网络分析和时序模式挖掘,输出客户细分、信用评分这类结论,最后转成统计图、热力图、网络关系图、词云、树形图。

为什么坚持用多 agent 而不是一个大提示词?三个理由。第一是上下文隔离,爬虫任务的网页源码动辄几万字符,塞进同一个会话会把后面的分析指令挤掉。第二是失败可定位,采集层出错就重跑采集,不影响已经产出的宽表。第三是模型可替换,某一层换更合适的模型不需要重写整条链路。我在搭这类方案时,一般会把“采集”和“分析”拆成两个独立会话,中间用文件做交接,文件就是天然的断点。

还有三个必须人工确认的节点,不能省:网址清单确认、字段口径确认、图上的数字确认。网址清单决定数据边界,字段口径决定同比环比怎么算,图上数字决定答辩时会不会被问倒。这三处一旦放手交给模型自动跑,后面返工成本会翻倍。

2.2 四种模型的能力画像:谁适合采集、谁适合挖掘

资源里的自研方案做了一轮横向测试,任务覆盖爬虫数据采集、文件数据读取、文本数据集成、数据分析、数据挖掘、数据可视化六类,参与对比的是 DeepSeek R1、以响应速度见长的推理模型 O、长文本稳定的 C 模型,以及国产长文本 K 模型。结论不是“谁最强”,而是“谁在哪个位置不掉链子”。

任务DeepSeek R1模型 O模型 C模型 K
爬虫数据采集网址提取完整,脚本可执行,采集结果准确响应快,链接提取完整,数据略有遗漏能提网址,代码调整后可跑,结果为空能提网址,脚本运行后结果为空
文件数据读取提取全面,表格逻辑强、指标清晰不支持附件上传,靠粘贴,输出工整完成度好,无漏指标,支持表格下载读取快,但数据填入有缺失
文本数据集成一般长度维度最全,长文本直接答不了快,格式规范,维度不全一般长度漏同比环比,长文本反而更全长文本表现突出,维度仍有限
数据分析思维链完整,能发现数据异常快,重点突出,未察觉异常有思路但没有明确结论逻辑清晰,分析深度偏浅
数据挖掘分类准,关联挖掘偏浅受附件限制,大样本跑不动能给出多个挖掘方向,深度中等多维度挖掘最出色
数据可视化出方案和代码,需本地跑可直接生成图表,复杂图易错只出代码,需本地运行出方案和代码,需本地运行

把这张表翻译成岗位分配,逻辑就清楚了。采集环节以 DeepSeek R1 为主力、模型 O 做补充,因为 R1 的结果完整度高,O 胜在速度和链接覆盖。文件读取和中等长度文本集成交给 DeepSeek R1 与 C 模型双跑,取交集比只跑一个更稳。长文本一定要换 K 模型或者先分块,因为 R1 在超长文本上会直接放弃。数据分析主用 R1,用 O 做一次快速复核,两边结论不一致的地方就是需要人工看的地方。数据挖掘让 K 模型先出多维方向,R1 补关联性验证。可视化分两步:O 模型直出草图用来快速看趋势,正式出图一律回到脚本重绘。

这里有个容易忽略的点:模型选择不是一次性决策,而是按任务切换。资源里提到的四组协同思路就是这个意思——采集用“R1 精准筛 + O 补漏”,分析用“R1 深挖异常 + K 出多维思路”,处理用“C 稳文本 + R1 保完整”,呈现用“O 直出图 + K 给代码 + C 优化图表逻辑”。这套组合听着像堆料,实际用起来的关键是固定交接格式,否则四个模型的输出风格打架,比单模型还乱。

3. 采集与处理层的落地:网址筛选、批量脚本与结构化表格

3.1 爬虫任务的提示词拆成五步再交给模型

直接甩一句“帮我爬某网站的数据”,得到的结果大概率是一段跑不通的代码。资源里的做法是把爬虫任务拆成五步指令,让模型逐步交付,这样每一步都能验。

任务一:阅读网页【网址】的源代码【粘贴源码】,提取所有含 “某节假日客流 丨X月X日,全社会旅客发送量完成X万人次”的页面,去重后合并成网址列表。 任务二:撰写 Python 脚本,基于任务一输出的网址列表,提取每天的日期、 全社会旅客发送量、铁路客运量、公路人员流动量、水路客运量、民航客运量。 任务三:提取并合并网址,输出为 urls.txt,一行一个。 任务四:按 urls.txt 批量抓取,抓取失败的网址单独写入 failed.txt。 任务五:结果写入 out/raw.csv,字段顺序固定,不要自行增删列。

拆五步的价值在于:任务一和任务三的产物是文本,人可以肉眼核对;任务二和任务四的产物是代码,可以本地跑;任务五固定了输出契约,下游清洗不用改代码。如果一次性让模型“采集并分析出报告”,中间任何一步错了你都看不出来错在哪。

配套的脚本骨架如下,重点是重试、编码和日志三件事,缺一个后面都要还债。

# crawl_batch.py —— 按 urls.txt 批量抓取,失败重试并落盘 import csv import random import time import logging import pathlib import requests from bs4 import BeautifulSoup logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s") OUT = pathlib.Path("out") OUT.mkdir(exist_ok=True) HEADERS = {"User-Agent": "Mozilla/5.0 (research-pipeline-demo)"} KEYS = ["全社会旅客发送量", "铁路客运量", "公路人员流动量", "民航客运量"] def fetch(url, retry=3): """带指数退避的重试,失败返回 None 而不是抛异常中断整批""" for i in range(retry): try: r = requests.get(url, headers=HEADERS, timeout=15) r.raise_for_status() r.encoding = r.apparent_encoding # 中文页面乱码的后悔药 return r.text except Exception as e: logging.warning("第 %d 次失败 %s %s", i + 1, url, e) time.sleep(1.5 ** i + random.random()) return None def parse(html, date_hint): """只保留命中指标的文本行,避免整页噪声进入下游""" text = BeautifulSoup(html, "html.parser").get_text("\n", strip=True) rows = [ln for ln in text.split("\n") if any(k in ln for k in KEYS)] return {"date": date_hint, "raw": " | ".join(rows)} if __name__ == "__main__": urls = [u.strip() for u in open("urls.txt", encoding="utf-8") if u.strip()] records, failed = [], [] for u in urls: html = fetch(u) if not html: failed.append(u) continue records.append(parse(html, date_hint=u.split("/")[-1][:10])) time.sleep(0.8) # 控制频率,别把对方站点打挂 with open(OUT / "raw.csv", "w", newline="", encoding="utf-8-sig") as f: w = csv.DictWriter(f, fieldnames=["date", "raw"]) w.writeheader() w.writerows(records) pathlib.Path("failed.txt").write_text("\n".join(failed), encoding="utf-8") logging.info("成功 %d 条,失败 %d 条", len(records), len(failed))

几个参数值得说清楚。retry=3是经验值,再多容易在单个坏链接上耗太久;timeout=15对大多数静态页够用,遇到慢站单独调;sleep(0.8)是为了控制请求频率,跑大批量时至少留这个间隔;apparent_encoding是中文页面乱码最常见的解法。failed.txt必须留,失败清单是下一轮迭代的输入,没有它你就得从头再跑一遍。

提示:抓取前先确认目标站点的 robots 协议与使用条款,只采公开、允许采集的数据,落盘时不保存个人身份信息。

3.2 文件读取与长文本集成:按 token 分档,用 schema 兜底

文件读取任务看着简单,实测差异很大。资源里的测试用的是同一份客流数据 txt,要求整理成表格,字段包括日期、各交通方式客运量、同比百分比、环比百分比。结果 R1 和 C 模型都能把指标提全,O 模型靠粘贴也能给出工整输出,K 模型出现了数据缺失。

这里最容易被忽视的是“同比”和“环比”这两个字段。它们不是文本里直接给的,需要模型按日期自行计算。C 模型在一般长度文本上就漏了同比环比,说明这类派生字段必须在提示词里单独点名,并且明确计算口径。

长文本要按 token 分档处理,资源里的分界点是 7000 token 和 15000 token。一般长度下 R1 维度最全但容易受稳定性影响,输出表格末尾缺失;超长文本 R1 直接答不了,这时候换 K 模型或者先切块。我一般会按下面的规则处理:

1. 先估算 token(中文约 1 字 = 1.5 token),超过 8000 就切块。 2. 切块按自然日或自然段切,不要从句子中间截断。 3. 每块单独输出同一套字段,最后用脚本纵向合并。 4. 合并后立刻跑空值率检查,超过 5% 就回到原文抽查。

字段契约建议直接写成表头,贴进提示词里,模型照着填比自由发挥稳定得多。

请输出 Markdown 表格,表头固定为: 日期 | 全社会旅客发送量(万人次) | 同比(%) | 环比(%) | 铁路(万人次) | 公路(万人次) | 民航(万人次) 要求:日期格式 YYYY-MM-DD;同比缺失填 NA;环比按相邻两日计算; 不要新增列,不要合并单元格,不要写解释性文字。

注意:不要让模型“顺便”算增长率又“顺便”解释。数值计算交给脚本,模型只负责把原文里的数字搬到对应列,能显著降低出错概率。

3.3 清洗与特征工程的落盘规范

采集回来的raw.csv是一行一条的原始文本,还不能直接分析。清洗层做四件事:数值提取、单位统一、日期规范、缺失标记。这一段最好写成可复跑的函数,而不是每次让模型重新生成代码。

# clean.py —— 把 raw.csv 转成可用于分析的宽表 import re import pandas as pd NUM = re.compile(r"(\d+(?:\.\d+)?)") def to_num(s): """从文本里抽第一个数字,抽不到返回 None,不猜""" m = NUM.search(s or "") return float(m.group(1)) if m else None def split_metrics(raw): """按分隔符拆出各指标片段,字段名与提示词里的表头一一对应""" parts = [p.strip() for p in (raw or "").split("|")] out = {"total": None, "rail": None, "road": None, "air": None} for p in parts: if "全社会旅客发送量" in p: out["total"] = to_num(p) elif "铁路" in p: out["rail"] = to_num(p) elif "公路" in p: out["road"] = to_num(p) elif "民航" in p: out["air"] = to_num(p) return out df = pd.read_csv("out/raw.csv") df = pd.concat([df, df["raw"].apply(split_metrics).apply(pd.Series)], axis=1) df["date"] = pd.to_datetime(df["date"], errors="coerce") df = df.dropna(subset=["date"]).drop_duplicates(subset=["date"]).sort_values("date") df["total_sum"] = df[["rail", "road", "air"]].sum(axis=1, min_count=1) df["check_gap"] = (df["total"] - df["total_sum"]).abs() # 一致性校验列 df.to_csv("out/clean.csv", index=False, encoding="utf-8-sig") print(df[["date", "total", "total_sum", "check_gap"]].head())

这段代码里有三个设计决定。to_num只抽第一个数字,抽不到返回空值而不是填 0,空白和零在分析里含义完全不同。check_gap是自检列,各分项之和应该接近总量,差得离谱说明那一行解析错了,这一列是我在项目里必留的后悔药。drop_duplicates按日期去重,防止同一页面被不同 URL 重复抓取。

特征工程阶段按分析目标加列就够了,不要一次堆几十个字段。分类任务加类别列,时序任务加星期、是否节假日,关联任务加分组标签。字段越多,后面图表和数据对不上的概率越大。

4. 分析与呈现层:从表格到结论,再到能放进答辩 PPT 的图

4.1 数据分析任务:先定指标,再让模型找关联

分析环节最容易出的问题是模型给了一堆听起来对的描述,但没有数值支撑。解决办法是先钉死核心指标,再让模型围绕这个指标找特征关联。

资源里的测试用了一份公开的乘客生存数据集,要求找出规律。R1 的表现是先把核心指标“生存率”拎出来,再逐个特征看影响,还结合背景对规律做了验证并指出数据异常;O 模型快、重点突出但没发现异常;C 模型有思路没结论;K 模型只能识别较浅层的关联。

提示词按三段写就够用:

第一段:读取【数据集】,先计算核心指标(如生存率)的总体值, 并按关键分组(舱位、性别、年龄段)分别计算,输出表格。 第二段:找出与核心指标关联最强的 5 个特征,给出关联系数或分组差异, 说明是正相关还是负相关,不要下因果结论。 第三段:检查异常值和不一致记录(如年龄为负、票价缺失),列出清单和处理建议。

真正提升可信度的是让脚本算数,模型只做解释。下面这段代码负责把分组指标和相关性算出来,模型拿着结果写结论,就不会出现“凭印象给数字”。

# analyze.py —— 指标与关联全部由脚本产出,模型只负责解释 import pandas as pd df = pd.read_csv("out/clean.csv") # 核心指标按分组拆解,样本数一起给出,避免小样本结论被放大 summary = (df.groupby("group")["target"] .agg(["count", "mean"]) .rename(columns={"count": "样本数", "mean": "核心指标"})) print(summary.round(4)) # 只让数值列参与相关分析,类别列先编码 num = df.select_dtypes("number") corr = (num.corr()["target"] .drop("target") .sort_values(ascending=False)) print(corr.round(3).head(8)) # 异常检查:负值、极端值、缺失集中列 print("负值行数:", int((num < 0).any(axis=1).sum())) print("缺失率 Top5:\n", df.isna().mean().sort_values(ascending=False).head())

参数上要注意,groupby的分组字段必须和你的研究问题对齐,分组太细会导致每组样本数太少,结论站不住。相关性只反映线性关系,类别型特征要先做编码再进corr,否则会被直接丢掉。异常检查那三行是交付前的固定动作,缺了它们,答辩时被问“这个负值怎么来的”就很难看。

4.2 数据挖掘用两轮对话把深度做出来

数据挖掘和数据分析的区别在于前者要往下走一层。资源里的测试用了一份档期电影数据集,R1 能准确分类并从多个维度梳理,还会给可行建议,但整体挖掘深度偏浅,缺少不同类型数据之间的关联探究。K 模型在这一项上表现最好,能精准分类并从时间、语言、地区多个维度深入,给出趋势结论和建议;C 模型能给多个方向但关联性一般。

所以挖掘任务建议固定两轮。第一轮要全局画像,第二轮指定方向深挖。

第一轮:读取【数据集】,按题材、档期、地区、语言四个维度做分布统计, 输出表格并指出分布最不均衡的两个维度。 第二轮:基于第一轮结果,聚焦【档期 × 题材】这一个方向, 分析不同档期下题材组合的表现差异,给出三条可验证的假设, 每条假设注明需要用哪些字段验证。

两轮的价值在于第二轮有第一轮的结果做锚点,模型不会漫无边际地发散。我一般会在第二轮明确写“只分析这一个方向,不要扩展到其他维度”,否则模型很容易又把第一轮的内容复述一遍。另外,“给出可验证的假设”这个要求比“给出建议”有用得多,因为假设能落到字段上,建议往往落不到。

4.3 可视化路线二选一:直出图还是跑代码

可视化有两条路线,各有明确适用场景。资源里的结论是:O 模型能直接生成多种图表,准确度高,但复杂图表可能出错;R1、K 模型、C 模型都是给方案和代码,需要本地跑 Python。

路线适用场景优点风险
模型直出图快速看趋势、内部讨论草图快,不用装环境复杂图数据易错,数字不可核
脚本绘图答辩、报告、对外交付数据可追溯,可复跑需要本地环境和调试

我的习惯是:草图用直出,终稿一律走脚本,而且脚本只读clean.csv,不接受模型手写的数字。

# plot.py —— 正式图表只从 clean.csv 取数,保证图与表同源 import matplotlib.pyplot as plt import pandas as pd df = pd.read_csv("out/clean.csv", parse_dates=["date"]) fig, ax = plt.subplots(figsize=(9, 4)) ax.plot(df["date"], df["rail"], marker="o", label="铁路") ax.plot(df["date"], df["road"], marker="s", label="公路") ax.set_xlabel("日期") ax.set_ylabel("发送量(万人次)") ax.set_title("节假日客流趋势(数据源:clean.csv)") ax.legend() ax.grid(alpha=0.3) fig.tight_layout() fig.savefig("out/trend.png", dpi=200)

dpi=200是为了投屏不糊,tight_layout防标签被裁,标题里写明数据源是给自己留证据。图注里带上数据文件名这一条,答辩时被问“这个数字哪来的”能立刻指回去。

除了折线,方案里还列了热力图、网络关系图、词云、树形图。选型原则很简单:看趋势用折线,看分布用直方或箱线,看两维交叉用热力图,看实体关系用网络图,看词频用词云。树形图适合层级结构,比如题材下的子类占比。不要为了好看堆图表类型,一张图讲一件事就够。

5. 避坑与排查:这条流水线上最容易翻车的五个位置

5.1 脚本跑通了,但数据是空的

现象很典型:代码没报错,日志显示执行完成,打开输出文件是空的或者只有表头。

原因通常有三个。一是模型生成的 URL 列表不全,它可能只提取了页面上显式出现的链接,漏掉了分页和动态加载的部分。二是页面内容靠脚本渲染,requests拿到的是空壳 HTML,解析出来自然没内容。三是提示词里给的字段名和页面实际文案不一致,关键词匹配全部落空。

解决顺序是:先人工核对urls.txt的行数和抽样链接,确认范围没问题;再用浏览器打开一个链接看源码里有没有目标文本,没有就说明是动态渲染,需要换抓取方式或者改用页面提供的接口;最后检查KEYS里的关键词是否和页面原文逐字一致,中文标点和空格差异都会导致匹配失败。日志里加一行“命中行数”,命中 0 就直接告警,比事后翻文件快得多。

5.2 长文本分析到一半,表格末尾缺了几行

现象是前面几十行都对,最后几行没了,或者干脆整段答不出来。

原因在于上下文长度。资源里的测试很明确:一般长度文本 R1 维度最全但受稳定性影响会出现末尾缺失,超长文本直接无法答复。这不是提示词能修的问题,是输入超了处理上限。

解决办法有三层。第一层是切块,按日期或段落切开,每块单独出表,最后脚本纵向合并。第二层是降维,只把需要的字段摘出来喂给模型,不要把整份原始文件贴进去。第三层是换模型,长文本场景换 K 模型,实测在 15000 token 级别上准确度和维度都更稳。合并后一定要跑一次行数比对,原始有多少天,输出就该有多少行,差一行都要回头查。

5.3 四个模型结论打架,不知道该信谁

现象是同一份数据,R1 说关联显著,O 模型说没发现异常,K 模型给了完全不同的维度划分。

原因不是模型坏了,而是提示词模板、样本切片、是否上传附件这三件事在不同会话里不一致。O 模型不支持附件上传,靠粘贴文本,样本量天然就比别的模型小;有的会话里你多写了一句“结合背景分析”,结论口径就变了。

处理办法是把变量控制住:固定一份提示词模板,固定一份样本文件,同一任务让每个模型跑三次,取三次都出现的结论作为可信部分,只出现一次的标记为待验证。交付材料里附一张对照表,写清楚每个结论来自哪个模型、跑了几次、是否一致。这件事看着笨,但它能让你在答辩时说出“这个结论三个模型都复现了”,而不是“某个模型说的”。

5.4 图上的数字和表里的对不上

现象是图表趋势看着合理,但把某个点的数值念出来,和clean.csv里差了一截。

原因是图由模型直接生成,模型在绘图时凭记忆补了数或者做了平滑。复杂图表在直出模式下出现数据错误是已知问题,样本大时还会省略数据点。

解决原则只有一条:对外交付的图必须由脚本从宽表生成,模型只负责给绘图方案和代码。生成后抽三个点回表核对,对不上就重跑脚本。另外把图的数据源写进图注,这一条在评审场合特别有用,因为评委最常问的就是数据从哪来。

5.5 附件传不上去,任务直接卡死

现象是提示词写好了,数据集也准备好了,某个模型就是不吃附件,只能粘贴,粘贴又超长。

原因是不同模型对附件上传的支持不一致,有的完全不支持,有的只支持小文件。资源里的测试就因为这条,让 O 模型在大数据集的数据挖掘任务上直接跑不动。

绕行方案是先把数据集压缩成字段精简的 CSV,只保留分析必需的列,把行数控制在能粘贴的范围;或者把文件读取这一步单独交给支持附件的模型,让它输出中间表,再把中间表的关键结论贴给不支持附件的模型做后续分析。链路设计上,文件读取和处理层解耦,就是为了这种时候能换人不换流程。

6. 验收与答辩:用一份体检清单证明链路真的跑通了

验收这件事,很多人的做法是打开报告看一遍“感觉没问题”。我建议改成跑清单,因为答辩现场被问倒的,几乎都是没被检查过的那一项。

检查项判定标准检查方式
采集完整性成功条数 / 计划条数 ≥ 95%对比urls.txt与raw.csv行数
去重与日期日期无重复,格式统一duplicated().sum()为 0
字段完整关键列空值率 ≤ 5%空值率统计
数值一致性分项之和与总量偏差在阈值内check_gap列分位数
结论可追溯每条结论能指到具体表或图人工抽查 3 条
图表同源图由clean.csv生成抽查 3 个数据点回表
复现性换台机器照脚本能跑出同样结果清空 out 目录重跑

这张表可以直接当交付附件。下面这段体检脚本负责把能自动化的部分跑掉,输出一份可直接贴进报告的结果。

# check_pipeline.py —— 交付前的自动体检,输出可直接贴进验收报告 import pandas as pd def check(path, must_cols, date_col="date", expect_days=None): df = pd.read_csv(path, parse_dates=[date_col]) report = {} report["缺列"] = [c for c in must_cols if c not in df.columns] report["空值率"] = df[must_cols].isna().mean().round(3).to_dict() report["重复日期数"] = int(df[date_col].duplicated().sum()) span = (df[date_col].max() - df[date_col].min()).days + 1 report["日期跨度"] = span report["覆盖率"] = round(len(df) / expect_days, 3) if expect_days else "未设置" return report print(check("out/clean.csv", must_cols=["date", "total", "rail", "road", "air"], expect_days=26))

must_cols写的是硬性字段,少一个就算不合格;expect_days按你实际统计的天数填,覆盖率低于 0.95 就要回头查采集。这份脚本我一般放在交付目录根下,评审时当场跑一遍,比口头解释有说服力。

答辩叙述建议按“问题—链路—证据—边界”四段走,不要按“我用了什么模型”走。先讲清楚要解决的数据问题是什么,再讲四层链路各自负责什么、为什么这么分,然后拿两三个可追溯的结论做证据,最后主动说明边界:哪些任务这个方案做得好,哪些任务模型会翻车、需要人工兜底。主动讲边界反而加分,因为评委最怕的是把工具当万能。

有一个细节值得单独准备:把“模型结论不一致”这件事讲成方法而不是缺陷。说清楚你固定了提示词模板、固定了样本、同一任务跑了三次取交集,这套流程本身就是方案的一部分。

从那以后我每次交付这类流水线方案,都会先清空输出目录,从urls.txt开始完整重跑一遍,再对着体检清单逐项打勾,最后才动笔写报告。跑不通的链路,写得再漂亮也撑不过三个追问。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询