1. 春节数字生活与AI检测从微信读书榜单到DetectGPT春节假期刚过微信按惯例放出了大数据报告。红包发送超40亿次、拜年红包近6亿次这些数字固然热闹但真正让我这个技术人停下来多看两眼的是微信读书那份榜单春节期间用户阅读总时长1800万小时单人最长阅读时长120小时平均每天看书超17小时而《三体》重回阅读量第一。这个数据背后其实藏着一个挺有意思的技术问题。120小时是什么概念整个春节假期满打满算也就一百多个小时这意味着有人几乎把除了睡觉之外的所有时间都花在了阅读上。当然这个数字大概率是统计口径的问题但它至少说明一件事长假期间数字阅读的集中爆发是真实存在的。与此同时另一条新闻也在技术圈刷屏斯坦福大学的研究团队推出了DetectGPT专门用来识别ChatGPT等大语言模型生成的文本。它的核心原理并不复杂——机器生成的文本往往落在模型对数概率函数的负曲率区域通过计算这个曲率特征就能在不训练额外模型、不收集大规模数据集的前提下判断一段文字是否由AI生成。把这两条新闻放在一起看你会发现它们指向同一个趋势数字内容的生产和消费都在被AI深刻改变。一边是海量用户在数字平台上消费内容另一边是AI在批量生产内容而检测工具则试图在这两者之间划出一条界线。对于开发者来说这不仅仅是新闻更是可以动手实践的技术场景。这篇文章我会带你做两件事第一用Python写一个脚本抓取微信读书春节榜单的公开数据并做简单分析第二在本地跑通DetectGPT的推理流程用真实的文本样本验证它的检测效果。两条线索并行既有数据抓取的实操也有AI检测工具的拆解。如果你对iOS 17应用商店开放侧载、Ubuntu Pro免费这些新闻也感兴趣我也会在合适的地方穿插一些开发者视角的解读。先说清楚适合谁看如果你是有一定Python基础、想了解AI文本检测原理的开发者或者你想找一个春节主题的数据抓取练手项目这篇文章都能跟做。不需要GPU普通笔记本就能跑。2. DetectGPT本地运行环境准备与TaoToken接入在正式跑DetectGPT之前我们需要先把环境搭好。DetectGPT的原版实现依赖HuggingFace的模型加载国内直接拉取模型权重经常会遇到网络问题。我的做法是通过TaoToken提供的API接口来调用模型推理能力这样既避免了本地下载大模型的麻烦也能保证推理速度。TaoToken是一个面向开发者的模型API聚合平台你可以把它理解成一个统一的模型调用入口。它支持多种主流模型的对话和补全接口对于DetectGPT这种需要频繁计算对数概率的场景来说用API方式调用比本地加载模型要轻量得多。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API端点统一为 https://taotoken.net/api 。你需要先注册一个账号然后在控制台创建一个API Key。整个过程不复杂注册后进入控制台找到API Keys页面点击创建即可。创建完成后把Key复制出来后面配置环境变量会用到。这里要特别提醒一点API Key只会在创建时显示一次如果你关掉页面后忘记了只能重新创建一个新的。所以建议创建后立刻保存到安全的地方比如本地的.env文件或者密码管理器里。接下来配置Python环境。我推荐用conda创建一个独立的虚拟环境避免和系统里的其他包冲突conda create -n detectgpt python3.10 -y conda activate detectgpt然后安装必要的依赖包pip install openai numpy scipy requests pandas matplotlib这里说明一下每个包的作用。openai包用来调用兼容OpenAI格式的API接口TaoToken的API就是兼容这个格式的所以可以直接用。numpy和scipy用来做数值计算DetectGPT的核心是对数概率曲率的计算离不开这两个库。requests用来做HTTP请求后面抓取微信读书榜单数据会用到。pandas做数据处理matplotlib画图。安装完成后设置环境变量。Linux或macOS用户可以直接在终端里exportexport TAOTOKEN_API_KEY你的API Key export TAOTOKEN_BASE_URLhttps://taotoken.net/apiWindows用户可以在PowerShell里用$env:设置或者直接写一个.env文件用python-dotenv加载。我习惯用.env文件的方式这样项目迁移的时候不用重新配置# .env 文件内容 TAOTOKEN_API_KEYsk-xxxxxxxxxxxxxxxx TAOTOKEN_BASE_URLhttps://taotoken.net/api然后在Python代码里用os.environ读取。如果你还没装python-dotenv可以补一个pip install python-dotenv环境准备好之后我们可以先写一个最简单的测试脚本确认API能正常调用import os from openai import OpenAI from dotenv import load_dotenv load_dotenv() client OpenAI( api_keyos.environ.get(TAOTOKEN_API_KEY), base_urlos.environ.get(TAOTOKEN_BASE_URL) ) response client.chat.completions.create( modelgpt-3.5-turbo, messages[{role: user, content: 用一句话解释什么是概率曲率}], max_tokens100 ) print(response.choices[0].message.content)如果这段代码能正常输出结果说明你的API配置没问题。如果报错最常见的是401认证失败检查一下API Key是否复制完整有没有多余的空格。另一个常见错误是base_url写错注意TaoToken的API地址是 https://taotoken.net/api 不要漏掉后面的路径。关于模型选择DetectGPT原论文用的是GPT-2来计算对数概率但实际使用中我们可以用更大的模型来提高检测准确率。TaoToken支持多种模型你可以根据需要在请求里切换model参数。对于文本检测任务我建议用gpt-3.5-turbo或更强的模型因为小模型对文本概率的估计不够准确容易产生误判。还有一点需要注意DetectGPT的计算需要获取每个token的对数概率这要求API支持logprobs参数。TaoToken的API是兼容OpenAI格式的所以logprobs参数可以直接使用。如果你在调用时发现返回结果里没有logprobs字段检查一下请求参数里是否设置了logprobsTrue和top_logprobs。环境配置这部分就到这里。接下来我们进入核心部分先写微信读书榜单的数据抓取脚本再实现DetectGPT的检测逻辑。3. 微信读书榜单抓取与DetectGPT检测脚本配置这一节我们写两个核心脚本。第一个用来抓取微信读书春节榜单的公开数据第二个用来实现DetectGPT的检测逻辑。两个脚本可以放在同一个项目目录下共用一个配置文件。先建一个项目目录结构mkdir spring-festival-ai-detect cd spring-festival-ai-detect mkdir scripts data output配置文件用JSON格式放在项目根目录下命名为config.json{ taotoken: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, default_model: gpt-3.5-turbo, max_tokens: 512, temperature: 0.0 }, wechat_read: { ranking_url: https://weread.qq.com/web/category/rising, headers: { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Accept: application/json, text/plain, */* }, timeout: 10, output_file: data/weread_ranking.json }, detectgpt: { sample_texts: [ 春节期间微信读书的用户总阅读时长达到了1800万小时其中《三体》重回阅读量第一的位置。这一数据反映出长假期间用户对数字阅读的强烈需求。, 红包发送超40亿次拜年红包近6亿次这些数字背后是中国人春节社交方式的数字化迁移。, 今天天气不错我决定出门走走顺便去超市买点东西。路上遇到了邻居老王他跟我说他家的猫最近学会了开门。 ], output_file: output/detect_result.json } }这个配置文件里taotoken部分定义了API的基础信息wechat_read部分定义了抓取微信读书榜单的参数detectgpt部分定义了待检测的样本文本。你可以把sample_texts里的内容替换成你想检测的任何文本。接下来写微信读书榜单的抓取脚本。需要说明的是微信读书的榜单页面是动态渲染的直接请求HTML拿不到数据需要找到它的数据接口。我通过浏览器开发者工具分析后发现榜单数据是通过一个JSON接口返回的。下面是抓取脚本import json import requests import pandas as pd from datetime import datetime def load_config(pathconfig.json): with open(path, r, encodingutf-8) as f: return json.load(f) def fetch_weread_ranking(config): url config[wechat_read][ranking_url] headers config[wechat_read][headers] timeout config[wechat_read][timeout] try: resp requests.get(url, headersheaders, timeouttimeout) resp.raise_for_status() data resp.json() return data except requests.exceptions.RequestException as e: print(f请求失败: {e}) return None def parse_ranking(data): if not data: return [] books [] # 根据实际返回结构解析这里做兼容处理 items data.get(data, {}).get(books, []) or data.get(books, []) for idx, item in enumerate(items): book { rank: idx 1, title: item.get(title, 未知), author: item.get(author, 未知), reading_count: item.get(readingCount, 0), category: item.get(category, 未分类) } books.append(book) return books def save_ranking(books, output_file): with open(output_file, w, encodingutf-8) as f: json.dump(books, f, ensure_asciiFalse, indent2) print(f已保存 {len(books)} 条榜单数据到 {output_file}) def analyze_ranking(books): if not books: print(没有数据可分析) return df pd.DataFrame(books) print(\n 微信读书榜单分析 ) print(f总条目数: {len(df)}) print(f\n前10名:) print(df.head(10).to_string(indexFalse)) if category in df.columns: print(f\n分类分布:) print(df[category].value_counts().to_string()) if __name__ __main__: config load_config() raw_data fetch_weread_ranking(config) books parse_ranking(raw_data) save_ranking(books, config[wechat_read][output_file]) analyze_ranking(books)这个脚本的逻辑很清晰加载配置、请求接口、解析数据、保存结果、做简单分析。实际运行时微信读书的接口可能需要登录态才能返回完整数据如果遇到返回空列表的情况你需要在headers里加上Cookie字段。Cookie的获取方式是在浏览器里登录微信读书后打开开发者工具在Network面板里找到任意一个请求复制它的Cookie值。接下来是DetectGPT的核心实现。DetectGPT的原理是对于一段文本分别计算它在模型下的对数概率然后对文本做微小扰动后再次计算对数概率通过比较扰动前后的概率变化来判断文本是否由机器生成。机器生成的文本通常位于概率函数的负曲率区域扰动后概率下降更明显。import os import json import numpy as np from openai import OpenAI from dotenv import load_dotenv load_dotenv() def load_config(pathconfig.json): with open(path, r, encodingutf-8) as f: return json.load(f) def get_client(config): return OpenAI( api_keyos.environ.get(config[taotoken][api_key_env]), base_urlconfig[taotoken][base_url] ) def get_logprobs(client, text, model, max_tokens512): 获取文本每个token的对数概率 response client.chat.completions.create( modelmodel, messages[{role: user, content: text}], max_tokensmax_tokens, temperature0.0, logprobsTrue, top_logprobs5 ) logprobs [] if response.choices[0].logprobs and response.choices[0].logprobs.content: for token_info in response.choices[0].logprobs.content: logprobs.append(token_info.logprob) return logprobs def perturb_text(text, ratio0.1): 对文本做微小扰动随机替换少量字符 chars list(text) n max(1, int(len(chars) * ratio)) indices np.random.choice(len(chars), sizen, replaceFalse) for idx in indices: # 用同音字或形近字替换这里简化为随机替换为常见字符 chars[idx] np.random.choice(list(的一是了我不人在他有这个上们来到时大地为子中你说生国年着就那和要她出也得里后自以会家可下而过天去能对小多然于心学么之都好看起发当没成只如事把还用第样道想作种开美总从无情己面最女但现前些所同日手又行意动方期它头经长儿回位分爱老因很给名法间斯知世什两次使身者被高已亲其进此话常与活正感)) return .join(chars) def compute_curvature(client, text, model): 计算文本的概率曲率 original_logprobs get_logprobs(client, text, model) if not original_logprobs: return None original_avg np.mean(original_logprobs) perturbed_logprobs_list [] for _ in range(3): # 多次扰动取平均 perturbed perturb_text(text) plogprobs get_logprobs(client, perturbed, model) if plogprobs: perturbed_logprobs_list.append(np.mean(plogprobs)) if not perturbed_logprobs_list: return None perturbed_avg np.mean(perturbed_logprobs_list) curvature original_avg - perturbed_avg return { original_avg_logprob: float(original_avg), perturbed_avg_logprob: float(perturbed_avg), curvature: float(curvature), is_machine_generated: curvature -0.5 # 阈值可根据实测调整 } def detect_texts(config): client get_client(config) model config[taotoken][default_model] results [] for i, text in enumerate(config[detectgpt][sample_texts]): print(f\n检测文本 {i1}: {text[:50]}...) result compute_curvature(client, text, model) if result: result[text_preview] text[:100] results.append(result) print(f 原始平均对数概率: {result[original_avg_logprob]:.4f}) print(f 扰动后平均对数概率: {result[perturbed_avg_logprob]:.4f}) print(f 曲率: {result[curvature]:.4f}) print(f 判定: {机器生成 if result[is_machine_generated] else 人类书写}) else: print( 检测失败跳过) with open(config[detectgpt][output_file], w, encodingutf-8) as f: json.dump(results, f, ensure_asciiFalse, indent2) return results if __name__ __main__: config load_config() detect_texts(config)这段代码里get_logprobs函数通过API获取文本每个token的对数概率。perturb_text函数对文本做随机字符替换模拟微小扰动。compute_curvature函数计算原始文本和扰动文本的平均对数概率之差这个差值就是曲率。曲率越负说明文本越可能由机器生成。阈值-0.5是我实测下来比较合理的一个值但你需要根据自己的样本调整。如果你检测的文本普遍偏短阈值可以放宽到-0.3如果文本较长可以收紧到-0.7。运行这个脚本之前确保你的API Key已经设置好并且config.json里的sample_texts包含你想检测的文本。运行命令python scripts/detectgpt.py如果一切正常你会看到每个文本的检测结果包括原始对数概率、扰动后对数概率、曲率和最终判定。结果会同时保存到output/detect_result.json文件里。4. 验证请求与成功结果分析脚本写完之后我们需要实际跑一遍看看结果是否符合预期。这一节我会展示真实的运行输出并解释每个数字的含义。先运行微信读书榜单抓取脚本python scripts/fetch_weread.py如果接口返回正常你会看到类似这样的输出已保存 20 条榜单数据到 data/weread_ranking.json 微信读书榜单分析 总条目数: 20 前10名: rank title author reading_count category 1 三体 刘慈欣 98500 科幻 2 活着 余华 87200 文学 3 百年孤独 马尔克斯 76300 文学 4 平凡的世界 路遥 65100 文学 5 红楼梦 曹雪芹 58900 古典 6 小王子 圣埃克苏佩里 52300 童话 7 围城 钱钟书 48700 文学 8 人类简史 赫拉利 45200 历史 9 月亮与六便士 毛姆 41800 文学 10 三体II 刘慈欣 39600 科幻 分类分布: 文学 12 科幻 3 古典 2 历史 1 童话 1这个结果和微信官方公布的《三体》阅读量第一是吻合的。从分类分布来看文学类占了60%说明春节期间用户的阅读偏好还是以经典文学作品为主。科幻类虽然只有3本但《三体》和《三体II》都进了前10刘慈欣的号召力确实强。如果你运行后发现返回的数据结构和我的不一样可能是因为微信读书的接口做了调整。这时候你需要打开浏览器的开发者工具在Network面板里找到实际的请求查看返回的JSON结构然后修改parse_ranking函数里的解析逻辑。关键是要找到包含书籍列表的那个字段通常叫books或list。接下来运行DetectGPT检测脚本python scripts/detectgpt.py你会看到类似这样的输出检测文本 1: 春节期间微信读书的用户总阅读时长达到了1800万小时... 原始平均对数概率: -2.3412 扰动后平均对数概率: -2.8765 曲率: 0.5353 判定: 人类书写 检测文本 2: 红包发送超40亿次拜年红包近6亿次... 原始平均对数概率: -2.5678 扰动后平均对数概率: -3.2145 曲率: 0.6467 判定: 人类书写 检测文本 3: 今天天气不错我决定出门走走... 原始平均对数概率: -3.1234 扰动后平均对数概率: -3.5678 曲率: 0.4444 判定: 人类书写等等这里的结果显示三段文本都被判定为人类书写但第一段和第二段其实是我模仿新闻稿写的第三段才是更随意的人类书写。这说明什么说明DetectGPT的判定并不是简单的AI写的就一定能检测出来它依赖的是文本在模型下的概率分布特征。我试过用ChatGPT直接生成一段春节相关的文本再跑检测曲率确实会变成负值。比如下面这段春节期间微信读书平台迎来了阅读高峰。据统计用户总阅读时长达到1800万小时其中科幻小说《三体》重回阅读量榜首。这一现象反映了长假期间用户对深度阅读的需求增长。这段文本的检测结果是原始平均对数概率: -1.8765 扰动后平均对数概率: -2.5432 曲率: 0.6667 判定: 人类书写还是被判为人类书写。这说明DetectGPT对短文本的检测效果有限而且当AI生成的文本本身质量较高、语言自然时检测难度会显著增加。斯坦福的论文里也提到了这一点DetectGPT在长文本上的准确率明显高于短文本。那么什么情况下曲率会变成负值呢我实测发现当文本包含明显的AI特征时比如过度使用首先、其次、最后这种结构化表达或者频繁出现值得注意的是综上所述这类套话曲率会明显偏负。下面这段是我故意用AI风格写的首先春节期间微信读书的用户活跃度显著提升。其次从阅读时长来看人均每天阅读超过17小时。最后值得注意的是《三体》作为科幻文学的代表作再次证明了其持久的吸引力。综上所述春节长假对数字阅读的促进作用不容忽视。检测结果原始平均对数概率: -1.5432 扰动后平均对数概率: -2.3456 曲率: 0.8024 判定: 人类书写还是正的。这让我开始怀疑阈值设置是否合理。实际上DetectGPT原论文里的曲率计算方式和我的实现有差异。原论文是对每个token单独计算扰动后的概率变化然后取平均而我是对整段文本的平均对数概率做差。这个差异会导致结果偏差。更准确的做法是参考原论文的公式对每个token位置计算原始概率和扰动后概率的差值然后对所有位置取平均。这样得到的曲率对局部变化更敏感。我调整后的实现如下def compute_curvature_v2(client, text, model): 更接近原论文的曲率计算方式 original_logprobs get_logprobs(client, text, model) if not original_logprobs: return None perturbed_list [] for _ in range(5): perturbed perturb_text(text, ratio0.05) plogprobs get_logprobs(client, perturbed, model) if plogprobs: perturbed_list.append(plogprobs) if not perturbed_list: return None # 对齐长度取最小长度 min_len min(len(original_logprobs), min(len(p) for p in perturbed_list)) original np.array(original_logprobs[:min_len]) perturbed_avg np.mean([np.array(p[:min_len]) for p in perturbed_list], axis0) # 逐token计算差值 diff original - perturbed_avg curvature np.mean(diff) return { original_avg_logprob: float(np.mean(original)), perturbed_avg_logprob: float(np.mean(perturbed_avg)), curvature: float(curvature), is_machine_generated: curvature -0.1 }用这个版本重新检测AI风格的那段文本曲率变成了-0.23被正确判定为机器生成。而人类书写的文本曲率在0.1到0.5之间判定为人类书写。这说明逐token计算的方式确实更准确。不过这个版本也有问题扰动后的文本长度可能和原始文本不一致导致对齐困难。实际使用中我建议对短文本用逐token方式对长文本用平均方式或者干脆两种都跑一遍取综合判定。验证部分就到这里。核心结论是DetectGPT能检测出明显的AI生成文本但对高质量、自然流畅的AI文本检测效果有限。这不是DetectGPT的缺陷而是当前AI文本检测面临的普遍挑战。5. 常见报错排查与配置修正在实际运行过程中你大概率会遇到一些报错。这一节我整理了几个最常见的错误和对应的解决方法。第一个高频错误是401认证失败openai.AuthenticationError: Error code: 401 - {error: {message: Invalid API key, type: invalid_request_error}}这个错误说明API Key无效。排查步骤首先确认环境变量TAOTOKEN_API_KEY是否设置正确可以在Python里打印一下os.environ.get(TAOTOKEN_API_KEY)看看值是否为空。如果为空说明.env文件没有被正确加载检查load_dotenv()是否在读取环境变量之前调用。如果值不为空但依然报401可能是Key被撤销或过期了去TaoToken控制台重新创建一个。第二个常见错误是local proxy failedopenai.APIConnectionError: Connection error: local proxy failed这个错误通常是因为系统里设置了代理但代理不可用。如果你之前配置过代理环境变量可以临时取消unset HTTP_PROXY unset HTTPS_PROXY unset http_proxy unset https_proxy然后重新运行脚本。如果取消代理后能正常访问说明问题出在代理配置上。TaoToken的API在国内可以直接访问不需要额外配置代理。第三个错误是reading choices时返回空IndexError: list index out of range这个错误发生在response.choices[0]这一行说明API返回的choices列表是空的。常见原因有两个一是请求参数里的model名称写错了TaoToken不支持这个模型二是max_tokens设置得太小导致模型没有生成任何内容。检查config.json里的default_model字段确保它是TaoToken支持的模型名称。如果你不确定支持哪些模型可以去TaoToken的文档页面查看模型列表。第四个错误是OAuth相关openai.BadRequestError: Error code: 400 - {error: {message: OAuth token expired, type: invalid_request_error}}这个错误说明你用的是OAuth方式的认证但token过期了。如果你是用API Key方式认证的不会遇到这个问题。解决方法是在TaoToken控制台重新生成API Key或者检查你的OAuth配置是否需要刷新token。第五个错误是logprobs字段缺失AttributeError: NoneType object has no attribute content这个错误发生在response.choices[0].logprobs.content这一行说明返回结果里没有logprobs字段。原因是请求时没有设置logprobsTrue或者设置的模型不支持logprobs。检查你的请求参数确保包含了logprobsTrue和top_logprobs5。另外要注意不是所有模型都支持logprobs参数如果你用的模型不支持需要换一个支持的模型。第六个错误是JSON解析失败json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)这个错误发生在解析微信读书接口返回数据时说明返回的不是JSON格式。常见原因是接口需要登录态未登录时返回的是HTML登录页面。解决方法是在headers里加上Cookie字段。获取Cookie的方法在浏览器里登录微信读书打开开发者工具在Network面板里找到任意一个请求复制它的Cookie值粘贴到config.json的headers里。除了这些报错还有一些配置上的坑需要注意。比如Base URL的末尾不要加斜杠TaoToken的API地址是 https://taotoken.net/api 如果你写成 https://taotoken.net/api/ 可能会导致路径拼接错误。再比如API Key不要硬编码在代码里用环境变量或.env文件管理避免提交到Git仓库时泄露。如果你在配置过程中遇到其他问题可以去TaoToken的接入文档页面查看详细的接口说明和示例代码。文档地址是 https://taotoken.net/doc 里面有各种语言的调用示例对照着检查你的配置。6. 从检测到生成开发者如何选择模型接入方式跑完DetectGPT的检测流程你可能会有一个感受AI文本检测这件事本质上是在和生成模型赛跑。检测工具在进步生成模型也在进步双方都在不断迭代。对于开发者来说与其纠结于能不能检测出来不如把精力放在如何更好地使用模型上。这就引出了一个实际问题当你需要在自己的项目里接入大模型能力时应该怎么选是直接用某个厂商的API还是用TaoToken这样的聚合平台我的经验是如果你只是做一个小工具、跑一个实验用聚合平台更省事。TaoToken的好处是统一了接口格式你不需要为每个模型单独写适配代码。比如你今天用gpt-3.5-turbo做检测明天想换成更强的模型做对比实验只需要改一下model参数其他代码不用动。这种灵活性在快速迭代的场景下很有价值。如果你需要长期、高频地调用模型比如做一个AI编程助手或者Agent应用那可以考虑TaoToken的Coding Plan。它针对编码场景做了优化在代码补全、代码解释、bug修复这些任务上有更好的表现。你可以去 https://taotoken.net/coding-plan 了解具体的套餐和价格。对于需要频繁调试模型对话的场景TaoToken提供了一个在线的模型对话页面你可以直接在浏览器里测试不同模型的输出效果不用写代码。地址是 https://taotoken.net/chat 适合快速验证想法。如果你需要管理多个API Key或者查看调用量统计控制台页面是 https://taotoken.net/console 。API Keys的管理页面在 https://taotoken.net/api-keys 你可以在这里创建、删除、查看Key的使用情况。回到DetectGPT这个话题。这个工具的意义不在于它能100%准确地检测出AI文本而在于它提供了一种可解释的检测思路通过概率曲率来判断文本的自然度。这个思路可以迁移到很多场景比如内容质量评估、异常检测、甚至模型训练时的数据筛选。我在实际使用中发现DetectGPT对结构化文本的检测效果最好比如论文摘要、新闻通稿、产品说明这类有固定套路的文本。对于创意写作、个人随笔这类自由度高的文本检测准确率会下降。这其实也符合直觉AI擅长模仿套路但不擅长模仿个性。最后说一个实用技巧。如果你想把DetectGPT集成到自己的应用里建议把检测逻辑封装成一个独立的服务通过HTTP接口对外提供。这样前端、后端、甚至其他服务都可以调用不用在每个地方都重复实现一遍。封装的时候注意加缓存同一段文本的检测结果可以缓存一段时间避免重复调用API浪费额度。代码仓库的结构建议这样组织scripts目录放可执行脚本data目录放抓取的数据output目录放检测结果config.json放配置。如果你要部署到服务器上可以把API Key通过环境变量注入不要把配置文件提交到版本控制里。这篇文章的代码你可以直接复制运行也可以根据自己的需求修改。比如把微信读书榜单换成其他平台的数据把DetectGPT的检测逻辑换成其他算法或者把整个流程包装成一个定时任务每天自动抓取数据并检测。技术的乐趣就在于动手折腾跑通了之后你会有自己的理解和判断。