惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 聂微东
D
Darknet – Hacking Tools, Hacker News & Cyber Security
P
Privacy International News Feed
NISL@THU
NISL@THU
Know Your Adversary
Know Your Adversary
G
GRAHAM CLULEY
The Hacker News
The Hacker News
P
Privacy & Cybersecurity Law Blog
S
Schneier on Security
T
Troy Hunt's Blog
Attack and Defense Labs
Attack and Defense Labs
S
Secure Thoughts
S
Security Affairs
WordPress大学
WordPress大学
T
Tailwind CSS Blog
博客园 - Franky
T
The Exploit Database - CXSecurity.com
雷峰网
雷峰网
S
SegmentFault 最新的问题
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Proofpoint News Feed
S
Securelist
A
Arctic Wolf
C
Cyber Attacks, Cyber Crime and Cyber Security
有赞技术团队
有赞技术团队
爱范儿
爱范儿
Help Net Security
Help Net Security
Apple Machine Learning Research
Apple Machine Learning Research
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - 三生石上(FineUI控件)
C
CERT Recently Published Vulnerability Notes
C
Cisco Blogs
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
Spread Privacy
Spread Privacy
Last Week in AI
Last Week in AI
S
Security @ Cisco Blogs
博客园 - 司徒正美
博客园_首页
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
罗磊的独立博客
博客园 - 叶小钗
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
J
Java Code Geeks
T
Threatpost
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位

博客园 - CharyGao

OpenAI Codex AI降智解决方案, 原因解析与系统提示词修改指南 OpenClaw vs Coze/Dify/n8n 帮你半小时内选对合适的AI Skills 热潮过去后,我重新理解了 AI Agent 的方向 智读致用|《埃隆之书》 《一人企业》 一人公司:The Agency 免费“雇佣“144个AI专家,虚拟团队走进现实 用微软Agent Framework打造智能博客生成系统+AI智能体军团 告别加班(第二期):月报还是Word排版?本地AI解您愁 居然可以在 Claude 桌面端用三方模型了! Claude Code 每次启动都要确认权限?一行配置永久解决 98.5% 的人都不知道:SSH 居然还有个“隐藏菜单” 强程序员在 AI 时代的赚钱路径 骚操作来了!Claude编程的42个实战技巧大全 面试官:“简历写着熟练使用 Claude Code,连 simplify 代码审查命令都不知道!”,我:“那又如何呢?” SpringBoot+ResponseBodyEmitter异步流式推送神技 加密后的数据如何进行模糊查询? 最适合新手安装的10个小龙虾🦞 skills来了! 周末和孩子必看的亲子电影合集,陪伴孩子成长的每一步 拒绝代码泄露与“屎山”迷航:GitNexus纯本地知识图谱+可视化关系网,引发GitHub 8800星狂欢 还原BatchEncryption(201610版本)混淆的批处理文件 用上这个Skill,你的Claude Code/Codex 将会比别人快5倍 -- 用分布式思维驯服AI任务编排 前端项目中定义vs code要安装的插件 vscode中claude code插件代理地址设置 2026新手必学:GPT-5.5高效提示词指南 解决 URLEncoder.encode 编码空格变 + 号 Springboot通过谷歌Kaptcha 组件,生成图形验证码 HTTP 与 SpringBoot 参数提交与接收协议方式 SpringBoot多线程池配置 springboot使用logback自定义日志 SpringBoot + Cursor 最佳提示词工程手册 scoop国内安装方法 PowerShell DSC(Desired State Configuration)实战指南 OpenResty Lua 代码断点 调试指南:VSCode + LuaPanda OpenClaw多智能体路由实战:飞书多机器人配置指南 OpenClaw 提示词全集 (Prompt Collection) n8n 2.0 中文汉化版一键部署教程 | 解除Execute Command限制 java中Redisson ,jedis,Lettuce和Spring Data Redis的四种深度对比和优缺点详解 Java Web 技术演进:Servlet → Spring → Spring Boot Everything Claude Code(Anthropic 黑客松冠军开源配置) 从 ChatGPT 到 Coding Agent:AI 执行时代的未来猜想 【万字长文】Gemini 3 Pro 全面指南:从免费订阅到 CLI / Agent 实战 Codex 全面实战教程:从安装到工程协作,一篇跑通 3万字硬核拆解 Claude Code:从入门到工程化落地 Gemini 3 完整指南 Codex 完整指南 Claude Code 完整指南4-10 Claude Code 完整指南 claude code 自动保存对话插件 提示词99+ 拜拜Cursor,你好Kiro!(附全平台安装包下载,Win、Mac、Linux) 别再忍了!uv 下载慢如龟速?一招配置国内镜像,让你的 Python 体验坐上火箭! docker配置参数详解---/etc/docker/daemon.json完整参数 win11 清理 OpenCowork 让 AI 在飞书里真正「动手干活」 教你从0到1安装OpenClaw,快速接入飞书,打通任督二脉! SpringBoot 最大连接数及最大并发数是多少??? SpringBoot vs Nginx:5种实现vs1个指令,谁才是防盗链的“真·王者”? Spring Boot日志集成 Redisson 使用手册:从 API 误区到看门狗失效,在此终结分布式锁的噩梦 OpenClaw超级速查表 zeroclaw ubunut25 -ARM 修改国内镜像 openClaw国内镜像安装 知识图谱 —— 结构化知识的强大工具 什么是 Supervised learning(监督学习) 机器学习中的过拟合与欠拟合现象:理论与实践案例研究 解析 Anthropic 的模型上下文协议(MCP)及其优点
Prompt 工程实战总结:文本分类、信息抽取、语义匹配
CharyGao · 2026-05-06 · via 博客园 - CharyGao

一、背景

本文基于 Ollama + Qwen2:0.5b 本地模型 ,完成了三个经典的 NLP 任务:

(另附了基于langchain_openai的ChatOpenAI配合deepseek线上大模型接口处理Prompt提示词工程)

任务 目标 核心技术
文本分类 判断句子属于哪个类别 Few-shot + System Prompt
信息抽取 从文本中提取结构化实体 Few-shot + Schema 约束 + JSON 解析
语义匹配 判断两个句子语义是否相似 Few-shot + 二元分类 Prompt

二、任务一:文本分类 

2.1 Prompt 设计

 
  1. system_prompt = "现在你是一个文本分类器,你需要按照要求将我给你的句子分类到:{class_list}类别中。"

  2. user_prompt = f"“{sentence}”是 {class_list} 里的什么类别?直接输出类别结果,不要给出解释等其他内容。"

 

python

2.2 Few-shot 示例

 
  1. class_examples = {

  2. "新闻报道": "今日,股市经历了一轮震荡...",

  3. "财务报告": "本公司年度财务报告显示...",

  4. "公司公告": "本公司高兴地宣布成功完成...",

  5. "分析师报告": "最新的行业分析报告指出...",

  6. }

 

python

2.3 关键技巧

技巧 作用
System Prompt 明确角色 让模型知道自己是“分类器”
限制输出格式 直接输出类别结果,不要给出解释
Few-shot 覆盖所有类别 每个类别给一个示例,避免类别偏见

2.4 效果示例

输入:

央行发布公告宣布降低利率,以刺激经济增长。

输出:

新闻报道

代码

 
  1. """

  2. 利用 LLM 进行文本分类任务。

  3. """

  4. from rich import print

  5. from rich.console import Console

  6. import ollama

  7. from langchain_openai import ChatOpenAI

  8. from config import Config

  9. import re

  10. conf = Config()

  11. llm = ChatOpenAI(

  12. model=conf.model_name,

  13. api_key=conf.api_key,

  14. base_url=conf.base_url,

  15. temperature=1.0,

  16. max_tokens=1024,

  17. max_retries=3,

  18. timeout=60,

  19. )

  20. class_examples = {

  21. "新闻报道": "今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。",

  22. "财务报告": "本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。",

  23. "公司公告": "本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域,提高市场竞争力",

  24. "分析师报告": "最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素,投资者应关注这些趋势",

  25. }

  26. def init_prompts():

  27. """

  28. 初始化前置prompt,便于模型做 incontext learning。

  29. """

  30. class_list = list(class_examples.keys())

  31. pre_history = [

  32. {

  33. "role": "system",

  34. "content": f"现在你是一个文本分类器,你需要按照要求将我给你的句子分类到:{class_list}类别中。",

  35. }

  36. ]

  37. for _type, exmpale in class_examples.items():

  38. pre_history.append(

  39. {"role": "user", "content": f"“{exmpale}”是 {class_list} 里的什么类别?"}

  40. )

  41. pre_history.append({"role": "assistant", "content": _type})

  42. return {"class_list": class_list, "pre_history": pre_history}

  43. def inference(sentences: list, custom_settings: dict):

  44. """

  45. 推理函数。

  46. Args:

  47. sentences (List[str]): 待推理的句子。

  48. custom_settings (dict): 初始设定,包含人为给定的 few-shot example。

  49. """

  50. for sentence in sentences:

  51. with console.status("[bold bright_green] Model Inference..."):

  52. sentence_with_prompt = f"“{sentence}”是 {custom_settings['class_list']} 里的什么类别?直接输出类别结果, 不要给出解释等其他内容。"

  53. response = ollama.chat(

  54. model="qwen2:0.5b",

  55. messages=[

  56. *custom_settings["pre_history"],

  57. {"role": "user", "content": sentence_with_prompt},

  58. ],

  59. )

  60. response = response.message.content

  61. print(f'response--->{response}')

  62. if __name__ == "__main__":

  63. console = Console()

  64. sentences = [

  65. "今日,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。",

  66. "本公司宣布成功收购一家在创新科技领域领先的公司,这一战略性收购将有助于公司拓展技术能力和加速产品研发。",

  67. "公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。",

  68. "最新的分析报告指出,可再生能源行业预计将在未来几年经历持续增长,投资者应该关注这一领域的投资机会",

  69. "PDD公司2025年财报显示, 公司预计亏损7000w到1个亿之间"

  70. ]

  71. custom_settings = init_prompts()

  72. print('custom_settings--->', custom_settings)

  73. inference(sentences, custom_settings)

 

python


三、任务二:信息抽取 

3.1 Schema 定义

 
  1. schema = {

  2. "金融": ["日期", "股票名称", "开盘价", "收盘价", "成交量"],

  3. "新闻": ["日期", "新闻标题", "新闻内容"],

  4. }

 

python

3.2 Prompt 模板

IE_PATTERN = "{}\n\n提取上述句子中{}的实体,并按照JSON格式输出,上述句子中不存在的信息用['原文中未提及']来表示,多个值之间用','分隔。"

python

3.3 Few-shot 示例

 
  1. ie_examples = {

  2. "金融": [{

  3. "content": "2023-01-10,股票古哥-D美股开盘价100美元...",

  4. "answers": {

  5. "日期": ["2023-01-10"],

  6. "股票名称": ["古哥-D[EOOE]美股"],

  7. "开盘价": ["100美元"],

  8. "收盘价": ["102美元"],

  9. "成交量": ["520000"],

  10. },

  11. }],

  12. }

 

python

3.4 后处理容错

 
  1. def clean_response(response: str):

  2. if "```json" in response:

  3. res = re.findall(r"```json(.*?)```", response, re.DOTALL)

  4. if len(res) and res[0]:

  5. response = res[0]

  6. response = response.replace("、", ",")

  7. try:

  8. return json.loads(response)

  9. except:

  10. return response

 

python

3.5 关键技巧

技巧 作用
Schema 约束 明确要抽取哪些字段
兜底处理 ['原文中未提及'] 处理缺失信息
正则提取 处理模型输出的 Markdown 包裹
标点替换  → , 避免 JSON 解析失败

3.6 效果示例

输入:

2023-02-15,股票佰笃[BD]美股开盘价10美元,收盘价13美元,成交量460,000

输出:

{"日期": ["2023-02-15"], "股票名称": ["佰笃[BD]美股"], "开盘价": ["10美元"], "收盘价": ["13美元"], "成交量": ["460,000"]}

python

代码

 
  1. import json

  2. import ollama

  3. import re

  4. from rich import print

  5. schema = {

  6. "金融": ["日期", "股票名称", "开盘价", "收盘价", "成交量"],

  7. "新闻": ["日期", "新闻标题", "新闻内容"],

  8. }

  9. IE_PATTERN = "{}\n\n提取上述句子中{}的实体,并按照JSON格式输出,上述句子中不存在的信息用['原文中未提及']来表示,多个值之间用','分隔。"

  10. ie_examples = {

  11. "金融": [

  12. {

  13. "content": "2023-01-10,股市震荡。股票古哥-D[EOOE]美股今日开盘价100美元,一度飙升至105美元,随后回落至98美元,最终以102美元收盘,成交量达到520000。",

  14. "answers": {

  15. "日期": ["2023-01-10"],

  16. "股票名称": ["古哥-D[EOOE]美股"],

  17. "开盘价": ["100美元"],

  18. "收盘价": ["102美元"],

  19. "成交量": ["520000"],

  20. },

  21. }

  22. ],

  23. "新闻": [

  24. {

  25. "content": "2025-01-10,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。",

  26. "answers": {

  27. "日期": ["2025-01-10"],

  28. "新闻标题": ["央行发布公告宣布降低利率"],

  29. "新闻内容": [

  30. "这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。"

  31. ],

  32. },

  33. }

  34. ],

  35. }

  36. def init_prompts():

  37. """

  38. 初始化前置prompt,便于模型做 incontext learning。

  39. """

  40. ie_pre_history = [

  41. {"role": "system", "content": "你是一个信息抽取助手。"},

  42. ]

  43. for _type, example_list in ie_examples.items():

  44. for example in example_list:

  45. sentence = example["content"]

  46. properties_str = ", ".join(schema[_type])

  47. schema_str_list = f"“{_type}”({properties_str})"

  48. sentence_with_prompt = IE_PATTERN.format(sentence, schema_str_list)

  49. ie_pre_history.append(

  50. {"role": "user", "content": f"{sentence_with_prompt}"}

  51. )

  52. ie_pre_history.append(

  53. {

  54. "role": "assistant",

  55. "content": f"{json.dumps(example['answers'], ensure_ascii=False)}",

  56. }

  57. )

  58. return {"ie_pre_history": ie_pre_history}

  59. def clean_response(response: str):

  60. """

  61. 后处理模型输出

  62. Args:

  63. response (str): _description_

  64. """

  65. if "```json" in response:

  66. res = re.findall(r"```json(.*?)```", response, re.DOTALL)

  67. if len(res) and res[0]:

  68. response = res[0]

  69. response = response.replace("、", ",")

  70. try:

  71. return json.loads(response)

  72. except:

  73. return response

  74. def inference(sentences: list[dict[str, str]],

  75. custom_settings: dict):

  76. """

  77. 推理函数

  78. Args:

  79. sentences (List[str]): 待抽取的句子。

  80. custom_settings (dict): 初始设定,包含人为给定的 one-shot/few-shot example。

  81. """

  82. for item in sentences:

  83. sentence = item["text"]

  84. cls_res = item["cls"]

  85. if cls_res not in schema:

  86. print(

  87. f"The type model inferenced {cls_res} which is not in schema dict, exited."

  88. )

  89. continue

  90. properties_str = ", ".join(schema[cls_res])

  91. schema_str_list = f"“{cls_res}”({properties_str})"

  92. sentence_with_ie_prompt = IE_PATTERN.format(sentence, schema_str_list)

  93. messages = [

  94. *custom_settings["ie_pre_history"],

  95. {"role": "user", "content": sentence_with_ie_prompt},

  96. ]

  97. response = ollama.chat(model="qwen2:0.5b", messages=messages)

  98. res_content = response["message"]["content"]

  99. print(f'res_content-->{res_content}')

  100. if __name__ == "__main__":

  101. sentences = [

  102. {

  103. "text": "2023-02-15,寓意吉祥的节日,股票佰笃[BD]美股开盘价10美元,虽然经历了波动,但最终以13美元收盘,成交量微幅增加至460,000,投资者情绪较为平稳。",

  104. "cls": "金融",

  105. },

  106. {

  107. "text": "2023-04-05,市场迎来轻松氛围,股票盘古(0021)开盘价23元,尽管经历了波动,但最终以26美元收盘,成交量缩小至310,000,投资者保持观望态度。",

  108. "cls": "金融",

  109. },

  110. {

  111. "text": "2025-01-10,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。",

  112. "cls": "新闻",

  113. },

  114. ]

  115. custom_settings = init_prompts()

  116. inference(sentences, custom_settings)

 

python

四、任务三:语义匹配

4.1 Prompt 设计

 
  1. system_prompt = "现在你需要帮助我完成文本匹配任务,当我给你两个句子时,你需要回答我这两句话语义是否相似。只需要回答是否相似,不要做多余的回答。"

  2. user_prompt = f'句子一: {sentence1}\n句子二: {sentence2}\n上面两句话是相似的语义吗?'

 

python

4.2 Few-shot 示例

 
  1. examples = {

  2. "是": [

  3. ('公司ABC发布了季度财报,显示盈利增长。', '财报披露,公司ABC利润上升。'),

  4. ],

  5. "不是": [

  6. ('黄金价格下跌,投资者抛售。', '外汇市场交易额创下新高。'),

  7. ('央行降息,刺激经济增长。', '新能源技术的创新。')

  8. ]

  9. }

 

python

4.3 关键技巧

技巧 作用
正负样本均衡 同时提供“是”和“不是”的示例
限制输出 只回答是否相似,不要做多余的回答
结构化输入 句子一: ...\n句子二: ... 清晰分隔

4.4 效果示例

输入:

句子一: 股票市场今日大涨,投资者乐观。
句子二: 持续上涨的市场让投资者感到满意。

输出:

代码

 
  1. """

  2. 利用 LLM 进行文本匹配任务。

  3. """

  4. from rich import print

  5. from rich.console import Console

  6. import ollama

  7. examples = {

  8. '是': [

  9. ('公司ABC发布了季度财报,显示盈利增长。', '财报披露,公司ABC利润上升。'),

  10. ],

  11. '不是': [

  12. ('黄金价格下跌,投资者抛售。', '外汇市场交易额创下新高。'),

  13. ('央行降息,刺激经济增长。', '新能源技术的创新。')

  14. ]

  15. }

  16. def init_prompts():

  17. """

  18. 初始化前置prompt,便于模型做 incontext learning。

  19. """

  20. pre_history = [{"role": "system",

  21. "content": "现在你需要帮助我完成文本匹配任务,当我给你两个句子时,你需要回答我这两句话语义是否相似。只需要回答是否相似,不要做多余的回答。"}, ]

  22. for key, sentence_pairs in examples.items():

  23. for sentence_pair in sentence_pairs:

  24. sentence1, sentence2 = sentence_pair

  25. pre_history.append(

  26. {"role": "user", "content": f'句子一: {sentence1}\n句子二: {sentence2}\n上面两句话是相似的语义吗?'})

  27. pre_history.append({"role": "assistant", "content": key})

  28. return {'pre_history': pre_history}

  29. def inference(

  30. sentence_pairs: list,

  31. custom_settings: dict

  32. ):

  33. """

  34. 推理函数

  35. Args:

  36. sentence_pairs (List[str]): 待推理的句子对。

  37. custom_settings (dict): 初始设定,包含人为给定的 few-shot example。

  38. """

  39. for sentence_pair in sentence_pairs:

  40. with console.status("[bold bright_green] Model Inference..."):

  41. sentence1, sentence2 = sentence_pair

  42. sentence_with_prompt = f'句子一: {sentence1}\n句子二: {sentence2}\n上面两句话是相似的语义吗?'

  43. response = ollama.chat(model="qwen2:0.5b",

  44. messages=[*custom_settings["pre_history"],

  45. {"role": 'user', "content": sentence_with_prompt}])

  46. response = response["message"]["content"]

  47. print(f'>>> [bold bright_red]sentence_pair:{sentence_pair}')

  48. print(f'>>> [bold bright_green]inference answer:{response}')

  49. if __name__ == '__main__':

  50. console = Console()

  51. sentence_pairs = [

  52. ('股票市场今日大涨,投资者乐观。', '持续上涨的市场让投资者感到满意。'),

  53. ('油价大幅下跌,能源公司面临挑战。', '未来智能城市的建设趋势愈发明显。'),

  54. ('利率上升,影响房地产市场。', '高利率对房地产有一定冲击。'),

  55. ]

  56. custom_settings = init_prompts()

  57. print(f'custom_settings-->{custom_settings}')

  58. inference(

  59. sentence_pairs,

  60. custom_settings

  61. )

 

python


五、三个任务的通用经验

经验 说明
System Prompt 定角色 让模型明确自己的任务身份
Few-shot 是核心 1-3 个示例比长篇指令更有效
限制输出格式 减少模型“废话”,便于解析
后处理容错 正则提取 + 标点替换 + try-catch
小模型能力有限 0.5B 能跑,但 1.5B/7B 更稳定

六、一句话心得

Prompt 不是写作文,而是写“约束”。Few-shot 是给模型看标准答案,后处理是给模型兜底。三者配合,小模型也能做出稳定的效果。


希望这篇总结对你有帮助!你的代码结构清晰、容错完善,已经是一个很成熟的 Prompt 工程实践了。