零代码NLP实践:基于DeepSeek API的Prompt工程实现四大经典任务

📅 2026/8/8 2:51:07
零代码NLP实践:基于DeepSeek API的Prompt工程实现四大经典任务
1. 项目概述当NLP遇上“零代码”AI最近在AI圈子里DeepSeek的讨论热度一直居高不下。作为一个长期关注自然语言处理NLP应用的开发者我发现一个有趣的现象很多对文本分析、智能对话感兴趣的朋友往往被“机器学习”、“模型训练”、“TensorFlow/PyTorch”这些术语吓退觉得没有深厚的算法和数学背景就玩不转NLP。这其实是一个巨大的误解。现在的AI发展特别是大语言模型LLM的API化已经让NLP技术的应用门槛降到了前所未有的低点。这个项目的核心就是想验证一个想法一个完全不懂传统机器学习流程的人能否仅凭一个API和清晰的指令Prompt就独立完成几种经典的NLP任务我选择了DeepSeek最新开放的模型API作为工具因为它不仅能力强大、上下文窗口长而且对于中文场景的支持和性价比都相当不错。我将通过四个最典型、最实用的NLP任务来演示这个过程文本分类、情感分析、实体识别和文本摘要。整个过程你不需要准备训练数据不需要理解损失函数和反向传播甚至不需要安装任何复杂的Python机器学习库。你需要的只是一个能发送HTTP请求的工具比如Postman或者几行Python脚本一个DeepSeek的API Key以及最重要的——知道如何向模型清晰地描述你的任务。这篇文章就是一份详细的“操作手册”和“避坑指南”我会把每个任务的实现逻辑、具体的Prompt写法、API调用细节以及我趟过的坑都分享出来让你能直接复制粘贴跑通属于你自己的NLP应用。2. 核心思路为什么是Prompt API在深入实操之前有必要先厘清我们这套方法背后的逻辑。传统NLP项目流程大致是业务理解 - 数据收集与标注 - 特征工程 - 模型选择与训练 - 评估与部署。这个流程周期长、成本高且严重依赖专业知识和数据质量。而我们采用的“Prompt API”范式本质上是一种任务描述即执行的范式。2.1 范式转变从“教模型学习”到“告诉模型做什么”传统机器学习是“教”我们给模型成千上万的例子数据让它自己从中找出规律训练。大语言模型是“用”模型在预训练阶段已经吸收了海量文本中的知识和规律形成了一个高度通用的“世界模型”。我们的工作不再是训练它而是通过精心设计的指令Prompt引导它调用已有的知识来解决我们的具体问题。这带来了几个根本性的优势零样本/少样本学习你不需要为每个新任务准备标注数据。对于常见任务一个清晰的指令就足够了零样本。对于复杂或特定领域任务在指令中提供一两个例子少样本模型就能举一反三。开发周期极短从产生想法到获得可用的结果可能只需要几分钟到几小时用于设计和调试Prompt。灵活性极高同一个模型通过不同的Prompt可以瞬间切换角色今天是情感分析专家明天是合同审核员无需重新训练或部署新服务。维护简单你维护的不是一个可能过时或需要重新训练的模型而是一套Prompt模板和业务逻辑。底层模型的升级由API提供商负责。2.2 工具选型为什么选择DeepSeek API市面上提供LLM API的服务商不少比如OpenAI的GPT系列、Anthropic的Claude等。我选择DeepSeek进行这次实践主要基于以下几点考量对中文的天然友好性DeepSeek是由国内团队研发在中文语料上进行了充分训练对于中文语境下的语义理解、成语俗语、网络用语的处理通常更贴近我们的直觉减少了因文化差异导致的“误解”。出色的性价比相较于一些国际顶级APIDeepSeek在提供了极具竞争力性能的同时价格往往更具优势。对于个人开发者、创业团队或进行大量实验的场景成本是一个非常重要的因素。超长的上下文窗口DeepSeek-V3/V4系列模型支持128K甚至更长的上下文。这意味着你可以一次性输入非常长的文档如一篇完整的报告、多轮对话历史让它进行分析无需进行复杂的文本切割和信息整合这对于摘要、长文档分析等任务至关重要。清晰的API文档与稳定的服务其官方API文档结构清晰参数说明详细并且提供了多种编程语言的SDK示例。在实际测试期间API服务的响应速度和稳定性都令人满意。注意模型迭代很快本文撰写时主要基于deepseek-chat或deepseek-v4-flash等模型。调用前请务必查阅官方最新文档确认模型名称和端点地址。2.3 任务设计四种经典NLP任务的代表性我选取的四个任务覆盖了NLP从理解到生成的核心能力光谱文本分类这是NLP的基石任务判断一段文本属于哪个预定义的类别。我们将用它给新闻打标签。情感分析分类任务的一个特例但极具商业价值如舆情监控、产品评价分析。我们将分析用户评论的情感极性。命名实体识别NER从非结构化文本中抽取出结构化的关键信息如人名、地点、组织、时间等。这是信息提取的核心。文本摘要属于文本生成任务要求模型在理解原文的基础上凝练出核心内容。这对模型的理解和生成能力都是考验。通过这四种任务你基本上就能掌握如何用Prompt驱动LLM解决80%的常见文本处理需求了。3. 环境准备与API调用基础工欲善其事必先利其器。虽然我们说“不懂机器学习也能玩”但基础的编程环境还是需要的。不过别担心这部分极其简单。3.1 获取API密钥首先你需要访问DeepSeek的官方平台通常是其开放平台网站注册账号并申请API密钥。这个过程和申请任何其他云服务的API Key类似登录 - 进入控制台 - 找到API密钥管理 - 创建新的密钥。请妥善保管这个密钥它就像你的密码不要泄露在公开的代码仓库里。3.2 最简单的调用方式使用Pythonrequests库我们将使用Python进行演示因为它语法简洁库生态丰富。你只需要安装一个requests库如果还没安装在命令行运行pip install requests。下面是一个最基础的API调用脚本框架后续所有任务都将基于此框架修改prompt用户指令和system系统指令内容来实现。import requests import json # 你的API密钥务必保密 api_key “你的DeepSeek_API_Key_放在这里” # API端点以DeepSeek官方文档为准 api_url “https://api.deepseek.com/v1/chat/completions” # 请求头包含认证信息和内容类型 headers { “Authorization”: f“Bearer {api_key}”, “Content-Type”: “application/json” } # 请求体核心是 messages 列表 data { “model”: “deepseek-chat”, # 或 “deepseek-v4-flash”根据可用性选择 “messages”: [ { “role”: “system”, # 系统指令设定模型的角色和基础行为 “content”: “你是一个专业的自然语言处理助手擅长以结构化的JSON格式输出结果。” }, { “role”: “user”, # 用户指令即我们的任务描述和输入文本 “content”: “请分析以下文本的情感倾向输出结果为‘正面’、‘负面’或‘中性’。文本这家餐厅的服务员态度非常友好但菜品口味实在一般。” } ], “temperature”: 0.3, # 控制随机性越低输出越确定 “max_tokens”: 1024 # 限制模型回复的最大长度 } # 发送POST请求 response requests.post(api_url, headersheaders, jsondata) # 检查响应状态 if response.status_code 200: result response.json() # 提取模型返回的回复内容 reply_content result[‘choices’][0][‘message’][‘content’] print(“模型回复”, reply_content) else: print(“请求失败状态码”, response.status_code) print(“错误信息”, response.text)关键参数解析model: 指定使用的模型。不同模型能力、价格、速度不同需按官方文档选择。messages: 一个对话历史列表。通常我们构造一个system消息来设定角色一个user消息来提出任务。模型会基于整个对话上下文生成assistant角色的回复。temperature: 取值范围0-2。值越低如0.1-0.3输出越确定、保守适合有标准答案的任务如分类、提取。值越高如0.7-1.0输出越随机、有创造性适合写作、头脑风暴。max_tokens: 限制模型生成内容的长度防止生成过长无关内容。需根据任务预估对于分类、NER等任务设置512或1024通常足够。3.3 第一个实操心得处理API响应与错误直接运行上面的脚本你可能会成功也可能会遇到错误。以下是几个我初期常踩的坑API Error: 400 ‘type’ must be in [“enabled”, “disabled”, “auto”]问题这个错误通常出现在早期的一些API版本或参数传递有误时可能与某些已废弃或未正确设置的参数如流式输出stream有关。解决最稳妥的方法是严格参照当前官方API文档的示例构建请求体。只包含文档中明确列出的参数。对于stream参数如果不确定可以先设置为false或不传递。API Error: 400 This model‘s maximum context length is ...问题你输入的文本user的content加上system指令和模型将要生成的内容总长度超过了模型的最大上下文限制。解决对于超长文本必须进行切割。例如做长文档摘要时可以按章节或固定长度如每2000字分割分别摘要后再合并摘要结果。或者直接换用支持更长上下文的模型如deepseek-v4-flash。Invalid prompt: Your prompt was flagged as potentially violating our usage policy问题你的Prompt或输入文本触发了内容安全策略。这不一定是你有意为之有时某些关键词组合会被误判。解决重新审视并修改Prompt的表述避免任何可能涉及暴力、仇恨、自残等敏感内容的词汇。尝试用更中性、专业的语言描述任务。如果确认内容无害但仍被拦截可以尝试简化Prompt或联系平台支持。连接不稳定或响应中断问题网络问题或服务端偶尔的不稳定可能导致ConnectionError或响应不完整。解决在代码中增加重试机制和异常捕获。使用try...except包裹请求代码并在遇到连接类错误时延迟几秒后重试例如最多重试3次。4. 任务一文本分类——给新闻自动打标签文本分类是NLP的入门任务目标是将一段文本分配到预定义的类别中。我们假设要构建一个新闻自动分类器类别是[科技, 体育, 财经, 娱乐, 时政]。4.1 Prompt设计思路对于分类任务Prompt的核心是明确指令 定义类别 规定输出格式。明确指令直接告诉模型要做什么。“请对以下新闻文本进行分类。”定义类别将所有可能的类别清晰列出避免歧义。如果类别含义有交叉最好简单说明。规定输出格式这是保证结果可程序化处理的关键。要求模型以纯文本标签或JSON格式输出。基础版Prompt零样本你是一个新闻分类专家。请将以下新闻文本分类到以下五个类别之一科技、体育、财经、娱乐、时政。 请只输出类别名称不要输出任何其他解释。 新闻文本{news_text}进阶版Prompt少样本带例子如果发现基础版在类别边界模糊时效果不稳定可以提供1-2个例子来“教”模型。你是一个新闻分类专家。请将以下新闻文本分类到以下五个类别之一科技、体育、财经、娱乐、时政。 示例 输入“特斯拉发布新一代自动驾驶芯片算力提升500%。” - 输出“科技” 输入“欧冠决赛皇家马德里绝杀多特蒙德夺得队史第15冠。” - 输出“体育” 现在请对以下新闻文本进行分类只输出类别名称 新闻文本{news_text}4.2 代码实现与解析我们将基础版Prompt集成到之前的API调用框架中。def classify_news(news_text): 对新闻文本进行分类 api_key “你的API_KEY” api_url “https://api.deepseek.com/v1/chat/completions” headers { “Authorization”: f“Bearer {api_key}”, “Content-Type”: “application/json” } # 构建Prompt user_prompt f“”” 你是一个新闻分类专家。请将以下新闻文本分类到以下五个类别之一科技、体育、财经、娱乐、时政。 请只输出类别名称不要输出任何其他解释。 新闻文本{news_text} “”” data { “model”: “deepseek-chat”, “messages”: [ {“role”: “system”, “content”: “你是一个精准的文本分类助手。”}, {“role”: “user”, “content”: user_prompt} ], “temperature”: 0.1, # 分类任务要求确定性高温度设低 “max_tokens”: 10 # 只输出一个词长度设短 } try: response requests.post(api_url, headersheaders, jsondata, timeout30) response.raise_for_status() # 如果状态码不是200抛出HTTPError result response.json() category result[‘choices’][0][‘message’][‘content’].strip() return category except requests.exceptions.RequestException as e: print(f“API请求失败{e}”) return “Error” except (KeyError, json.JSONDecodeError) as e: print(f“解析响应失败{e}”) return “Error” # 测试 test_news “央行宣布下调存款准备金率0.5个百分点释放长期资金约1万亿元。” result classify_news(test_news) print(f“新闻‘{test_news}’\n分类结果{result}”)实操要点与心得temperature设置对于分类这种有明确答案的任务将temperature设置为较低值如0.1-0.3可以极大提高输出的一致性。如果设为较高的值模型可能会在几个相近类别间随机选择导致结果不稳定。max_tokens控制既然我们只要求输出一个类别名将max_tokens设小如10可以加快响应速度并避免模型“画蛇添足”生成多余内容。结果清洗使用.strip()去除模型回复可能带有的首尾空格或换行符。错误处理在生产环境中必须对网络超时、API限流、响应格式错误等情况进行妥善处理例如加入重试逻辑、返回默认类别或记录错误日志。4.3 处理复杂情况与分类置信度有时一条新闻可能涉及多个领域或者模型对自己的判断不那么确信。我们可以通过修改Prompt让模型提供更多信息。让模型输出置信度或理由你是一个新闻分类专家。请将以下新闻文本分类到以下五个类别之一科技、体育、财经、娱乐、时政。 如果文本明显属于单一类别请输出格式“类别【类别名】”。 如果文本涉及多个类别请按相关性从高到低列出最多两个类别格式“多类别【类别1, 类别2】”。 如果不确定请输出“不确定”。 新闻文本{news_text}让模型以JSON格式输出包含分类和理由这对于后续的程序处理非常友好。你是一个新闻分类专家。请分析以下新闻文本并以严格的JSON格式输出包含两个字段 1. “category”: 最相关的类别名称从“科技、体育、财经、娱乐、时政”中选择。 2. “confidence”: 你的置信度用“高”、“中”、“低”表示。 3. “reason”: 一句话解释分类理由。 新闻文本{news_text}然后在你的代码中使用json.loads()来解析模型的回复即可得到一个结构化的字典对象。5. 任务二情感分析——洞察用户评论的情绪情感分析是文本分类的一个经典子任务专门用于判断一段文本所表达的情感倾向正面、负面、中性。它在电商评价、社交媒体监控、客户服务等领域应用极广。5.1 Prompt设计从二分类到细粒度分析情感分析的Prompt设计与分类类似但更关注情感色彩的界定。基础二分类正面/负面请判断以下用户评论的情感倾向。如果是正面评价输出“正面”如果是负面评价输出“负面”。不要输出其他内容。 评论{user_comment}三分类正面/负面/中性很多评论不带有强烈情感或者陈述事实因此“中性”类别很重要。请判断以下用户评论的情感倾向。如果是表扬、赞同、喜爱等输出“正面”如果是批评、失望、厌恶等输出“负面”如果是中性陈述、不带明显情感或无法判断输出“中性”。请只输出这三个词之一。 评论{user_comment}细粒度情感分析带强度或方面有时我们不仅想知道正负面还想知道程度或者针对产品的不同方面如服务、质量、价格分别分析。你是一个产品评价分析师。请分析以下评论并以JSON格式输出结果。 JSON结构要求 { “overall_sentiment”: “正面”或“负面”或“中性”, “sentiment_intensity”: “强烈”、“一般”、“微弱”, “aspects”: [ {“aspect”: “产品质量”, “sentiment”: “正面”, “mention”: “电池续航很长”}, {“aspect”: “外观设计”, “sentiment”: “中性”, “mention”: “颜色只有黑色可选”}, ... // 其他提及的方面 ] } 评论{user_comment}5.2 代码实现与情感极性测试我们实现一个三分类的情感分析函数并测试一些边界案例。def analyze_sentiment(comment): 分析评论情感正面/负面/中性 api_key “你的API_KEY” api_url “https://api.deepseek.com/v1/chat/completions” headers {“Authorization”: f“Bearer {api_key}”, “Content-Type”: “application/json”} user_prompt f“”” 请判断以下用户评论的情感倾向。如果是表扬、赞同、喜爱等输出“正面”如果是批评、失望、厌恶等输出“负面”如果是中性陈述、不带明显情感或无法判断输出“中性”。请只输出这三个词之一。 评论{comment} “”” data { “model”: “deepseek-chat”, “messages”: [ {“role”: “system”, “content”: “你是一个准确的情感分析助手。”}, {“role”: “user”, “content”: user_prompt} ], “temperature”: 0.2, “max_tokens”: 5 } try: response requests.post(api_url, headersheaders, jsondata, timeout30) response.raise_for_status() result response.json() sentiment result[‘choices’][0][‘message’][‘content’].strip() # 做一个简单的后处理确保输出是我们预期的三个词之一 if sentiment not in [“正面”, “负面”, “中性”]: # 有时模型可能会加上句号或换行这里做精确匹配失败后的容错 if “正面” in sentiment: sentiment “正面” elif “负面” in sentiment: sentiment “负面” elif “中性” in sentiment: sentiment “中性” else: sentiment “不确定” return sentiment except Exception as e: print(f“情感分析失败{e}”) return “Error” # 测试多种评论 test_comments [ “这款手机拍照效果真的太棒了夜景非常清晰”, # 正面 “电池太不耐用了一天要充两次电很失望。”, # 负面 “手机昨天下午收到的目前还在试用中。”, # 中性 “说不上来好还是坏就那样吧。”, # 中性模糊 “除了价格贵点其他各方面都完美。”, # 混合偏正面 ] for comment in test_comments: sentiment analyze_sentiment(comment) print(f“评论‘{comment[:20]}...’ - 情感{sentiment}”)实操心得边界案例的处理混合情感像“除了价格贵点其他各方面都完美”这样的评论模型很可能判断为“正面”因为它抓住了整体倾向。这是合理的。如果你需要更精细地捕捉对“价格”的负面情绪就需要使用前面提到的“方面情感分析”Prompt。模糊与讽刺对于“说不上来好还是坏”或某些讽刺性言论如“这服务真是‘好’得没话说”模型可能会误判。这是当前LLM的普遍难点。解决方法可以是1) 在Prompt中明确要求“注意反讽语气”2) 提供包含反讽例句的少样本Prompt3) 接受一定误差或结合其他信号综合判断。结果标准化即使要求“只输出三个词之一”模型偶尔也会输出“正面评价”或带标点。代码中的后处理逻辑if sentiment not in […]是一种简单的标准化方法。更健壮的做法是使用字符串包含性检查或正则表达式来提取关键词。6. 任务三命名实体识别NER——从文本中提取关键信息命名实体识别NER旨在从非结构化文本中识别并分类出预定义类别的实体如人名、组织名、地点、时间、货币等。这在构建知识图谱、信息检索、智能客服中非常有用。6.1 Prompt设计明确实体类型与输出格式NER的Prompt核心是定义实体类型 给出文本 指定结构化输出。由于输出需要是结构化的信息JSON格式几乎是必然选择。基础版Prompt定义常见实体类型你是一个信息提取专家。请从以下文本中识别并提取出所有命名实体并按照以下类别进行分类 - PERSON人名 - ORGANIZATION组织、机构、公司名 - LOCATION地点包括国家、城市、地区等 - DATE日期 - MONEY货币金额 - PRODUCT产品名 请将提取结果以JSON列表格式输出列表中每个元素是一个对象包含“entity”实体文本、“type”实体类型和“start_index”实体在原文中的起始字符位置从0开始计数三个字段。 文本{input_text}进阶版Prompt处理中文与特定领域实体对于中文文本实体类型可以定义得更符合中文习惯。例如识别小说、历史文本中的人物、朝代、官职等。你是一个中文历史文本分析助手。请从以下段落中提取关键实体分类如下 - 人名历史人物、作者等 - 朝代 - 地名古称、今称皆可 - 官职 - 著作名 请以JSON数组格式输出结果每个对象包含“text”实体内容、“type”实体类型、“context”实体所在的原句用于辅助理解字段。 文本{input_text}6.2 代码实现与结果解析我们实现基础版的NER功能并处理模型的JSON输出。import json import re def extract_entities(text): 从文本中提取命名实体 api_key “你的API_KEY” api_url “https://api.deepseek.com/v1/chat/completions” headers {“Authorization”: f“Bearer {api_key}”, “Content-Type”: “application/json”} user_prompt f“”” 你是一个信息提取专家。请从以下文本中识别并提取出所有命名实体并按照以下类别进行分类 - PERSON人名 - ORGANIZATION组织、机构、公司名 - LOCATION地点包括国家、城市、地区等 - DATE日期 - MONEY货币金额 - PRODUCT产品名 请将提取结果以JSON列表格式输出列表中每个元素是一个对象包含“entity”实体文本、“type”实体类型和“start_index”实体在原文中的起始字符位置从0开始计数三个字段。 如果未识别到任何实体输出空列表 []。 **重要只输出JSON不要有任何额外的解释、标记或文字。** 文本{text} “”” data { “model”: “deepseek-chat”, “messages”: [ {“role”: “system”, “content”: “你是一个精准的实体识别助手严格按指令输出JSON。”}, {“role”: “user”, “content”: user_prompt} ], “temperature”: 0.1, # NER要求高精度低温度 “max_tokens”: 1024 } try: response requests.post(api_url, headersheaders, jsondata, timeout45) response.raise_for_status() result response.json() reply result[‘choices’][0][‘message’][‘content’].strip() # 关键步骤从回复中提取JSON部分 # 模型有时会在JSON前后加上json 标记需要处理 json_match re.search(r‘\[.*\]’, reply, re.DOTALL) # 匹配最外层的JSON数组 if json_match: json_str json_match.group(0) entities json.loads(json_str) # 可选验证和修正start_index因为模型计算的索引可能不准 # 一个简单的方法是根据提取的entity文本在原文中重新查找位置 for entity in entities: entity_text entity.get(‘entity’, ‘’) # 在原文中查找该文本第一次出现的位置作为start_index idx text.find(entity_text) if idx ! -1: entity[‘start_index’] idx return entities else: print(“未能从回复中解析出JSON。”) print(“原始回复”, reply) return [] except json.JSONDecodeError as e: print(f“JSON解析失败{e}”) print(“原始回复”, reply if ‘reply’ in locals() else ‘N/A’) return [] except Exception as e: print(f“实体提取失败{e}”) return [] # 测试 test_text “苹果公司于2023年9月12日在加利福尼亚州库比蒂诺发布了新款iPhone 15起售价为799美元。首席执行官蒂姆·库克主持了发布会。” entities extract_entities(test_text) print(“提取到的实体”) for ent in entities: print(f“ - 实体‘{ent[‘entity’]}’ ({ent[‘type’]}) 出现在位置 {ent[‘start_index’]}”)实操心得与陷阱规避强制JSON输出在Prompt中使用“只输出JSON不要有任何额外的解释、标记或文字”这样的强指令非常有效能极大减少模型“说废话”的情况。但即便如此模型有时仍会加上 Markdown 的代码块标记json ...。因此代码中使用了正则表达式re.search(r‘\[.*\]’, reply, re.DOTALL)来直接匹配JSON数组结构这比寻找标记更鲁棒。索引校正要求模型输出start_index是一个有挑战性的任务。大语言模型是基于Token工作的它给出的字符索引可能不准确。代码中展示了一种后校正方法用str.find()在原文中重新定位实体字符串。但这也有局限如果同一实体在文中出现多次find()只会返回第一次的位置。对于高精度要求场景可能需要更复杂的算法或接受模型的近似值。实体类型一致性模型对实体类型的判断可能不一致例如有时将“iPhone 15”识别为PRODUCT有时识别为普通名词。可以在Prompt中提供每个类型的明确例子来改善。例如“- PRODUCT产品名例如iPhone 15, Tesla Model S, Windows 11”。长文本处理对于非常长的文本一次性输入可能超出上下文限制或导致模型注意力分散。可以将长文本按句子或段落分割分别进行NER然后合并结果。但要注意处理跨句子的实体如长人名、长机构名。7. 任务四文本摘要——从长文中提炼核心文本摘要要求模型在保留核心信息的前提下缩短原文长度。这考验模型的理解和概括能力。我们尝试两种摘要抽取式摘要摘取原文关键句和生成式摘要用自己的话重述。7.1 Prompt设计指明摘要类型与长度生成式摘要常用你是一个专业的文本摘要助手。请为以下文章生成一个简洁的摘要要求 1. 准确概括文章的核心内容和主要观点。 2. 语言流畅、连贯自成一段。 3. 摘要长度控制在原文的30%以内。 文章 {article_text}抽取式摘要保留原文句子你是一个文本分析专家。请从以下文章中提取出3-5个最能代表文章核心内容的原句。请直接列出这些句子用换行分隔不要改变原句的措辞。 文章 {article_text}带特定焦点的摘要你是一个科技新闻编辑。请从以下报道中提炼出与‘产品发布’和‘市场反应’相关的核心信息生成一段不超过150字的摘要。 报道 {news_report}7.2 代码实现与摘要质量评估我们实现一个生成式摘要函数并讨论如何评估摘要质量。def generate_summary(text, summary_length_ratio0.3): 生成文本摘要 :param text: 原文 :param summary_length_ratio: 摘要长度相对于原文的比率估算 :return: 摘要文本 api_key “你的API_KEY” api_url “https://api.deepseek.com/v1/chat/completions” headers {“Authorization”: f“Bearer {api_key}”, “Content-Type”: “application/json”} # 估算摘要的大致token数或字数这里简单按字符比例估算 estimated_summary_chars int(len(text) * summary_length_ratio) user_prompt f“”” 你是一个专业的文本摘要助手。请为以下文章生成一个简洁的摘要。 要求 1. 准确概括文章的核心内容和主要观点。 2. 语言流畅、连贯自成一段。 3. 摘要长度大约在{estimated_summary_chars}个字符左右。 文章 {text} “”” data { “model”: “deepseek-chat”, # 对于摘要也可以尝试 deepseek-v4-flash速度可能更快 “messages”: [ {“role”: “system”, “content”: “你是一个简洁准确的摘要生成器。”}, {“role”: “user”, “content”: user_prompt} ], “temperature”: 0.5, # 摘要可以有一定创造性温度适中 “max_tokens”: 512 # 根据预估长度设置上限 } try: response requests.post(api_url, headersheaders, jsondata, timeout60) # 摘要可能耗时稍长 response.raise_for_status() result response.json() summary result[‘choices’][0][‘message’][‘content’].strip() return summary except Exception as e: print(f“摘要生成失败{e}”) return “” # 测试使用一段较长的示例文本此处用省略号代替 long_article “”” 这里应放置一篇真实的、较长的新闻或文章例如关于某项科技进展的报道字数在500-1000字左右。 由于篇幅限制此处用描述代替。 假设这是一篇关于“人工智能在医疗影像诊断中最新突破”的详细报道介绍了技术原理、临床试验数据、专家观点和未来展望。 “”” # 实际测试时替换为真实长文本 # summary generate_summary(long_article) # print(“原文长度”, len(long_article)) # print(“\n生成的摘要\n”, summary) # print(“摘要长度”, len(summary))实操心得摘要的“艺术”与评估长度控制通过max_tokens和 Prompt中的长度描述如“大约150字”双重控制。但模型对“字”和“Token”的理解可能不准max_tokens是更硬性的限制。温度选择temperature设为0.5左右可以在忠实原文和语言流畅性之间取得较好平衡。如果追求高度忠实如法律文书摘要可降低至0.2如果希望摘要更生动可读如新闻简报可提高至0.7。处理超长文本如果原文远超模型上下文窗口如一篇数万字的论文必须进行分割。可以采用“分层摘要”策略先对每个章节或部分生成小节摘要然后将所有小节摘要组合起来再生成一个总的摘要。摘要质量评估这是一个难题。自动化评估指标如ROUGE比较摘要与参考摘要的重叠度需要参考摘要而我们通常没有。在实践中可以关注事实一致性摘要中的事实是否与原文一致有无捏造或扭曲可以设计Prompt让模型自查“请判断以下摘要是否忠实反映了原文的核心事实列出任何不一致之处。”信息覆盖度摘要是否包含了原文最重要的信息点可以列出原文的关键点清单然后检查摘要是否提及。连贯性与可读性人工阅读判断摘要是否通顺、逻辑是否清晰。8. 进阶技巧与生产环境考量跑通单个任务演示只是第一步。要将这些能力用于实际项目还需要考虑更多因素。8.1 Prompt工程优化让模型更“听话”结构化指令使用编号、分点来让指令更清晰。例如“请按以下步骤操作1. ... 2. ... 3. ...”。角色扮演给模型赋予一个具体的角色如“资深编辑”、“数据分析师”、“法律顾问”这能引导其采用特定的思维方式和语言风格。提供输出范例Few-Shot在Prompt中直接给出1-3个完整的“输入-输出”例子这是让模型理解复杂格式要求最有效的方法之一。链式思考Chain-of-Thought对于复杂推理任务在Prompt中要求模型“一步一步思考”并展示其推理过程最后再给出答案可以显著提高准确性。例如“首先分析这句话的主要话题其次判断涉及的主体最后根据以上分析得出结论。你的最终输出是...”后处理指令在Prompt末尾再次强调输出格式如“请确保输出为纯JSON格式不要有任何额外文本。”8.2 性能、成本与稳定性异步与批处理如果需要处理大量文本同步调用API会非常慢。应使用异步请求库如aiohttp并发调用或者利用API可能支持的批处理端点Batch API将多个请求打包发送能极大提升吞吐量。缓存策略对于重复性高、结果不变的查询例如对一篇固定文章的摘要可以将结果缓存起来存在数据库或本地文件避免重复调用API产生不必要的费用和延迟。成本监控API调用按Token收费。输入和输出的Token数都会计入。在代码中估算Token消耗近似为中文字数 * 2 英文字符数 / 4并设置预算警报防止意外超支。降级与熔断设计备用方案。当主要API服务不可用或响应过慢时可以切换到更简单、更快的规则方法或备用模型服务保证核心功能可用。8.3 构建一个简单的NLP服务网关你可以将上述功能封装成一个统一的Web服务例如使用Flask或FastAPI框架。# 示例使用FastAPI构建一个简单的服务端点 from fastapi import FastAPI, HTTPException from pydantic import BaseModel from typing import Optional, List import uvicorn app FastAPI(title“简易NLP API服务”) class TextRequest(BaseModel): text: str model: Optional[str] “deepseek-chat” temperature: Optional[float] 0.3 class NERRequest(TextRequest): entity_types: Optional[List[str]] None # 可以允许客户端自定义实体类型 app.post(“/classify”) async def classify_news(request: TextRequest): # 调用之前的 classify_news 函数逻辑 category classify_news_impl(request.text, request.model, request.temperature) return {“text”: request.text, “category”: category} app.post(“/sentiment”) async def analyze_sentiment(request: TextRequest): sentiment analyze_sentiment_impl(request.text, request.model, request.temperature) return {“text”: request.text, “sentiment”: sentiment} app.post(“/ner”) async def extract_entities(request: NERRequest): # 根据 request.entity_types 动态构建Prompt entities extract_entities_impl(request.text, request.entity_types, request.model, request.temperature) return {“text”: request.text, “entities”: entities} app.post(“/summarize”) async def summarize_text(request: TextRequest): summary generate_summary_impl(request.text, request.model, request.temperature) return {“text”: request.text, “summary”: summary} if __name__ “__main__”: uvicorn.run(app, host“0.0.0.0”, port8000)这样你就可以通过发送HTTP请求到http://your-server:8000/summarize等端点轻松集成NLP能力到你的其他应用中了。通过这四个任务的实践我们可以看到借助现代大语言模型的APINLP应用的开发范式已经发生了根本性的变化。核心从复杂的算法和数据处理转移到了对任务的理解、Prompt的设计以及工程化的集成上。这无疑为更多开发者打开了自然语言处理的大门。当然这并不是说传统的机器学习方法过时了对于需要极致性能、数据隐私或特定领域微调的场景传统方法仍有其不可替代的价值。但对于快速原型验证、解决大量常见的长尾问题、或者作为复杂系统的补充组件“Prompt API”的方案无疑是一把锋利而便捷的瑞士军刀。