☰
DeepSeek API 实时舆情监控:从数据管道到预警触发实战
2026/9/29 4:50:53 网站建设 项目流程

简介:面向需要构建社交媒体舆情监控系统的开发者,DeepSeek实时数据处理API指南提供了从API原理到系统落地的完整路径。文档共35页,单个PDF文件压缩打包,大小2.18MB,内容涵盖系统架构设计、API调用流程、数据采集与清洗、情感分析算法集成、可视化展示、性能优化、安全隐私保护及测试部署等核心模块,适合初中级开发者系统性学习。全册从引言、系统概述、API简介到案例分析与未来展望共13章,逐步讲解如何采集社交媒体数据、处理缺失值与噪声、进行中文分词与停用词过滤、集成情感分析和主题分类算法,并给出ECharts、Matplotlib等可视化工具的选型建议。已有95人学习浏览,学习热度不高但内容详实;通过学习可掌握DeepSeek API的实际调用方法,理解从需求分析到系统上线全流程,并依据清晰目录快速定位所需章节,直接对照构建自己的舆情监控原型系统,降低试错成本。

1. 舆情监控为什么非实时不可:把 DeepSeek API 从“聊天工具”改造成“报警器”

做社交媒体舆情监控,最怕的不是模型不够聪明,而是信号来得太慢。一条负面评论从出现到被转发放大,窗口往往以小时计;如果还是每天凌晨跑一次批处理,把前一天的数据统一喂给模型做情感分析,等报告出来,公关和运营早过了最佳响应时间。用 DeepSeek API 构建实时数据处理链路,本质是把“文本理解”的延迟从“天级”压到“分钟级甚至秒级”,让抓取、清洗、情感判定、主题分类和预警触发在同一条流式管道里完成。这套方案适合三类人:维护品牌口碑的小型运营团队、做竞品情报的产品经理,以及想用最少代码把大模型接进生产管道的后端工程师。先说结论:实时舆情系统并不依赖一个更聪明的模型,它依赖你把调度、上下文窗口和回调这三件事管好,而 DeepSeek API 恰好把这些能力都开放了出来。

2. 数据管道设计:把社交媒体文本变成 DeepSeek 能消费的输入

2.1 抓取层与预处理层:哪些活儿别交给大模型

一个常见的误区是,把采集到的原始评论直接抛给 DeepSeek,让模型同时做“去噪、去重、情感判断、主题归纳”。这看起来省事,实际又慢又贵,而且效果不稳定。原因在于社交媒体文本里充斥着表情符号、@提醒、短链、楼层回复、乱码和重复转发,这些噪声会占用上下文窗口,干扰模型判断。正确的分工是:抓取层只负责拿数据,预处理层用正则和规则把“模型不该看的东西”先去掉,清洗干净后再交给 DeepSeek。

以一条典型微博评论为例,预处理至少要做三件事:去掉 HTML 实体和短链接、去掉连续重复字符和纯表情片段、截断超长文本。第一件事是避免模型把&当成内容分析;第二件事是防止“哈哈哈哈哈哈哈哈哈哈”这种噪声把情感倾向带偏;第三件事是为后面提到的上下文窗口限制留出余量。这里有个我实际用过的清洗函数,放在采集脚本和 API 调用之间:

import re def clean_comment(raw: str, max_len: int = 500) -> str: # 去掉 HTML 实体与短链接,避免模型把它们当正文 text = re.sub(r"https?://\S+|&\w+;", "", raw) # 去掉括号内容和多余的 @ 提醒 text = re.sub(r"[\[\((].*?[\]\))]", "", text) # 连续重复字符压缩成单个,比如 哈哈哈 -> 哈 text = re.sub(r"(.)\1{3,}", r"\1", text) # 按字符截断,防止超长文本吃满上下文 return text[:max_len]

清洗时有个取舍:截断长度max_len设多少合适。设太小,长评论里的关键信息被切掉;设太大,单次请求的 token 消耗直线上升。从成本和效果平衡的角度看,我的习惯是先按 500 字符截断,如果一条评论确实超过 500 字,再单独走“先摘要后分析”的逻辑,而不是直接调大阈值。预处理层还有一个容易被忽略的职责:把同一条内容的重复转发合并掉。两三百字的一模一样的抱怨,本质上只算一个舆情事件,合并后既能省 token,又避免 DeepSeek 把重复文本当成“高热度信号”误触发预警。

2.2 首次 API 调用:用 DeepSeek 完成单条评论的情感与主题分析

数据清洗完了,就可以调用 DeepSeek API。DeepSeek 提供的是 OpenAI 兼容接口,所以不需要引入特殊的 SDK,直接用 openai 的 Python 库就能跑通,只是把base_url指到 DeepSeek 的地址。下面这段代码是我在搭建第一个舆情原型时写下的最小调用,完成“一条评论 → 情感判定 + 主题分类”的完整闭环:

from openai import OpenAI client = OpenAI( api_key="sk-你的key", base_url="https://api.deepseek.com" ) def analyze_comment(comment: str) -> dict: resp = client.chat.completions.create( model="deepseek-chat", messages=[ { "role": "system", "content": ( "你是社交媒体舆情分析助手。" "判断评论的情感极性(正面/中性/负面)和所属主题," "只输出 JSON,不要解释。" ), }, {"role": "user", "content": comment}, ], temperature=0.1, max_tokens=256, stream=False, ) content = resp.choices[0].message.content return json.loads(content)

这里最重要的参数是temperature=0.1。舆情判定是一个需要“稳定性、可复现性”的任务,不是创意写作,温度越高,同一条评论在不同时间调用可能给出完全相反的情感结论。max_tokens=256则是给输出设上限,防止模型在罕见场景下输出一大段解释性文字,把响应时间拖长。调用返回后,resp.choices[0].message.content是模型输出的文本,因为系统提示里强制要求 JSON,所以这里直接json.loads就能解析。实际生产里要加上 try/except,因为 DeepSeek 偶尔会在输出里夹带一点格式噪声,后面避坑章会专门讲。

2.3 流式响应与批量异步:两种实时性取舍

上面演示的是非流式调用,stream=False意味着要等服务端把完整回复生成完才返回。对单条评论来说,几百 token 的输出通常几秒内能拿到,体验没问题。但舆情系统真正要处理的是“成百上千条评论同时涌进来”的场景,这时两条路可选:一条是给每条评论都发起一个流式请求,把响应当成“打字机”一样边生成边接收;另一条是攒一个批次,一次请求分析多条评论。

流式响应的真正价值在于“首个 token 更快”,而舆情预警关心的不是完整报告,而是“这条评论是不是负面、要不要报警”。实际项目中我用stream=True做了一版“边接收边判断”的逻辑:先让模型吐出情感字段,只要从流里读到“negative”这个信号,立即触发一轮轻量级预警,后面的主题分类结果再慢慢补全。代码上用 openai 库的流式接口实现:

def analyze_comment_stream(comment: str): resp = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": "判断评论情感,先输出情感词,再输出主题。"}, {"role": "user", "content": comment}, ], temperature=0.1, max_tokens=256, stream=True, ) for chunk in resp: delta = chunk.choices[0].delta.content if delta: # 这里可以做实时判断:一旦出现 negative 关键词,先报警 yield delta

流式模式的代价是不能直接拿到完整 JSON 再解析,需要对每个 chunk 做增量拼接,同时处理“一句话被切成两半”的情况。所以我的取舍是:预警触发用流式,因为抢时间;最终落库和报表用非流式,因为要完整的结构化结果。两者配合,一个管“快报警”,一个管“准记录”。

3. 舆情监控三大件的代码实现:主题分类、情感判定与预警触发

3.1 输出结构化约束:让 DeepSeek 乖乖返回 JSON

2.2 里已经提到“系统提示中强制要求 JSON”。这里展开讲一下为什么不能靠“请输出 JSON”这种软提示。社交媒体文本的表达方式千奇百怪,模型很容易被带偏,比如用户评论里写“这是一段 JSON”,模型可能真的把这句话当成指令去执行。DeepSeek API 支持response_format参数,把它显式设成{"type": "json_object"},再配合系统提示里明确出现“JSON”字样,输出可靠性会高很多。

resp = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": "你是舆情分析助手。只输出 JSON。"}, {"role": "user", "content": "分析这条评论:\n" + comment}, ], response_format={"type": "json_object"}, temperature=0.1, max_tokens=256, )

注意一个边界:response_format只保证输出是 JSON 结构,不保证 JSON 里的字段一定齐全。模型可能漏掉topic字段,或者把sentiment的值拼错成negtive。所以解析后的校验环节不能省,标准做法是这样:

import json def safe_parse(content: str, default_topic: str = "其他"): try: data = json.loads(content) except json.JSONDecodeError: # 极端情况:内容被截断或夹杂了额外文本,走兜底解析 data = {} return { "sentiment": data.get("sentiment", "neutral"), "topic": data.get("topic", default_topic), "score": float(data.get("score", 0.5)), }

把default_topic设为“其他”,把情感默认值设为“中性”,避免一次解析失败导致整条评论被丢弃。舆情系统宁可多录一条“待人工复核”的中性评论,也不能因为解析失败把一条重要负面评论漏掉。

3.2 情感判定与主题分类的 prompt 模板与参数

情感和主题是两个不同维度的任务,放在同一次调用里能省一半 token,但 prompt 必须把任务边界写清楚。我常用的模板是这样的:

system_prompt = """ 你是舆情分析引擎。对给定评论完成两项任务: 1. 情感判定:输出 positive / neutral / negative 三选一; 2. 主题分类:从【产品质量、物流配送、客服售后、价格争议、品牌形象、其他】中选一个。 严格输出如下 JSON 格式,不要多余内容: {"sentiment": "...", "topic": "...", "score": 0.0-1.0} score 表示情感强度:越接近1,正面或负面情绪越强烈。 """

这里有个细节:主题分类的候选集要限定死。如果不给候选集,模型会把主题归纳得五花八门,“物流太慢”和“快递没收到”可能被分成两个主题,后续统计根本无法聚合。候选集本质上是把“分类”从开放生成变成“选择题”,模型的准确率会明显提升。score字段我要求模型输出 0 到 1 的浮点数,它表示情感强度而不是极性,极性由sentiment字段表达。比如一条评论写“这产品质量差得离谱”,sentiment是 negative,score可能是 0.95;写“有点失望但还能接受”,sentiment是 negative,score大概在 0.6。预警阈值做在score上,而不是只依赖sentiment。

这个模板还隐含一个参数考量:system_prompt和用户评论加起来才是完整的上下文。如果system_prompt写得过长,单条评论的 token 开销就会变大,直接抬升 API 调用量。我的原则是 system prompt 控制在 200 token 以内,把候选集和输出格式说清楚就够了,不要在里面写“你是一个优秀的人工智能助手”这类废话。

3.3 预警触发:判定结果如何以 webhook 形式推到钉钉/企业微信

DeepSeek 完成判定后,实时性就体现在“能不能立刻通知到人”。最常见的做法是把判定结果转成 webhook 消息推到钉钉或企业微信机器人。这里的关键不是调用 webhook 本身,而是“什么条件下触发预警”。我设计了一组规则:sentiment为 negative 且score >= 0.8时触发“紧急预警”,推送给相关负责人;score在 0.6 到 0.8 之间进“待观察队列”,每小时汇总一次;其余情况落库,不推送。

import requests WEBHOOK_URL = "https://oapi.dingtalk.com/robot/send?access_token=xxx" def send_alert(comment: str, result: dict): payload = { "msgtype": "markdown", "markdown": { "title": "舆情预警", "text": ( f"### 检测到负面舆情\n\n" f"**主题**: {result['topic']}\n\n" f"**情感强度**: {result['score']}\n\n" f"**原文**: {comment[:200]}" ), }, } requests.post(WEBHOOK_URL, json=payload, timeout=5)

timeout=5这个参数值得多说一句。webhook 是预警链路的最末端,如果钉钉接口响应慢,不应该让主线程一直等着。预警系统要的是“发送成功与否”,而不是“发送请求的完整响应”。所以这里的正确用法是:设置短超时,发送失败就记日志,由下一轮的重试机制补发,而不是同步阻塞整条评论处理管道。

4. DeepSeek API 舆情调用排障手册:5 个真实踩坑记录

4.1 401 Unauthorized:API Key 在定时任务里突然失效

现象:白天手动调试一切正常,凌晨的定时任务开始批量报错,错误信息是unexpected status 401 unauthorized: incorrect api key provided: sk-svcac****。查代码里配置的 key 没变,但请求就是过不去。

原因:API Key 并不是“配置在代码里就不会变”的。常见的情况有两种:一是团队里有人在上线时把环境变量文件覆盖了,新文件里的 key 被截断或者混入了旧值;二是 DeepSeek 控制台里的 key 被重置过,代码里用的还是旧 key。日志里打印出的sk-svcac****前面部分是对的,但后半段已经对不上。

解决:把 key 统一收口到环境变量或密钥管理服务,不要散落在各个脚本里。同时加一个“启动自检”函数,在定时任务真正开始跑之前先发一条最小请求验证 key 是否有效:

def check_api_key(): try: client.chat.completions.create( model="deepseek-chat", messages=[{"role": "user", "content": "ping"}], max_tokens=1, ) return True except Exception as e: return f"key check failed: {e}"

自检失败的预案是直接告警到手机,而不是让任务继续跑下去堆错误日志。这个自检每天定时任务启动前跑一次,能挡住绝大多数“key 静默失效”的问题。

4.2 400 上下文超限:评论全量拼接为什么会爆

现象:处理单个话题时,把“这个话题下所有评论”拼接成一条超长文本发给 DeepSeek,突然返回error 400: this model's maximum context length is 1048576 tokens。乍一看 1048576 这个数字很大,但请求还是被拒了。

原因:1048576 通常来自 API 网关对会话的硬上限,而 DeepSeek 模型本身的上下文窗口远小于这个值。这个报错真正想说的是“你发给模型的文本量超过了当前模型服务允许的上限”。最典型的翻车做法是:在 for 循环里不断往 messages 数组尾部追加新对话,跑了几小时后,messages 里累积的 token 数突破了模型窗口。

解决:给上下文加上“滑动窗口”机制。保证每次请求时,messages 总量不超过预设阈值。我用的是简单粗暴的截断策略:系统提示 + 最近 20 条消息,超过 4000 token 就把最早的消息删掉,或者先用一条摘要消息替换掉前面若干条历史。

def truncate_messages(messages, max_tokens=4000): total = sum(len(m["content"]) for m in messages) while total > max_tokens and len(messages) > 2: # 丢最老的一条用户消息,system 提示保留 removed = messages.pop(1) total -= len(removed["content"]) return messages

这里还有一个容易踩的点:截断不能丢 system prompt。舆情分析里 system prompt 承载了候选集和输出格式定义,丢了之后模型行为会漂移,所以上面代码里从索引 1 开始删,索引 0 永远保留。

4.3 tool calls need immediate results:模型要“干活”时你不能拖

现象:日志里出现deepseek messages tool calls need immediate results,任务在模型产生工具调用后直接失败。代码逻辑看起来是拿到了 tool_calls 后先存库,等人工确认后再把结果回传。

原因:这是 DeepSeek API 的一个硬性约束。模型返回 tool_calls 后,调用方必须在同一次会话中立即回传工具执行结果,然后继续对话,不能把 tool_calls 存起来过一会儿再处理。舆情管道里最常见的触发场景是:模型判断某条评论需要“查一下历史事件背景”,于是发了一个查询工具调用,而我们的服务端把这个调用丢到了异步队列里,几秒后才把结果往同一个 conversation 里塞,API 直接拒绝。

解决:把工具调用设计成“同步快速动作”。模型要查背景,就调用一个只查本地缓存或轻量数据库的函数,响应时间控制在几百毫秒内;如果需要联网搜索这种慢操作,就不要放进工具调用链,而是让模型先输出“需要补充背景资料”这个状态,主流程再另起一个任务去查。

if msg.tool_calls: for tc in msg.tool_calls: # 这里只能做轻量同步查询,不能做超过 1~2 秒的操作 result = local_cache_lookup(json.loads(tc.function.arguments)) messages.append({ "role": "tool", "tool_call_id": tc.id, "content": json.dumps(result, ensure_ascii=False) }) # 必须立刻再请求一次,算同一个会话的延续 resp = client.chat.completions.create( model="deepseek-chat", messages=messages, temperature=0.1 )

4.4 429 限流与并发飙升:抢跑反而拖垮整条链路

现象:监控系统上线后,并发从 5 提到 50,结果大量请求返回 429 Too Many Requests。更麻烦的是,这些失败请求触发了重试,重试又叠加在原始请求之上,导致服务端排队越来越严重。

原因:DeepSeek API 对单个 key 有 QPS 和并发限制,不是“付了费就不限”。舆情场景的请求曲线是“一波流”式的:热点事件出现时几千条评论瞬间涌入,平时又几乎没人调用。拿突发峰值去冲击并发限制,必然被限流。

解决:削峰填谷。一方面在客户端加信号量控制实际并发数;另一方面把非紧急的分析任务放进队列,限制消费速率。后面第 5 章会说具体并发实现,这里先给核心思路:asyncio.Semaphore(20)把并发上限卡死在 20,然后把超出的请求排队等待。宁可让最早的几条评论延迟几秒,也不能让系统在关键时刻全盘崩掉。

4.5 流式响应中断:半截 JSON 的处理与兜底

现象:使用流式模式分析长评论时,网络抖动导致连接断开,拿到手的 JSON 是不完整的,json.loads直接抛异常,这条评论的分析结果丢失。

原因:流式响应对网络质量更敏感,跨地域调用的公网链路尤其容易在长时间连接中抖动。加上舆情分析里部分评论本身很长,生成时间就长,连接断开的概率随之上升。

解决:分两层处理。第一层是捕获APIConnectionError和APIStatusError,把这批失败的文本暂存到“死信表”,等链路恢复后重新调用,不硬解残缺 JSON。第二层是给解析环节兜底,用类似json_repair的工具先把残缺 JSON 补齐再解析,能救回一部分只有尾部被截断的输出。

from json_repair import repair_json def robust_parse(content: str) -> dict: if content is None: return {"sentiment": "neutral", "topic": "其他", "score": 0.5} try: repaired = repair_json(content) return json.loads(repaired) except Exception: return {"sentiment": "neutral", "topic": "其他", "score": 0.5}

兜底结果的 sentiment 为什么设成 neutral,而不是 negative?我的考虑是:拿不准时不要惊动同事。避免误报对预警系统的信任度破坏更大。

5. 从单机脚本到生产级服务:并发控制、重试降级与成本预算

5.1 用 asyncio 控制并发:既要用满 API,也要留后路

舆情管道接入生产后,处理对象不再是“一条评论”,而是“持续涌入的评论流”。这时如果用同步 for 循环一条一条分析,吞吐量会低得难以接受;但如果用多线程无脑并发,又会撞上 4.4 讲的限流。我的做法是用asyncio+ 信号量把并发控制在一个“测过不会触发限流”的数值上。

import asyncio from openai import AsyncOpenAI client = AsyncOpenAI( api_key="sk-你的key", base_url="https://api.deepseek.com" ) sem = asyncio.Semaphore(20) # 实测 20 并发是当前 key 的安全水位 async def analyze_one(text: str): async with sem: resp = await client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": "你是舆情分析助手。只输出 JSON。"}, {"role": "user", "content": text}, ], temperature=0.1, max_tokens=256, ) return text, resp.choices[0].message.content async def process_batch(texts: list[str]): tasks = [analyze_one(t) for t in texts] results = await asyncio.gather(*tasks, return_exceptions=True) return results

asyncio.Semaphore(20)的意思是同一时刻最多 20 个请求在途,其余任务在async with sem处等待。这个 20 不是拍脑袋定的,而是通过压测得出的:把并发从 5 开始逐步往上加,观察 429 出现的位置,取一个“刚好多一点余量”的值。如果你用的是共享 key 或者团队里多个服务共用同一个 key,这个值还要再往下调。

5.2 指数退避重试与降级策略:不是所有失败都值得重试

网络超时、限流这类错误值得重试,但重试不能是无脑循环,否则 4.4 的场景会重演。标准做法是指数退避:第一次失败等 1 秒,第二次等 2 秒,第三次等 4 秒,封顶 30 秒。同时要区分错误的类型——鉴权失败(401)、请求格式错误(400)这类重试多少次都没用,直接跳过。

import random async def call_with_retry(text: str, max_retries: int = 4): for attempt in range(max_retries): try: return await analyze_one(text) except Exception as e: # 401/400 这类确定性错误不重试,直接抛 if "401" in str(e) or "400" in str(e): raise wait = min(2 ** attempt + random.uniform(0, 1), 30) await asyncio.sleep(wait) raise TimeoutError(f"retry exhausted: {text[:50]}")

代码里加了random.uniform(0, 1),这是为了防止“所有失败请求在同一秒同时重试”导致的惊群效应。重试上限设成 4,即最多等 1+2+4+8=15 秒。超过这个时间还没成功,说明服务可能出了更大问题,此时应该触发降级,而不是继续烧 API 配额。

降级策略分三级。第一级:把 DeepSeek 判定失败的文本落库,等待后续追跑;第二级:如果整个 API 都不可用,切到本地规则引擎(比如关键词黑名单+情感词典)做粗粒度判定,保证舆情监控不出现“空窗期”;第三级:再不行就直接把它当“待人工处理”放进队列,等链路恢复后再重新处理。降级的核心目标是“保证管道流动”,哪怕牺牲一点分析精度,也不要让生产链路卡死。

5.3 三个让调用量落在预算内的关键配置

大模型 API 的成本是舆情系统最容易被忽视的一项。三个配置项直接决定了月底账单的数字:max_tokens、context caching和调用频率。

第一个是max_tokens,输出长度上限。舆情分析任务只需要结构化 JSON,没必要让模型长篇大论。256 就够用,设成 512 已经是冗余。第二个是上下文缓存,DeepSeek API 会自动缓存相同前缀的请求,缓存命中的价格大概是未命中的十分之一量级,具体按官网实时价格页为准。这意味着 system prompt 和候选集这部分重复发送的内容,只要前缀一致,后续请求的计费就能大幅降低。所以 system prompt 要稳定,不要每次调用都微调措辞,否则缓存永远命中不了。第三个是限制单个话题的重复分析次数。舆情事件的热度曲线是陡升陡降的,事件过去后,相关评论的实时分析价值就低了。我的做法是:非预警级的评论只分析一次,入库后不再重复调用 API;预警级的评论在事件热度消退后停止追加分析。

BUDGET = { "max_tokens": 256, "cache_prompt": True, # 确保前缀稳定的简写示意 "skip_duplicate": True, # 同一话题热度下降后不再重复分析 }

顺带提一个容易被忽略的细节:temperature参数也会影响成本。温度调高后模型更容易产生不确定的输出,可能导致 JSON 格式错误,触发重试。重试一次,成本就翻倍。所以舆情这类需要确定性的任务,temperature设在 0.1 或 0 是省钱的手段,不只是为了结果一致。

6. 回测你的预警准确率:拿 72 小时历史数据给 DeepSeek 的判定“打分”

预警系统上线只是开始,真正要回答的问题是:这个系统说的话,运营团队该不该信。我的验证方法是拿 72 小时的真实评论做一次“回测”:选定一个已经结束的事件,把该事件期间抓取的 2000 条评论拿出来,人工标注其中 100 条的 sentiment 和 topic 作为标准答案,然后让系统重新分析一遍,对比系统判定和人工标注的差异。

回测前要准备好测试集,测试集里正负面样本都要有,比例上负面占比不能太低,否则“全部输出 neutral”的废模型也能拿到很高的准确率。跑完一轮之后,核心指标是预警阈值对应的 precision 和 recall。以下是一组真实回测数据的示意(阈值指score的预警线):

阈值精确率召回率预警条数
0.678%92%47
0.891%74%28
0.996%55%17

从这组数据能看到明显的权衡:阈值调到 0.9,精确率上去了但会漏掉近一半的负面信号;阈值放到 0.6,能抓住大部分负面,但预警条数变多,运营团队会产生“狼来了”的疲劳感。我的习惯是取“精确率 90% 附近”的阈值作为默认预警线,因为舆情预警的核心价值是“每条都要准”,而不是“把全部噪声都推给人”。回测之后还有一个动作:把系统判定错误的行为整理成清单,看模型到底在哪些句子上翻车了。最常见的错误是“口是心非型”评论,比如“这产品真牛,用了三天就坏”,前半句是反讽,模型把它判成了正面。这类问题靠调 prompt 很难根除,我最后的处理是在回测集里挑出 30 条典型的反讽评论,把它们复制到 system prompt 里作为 few-shot 示例,让 DeepSeek 在判断时参考这些“反面教材”。

这个技巧对准确率的提升比调 temperature 明显得多。最后补一句我的操作习惯:每次调整 prompt 或参数后,都重新跑一遍同一份回测集,把新的 precision/recall 记录在案,对比之前的结果。只有回测分数变好了,才值得把改动发布到线上;不然就回滚。这套“回测驱动调整”的流程让我少走了很多弯路,希望帮到你。

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

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

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

立即咨询