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

推荐订阅源

V
Visual Studio Blog
罗磊的独立博客
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
博客园_首页
量子位
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
S
SegmentFault 最新的问题
雷峰网
雷峰网
小众软件
小众软件
博客园 - 聂微东
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog

博客园 - CharyGao

Spring 解决循环依赖为什么需要三级缓存,而不是两级缓存? SpringBoot服务优雅停机 Java 对接全球股票实时报价:高可用架构与异常处理 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 参数提交与接收协议方式
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 工程实践了。