黑马大模型RAG与Agent智能体实战教程LangChain提示词——6、提示词工程(提示词优化、few-shot、金融文本信息抽取案例、金融文本匹配案例)

https://www.bilibili.com/video/BV1yjz5BLEoY

https://hzh.sealos.run/

文章目录

提示词工程-05、提示词优化案例_金融文本信息抽取

任务介绍

提示词设计

→提示词:帮我根据给出图片中的任务和示例,创建第七个代码


←AI回复

07_Information_Extraction_FewShot.py

py 复制代码
import json
import os
from dotenv import load_dotenv
from openai import OpenAI


def main():
    """
    信息抽取任务 - Few-Shot 学习示例:
    1. 使用 Few-Shot 方式让模型理解信息抽取任务
    2. 从金融文本中提取:日期、股票名称、开盘价、收盘价、成交量
    3. 按照 JSON 格式输出,缺失信息用 '原文未提及' 表示
    """
    # 1. 加载环境变量
    load_dotenv()
    
    api_key = os.getenv("API_KEY")
    if not api_key:
        raise ValueError("未在环境变量或 .env 中找到 API_KEY,请先配置后再运行。")
    
    # 2. 初始化客户端(兼容阿里云 DashScope 的 OpenAI 模式)
    client = OpenAI(
        api_key=api_key,
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )
    # 也可以使用本地模型:base_url="http://localhost:11434/v1"
    
    # 3. 定义需要抽取的信息字段(Schema)
    schema = ['日期', '股票名称', '开盘价', '收盘价', '成交量']
    
    # 4. 定义示例数据(Few-Shot 示例)
    examples_data = [
        {
            "content": "2023-01-10,股市震荡。股票强大科技A股今日开盘价100人民币,一度飙升至105人民币,随后回落至98人民币,最终以102人民币收盘,成交量达到520000。",
            "answers": {
                "日期": "2023-01-10",
                "股票名称": "强大科技A股",
                "开盘价": "100人民币",
                "收盘价": "102人民币",
                "成交量": "520000"
            }
        },
        {
            "content": "2024-05-16,股市波动。股票英伟达美股今日开盘价105美元,一度飙升至109美元,随后回落至100美元,最终以116美元收盘,成交量达到3560000。",
            "answers": {
                "日期": "2024-05-16",
                "股票名称": "英伟达美股",
                "开盘价": "105美元",
                "收盘价": "116美元",
                "成交量": "3560000"
            }
        }
    ]
    
    # 5. 定义需要抽取信息的问题列表
    questions = [
        "2025-06-16,股市震荡。股票传智教育A股今日开盘价66人民币,一度飙升至70人民币,随后回落至65人民币,最终以68人民币收盘,成交量达到123000。",
        "2025-06-06,股市波动。股票黑马程序员A股今日开盘价200人民币,一度飙升至211人民币,随后回落至201人民币,最终以206人民币收盘。"
    ]
    
    # 6. 构建消息列表
    messages = []
    
    # 6.1 添加系统提示
    messages.append({
        "role": "system",
        "content": f"你帮我完成信息抽取,我给你句子,你抽取{schema}信息,按JSON字符串输出,如果某些信息不存在,用'原文未提及'来表示,参考下面的示例。"
    })
    
    # 6.2 添加 Few-Shot 示例(让模型学习如何抽取信息)
    for example in examples_data:
        # 添加用户输入(待抽取的句子)
        messages.append({
            "role": "user",
            "content": example["content"]
        })
        # 添加助手回复(期望的抽取结果)
        messages.append({
            "role": "assistant",
            "content": json.dumps(example["answers"], ensure_ascii=False)
        })
    
    # 7. 对每个问题进行信息抽取
    print("=" * 80)
    print("信息抽取任务 - Few-Shot 学习示例")
    print("=" * 80)
    print(f"\n需要抽取的字段: {schema}")
    print(f"\nFew-Shot 示例数量: {len(examples_data)}")
    print(f"待抽取的问题数量: {len(questions)}")
    print("\n" + "-" * 80)
    
    for i, q in enumerate(questions, 1):
        print(f"\n【问题 {i}】")
        print(f"原文: {q}")
        print("\n抽取结果:")
        
        # 添加当前问题到消息列表
        current_messages = messages + [{
            "role": "user",
            "content": f"按照上述示例,现在抽取这个句子的信息:{q}"
        }]
        
        # 调用 API
        response = client.chat.completions.create(
            model="qwen3-max",
            messages=current_messages
        )
        
        # 打印抽取结果
        result = response.choices[0].message.content
        print(result)
        
        # 尝试解析 JSON 并格式化输出
        try:
            result_dict = json.loads(result)
            print("\n格式化后的结果:")
            print(json.dumps(result_dict, ensure_ascii=False, indent=2))
        except json.JSONDecodeError:
            print("(注意: 返回结果不是有效的 JSON 格式)")
        
        print("-" * 80)
    
    print("\n" + "=" * 80)
    print("任务完成!")
    print("=" * 80)


if __name__ == "__main__":
    main()

运行代码

bash 复制代码
python3 AI_LLM_RAG_Agent_Dev/07_Information_Extraction_FewShot.py

结果:

bash 复制代码
================================================================================
信息抽取任务 - Few-Shot 学习示例
================================================================================

需要抽取的字段: ['日期', '股票名称', '开盘价', '收盘价', '成交量']

Few-Shot 示例数量: 2
待抽取的问题数量: 2

--------------------------------------------------------------------------------

【问题 1】
原文: 2025-06-16,股市震荡。股票传智教育A股今日开盘价66人民币,一度飙升至70人民币,随后回落至65人民币,最终以68人民币收盘,成交量达到123000。

抽取结果:
{"日期": "2025-06-16", "股票名称": "传智教育A股", "开盘价": "66人民币", "收盘价": "68人民币", "成交量": "123000"}

格式化后的结果:
{
  "日期": "2025-06-16",
  "股票名称": "传智教育A股",
  "开盘价": "66人民币",
  "收盘价": "68人民币",
  "成交量": "123000"
}
--------------------------------------------------------------------------------

【问题 2】
原文: 2025-06-06,股市波动。股票黑马程序员A股今日开盘价200人民币,一度飙升至211人民币,随后回落至201人民币,最终以206人民币收盘。

抽取结果:
{"日期": "2025-06-06", "股票名称": "黑马程序员A股", "开盘价": "200人民币", "收盘价": "206人民币", "成交量": "原文未提及"}

格式化后的结果:
{
  "日期": "2025-06-06",
  "股票名称": "黑马程序员A股",
  "开盘价": "200人民币",
  "收盘价": "206人民币",
  "成交量": "原文未提及"
}
--------------------------------------------------------------------------------

================================================================================
任务完成!
================================================================================

→问AI:为什么"content": example["content"]没用json.dumps,"content": json.dumps(example["answers"], ensure_ascii=False)这个却用了?只需回答

←AI回复

因为:

  • example["content"] 已经是字符串,可直接使用。
  • example["answers"] 是字典(Python 对象),需要转换为 JSON 字符串才能作为消息内容发送给 API。

json.dumps() 用于将 Python 对象(字典/列表)转换为 JSON 字符串;字符串不需要转换。

课后作业

课后作业答案

→提示词:帮我根据图中的课后作业要求,创建代码8

←AI回复

08_Lottery_Information_Extraction.py

py 复制代码
import json
import os
from dotenv import load_dotenv
from openai import OpenAI


def main():
    """
    彩票信息抽取任务 - Few-Shot 学习示例:
    1. 使用 Few-Shot 方式让模型理解彩票信息抽取任务
    2. 从彩票文本中提取:期数、中奖号码(红球+篮球)、一等奖
    3. 按照 JSON 格式输出
    """
    # 1. 加载环境变量
    load_dotenv()
    
    api_key = os.getenv("API_KEY")
    if not api_key:
        raise ValueError("未在环境变量或 .env 中找到 API_KEY,请先配置后再运行。")
    
    # 2. 初始化客户端(兼容阿里云 DashScope 的 OpenAI 模式)
    client = OpenAI(
        api_key=api_key,
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )
    # 也可以使用本地模型:base_url="http://localhost:11434/v1"
    
    # 3. 定义需要抽取的信息字段(Schema)
    schema = ['期数', '中奖号码', '一等奖']
    
    # 4. 定义示例数据(Few-Shot 示例)
    examples_data = [
        {
            "content": "2025年第100期,开好红球22 21 06 01 03 11 篮球 07,一等奖中奖为2注。",
            "answers": {
                "期数": "2025100",
                "中奖号码": [1, 3, 6, 11, 21, 22, 7],
                "一等奖": "2注"
            }
        },
        {
            "content": "2025101期,有3注1等奖,10注2等奖,开号篮球11,中奖红球3、5、7、11、12、16。",
            "answers": {
                "期数": "2025101",
                "中奖号码": [3, 5, 7, 11, 12, 16, 11],
                "一等奖": "3注"
            }
        }
    ]
    
    # 5. 定义需要抽取信息的问题列表(根据作业要求,应该有5条文本,这里提供3条作为测试)
    questions = [
        "2025年第102期,开好红球05 12 18 23 28 33 篮球 09,一等奖中奖为5注。",
        "2025103期,有1注1等奖,20注2等奖,开号篮球15,中奖红球2、8、14、19、25、30。",
        "2025年第104期,开好红球01 07 13 20 26 31 篮球 04,一等奖中奖为0注。"
    ]
    
    # 6. 构建消息列表
    messages = []
    
    # 6.1 添加系统提示
    messages.append({
        "role": "system",
        "content": f"你是一个彩票信息抽取专家。请从彩票文本中提取以下信息:{schema}。\n\n"
                   f"提取规则:\n"
                   f"1. 期数:提取年份和期号,格式为YYYYNNN(如'2025年第100期'提取为'2025100','2025101期'提取为'2025101')\n"
                   f"2. 中奖号码:提取所有红球号码(按升序排列)和篮球号码,篮球号码放在最后。如果篮球号码与红球号码重复,也要包含在列表中。\n"
                   f"3. 一等奖:提取一等奖的中奖注数,格式为'数字+注'(如'2注'、'3注')\n\n"
                   f"请按照JSON格式输出,参考下面的示例。"
    })
    
    # 6.2 添加 Few-Shot 示例(让模型学习如何抽取信息)
    for example in examples_data:
        # 添加用户输入(待抽取的句子)
        messages.append({
            "role": "user",
            "content": example["content"]
        })
        # 添加助手回复(期望的抽取结果)
        messages.append({
            "role": "assistant",
            "content": json.dumps(example["answers"], ensure_ascii=False)
        })
    
    # 7. 对每个问题进行信息抽取
    print("=" * 80)
    print("彩票信息抽取任务 - Few-Shot 学习示例")
    print("=" * 80)
    print(f"\n需要抽取的字段: {schema}")
    print(f"\nFew-Shot 示例数量: {len(examples_data)}")
    print(f"待抽取的问题数量: {len(questions)}")
    print("\n" + "-" * 80)
    
    for i, q in enumerate(questions, 1):
        print(f"\n【问题 {i}】")
        print(f"原文: {q}")
        print("\n抽取结果:")
        
        # 添加当前问题到消息列表
        current_messages = messages + [{
            "role": "user",
            "content": f"请按照上述示例,抽取以下彩票文本的信息:{q}"
        }]
        
        # 调用 API
        response = client.chat.completions.create(
            model="qwen3-max",
            messages=current_messages
        )
        
        # 打印抽取结果
        result = response.choices[0].message.content
        print(result)
        
        # 尝试解析 JSON 并格式化输出
        try:
            result_dict = json.loads(result)
            print("\n格式化后的结果:")
            print(json.dumps(result_dict, ensure_ascii=False, indent=2))
        except json.JSONDecodeError:
            print("(注意: 返回结果不是有效的 JSON 格式)")
        
        print("-" * 80)
    
    print("\n" + "=" * 80)
    print("任务完成!")
    print("=" * 80)


if __name__ == "__main__":
    main()

运行代码

bash 复制代码
python3 AI_LLM_RAG_Agent_Dev/08_Lottery_Information_Extraction.py

结果:

bash 复制代码
================================================================================

需要抽取的字段: ['期数', '中奖号码', '一等奖']

Few-Shot 示例数量: 2
待抽取的问题数量: 3

--------------------------------------------------------------------------------

【问题 1】
原文: 2025年第102期,开好红球05 12 18 23 28 33 篮球 09,一等奖中奖为5注。

抽取结果:
{"期数": "2025102", "中奖号码": [5, 12, 18, 23, 28, 33, 9], "一等奖": "5注"}

格式化后的结果:
{
  "期数": "2025102",
  "中奖号码": [
    5,
    12,
    18,
    23,
    28,
    33,
    9
  ],
  "一等奖": "5注"
}
--------------------------------------------------------------------------------

【问题 2】
原文: 2025103期,有1注1等奖,20注2等奖,开号篮球15,中奖红球2、8、14、19、25、30。

抽取结果:
{"期数": "2025103", "中奖号码": [2, 8, 14, 19, 25, 30, 15], "一等奖": "1注"}

格式化后的结果:
{
  "期数": "2025103",
  "中奖号码": [
    2,
    8,
    14,
    19,
    25,
    30,
    15
  ],
  "一等奖": "1注"
}
--------------------------------------------------------------------------------

【问题 3】
原文: 2025年第104期,开好红球01 07 13 20 26 31 篮球 04,一等奖中奖为0注。

抽取结果:
{"期数": "2025104", "中奖号码": [1, 7, 13, 20, 26, 31, 4], "一等奖": "0注"}

格式化后的结果:
{
  "期数": "2025104",
  "中奖号码": [
    1,
    7,
    13,
    20,
    26,
    31,
    4
  ],
  "一等奖": "0注"
}
--------------------------------------------------------------------------------

================================================================================
任务完成!
================================================================================

提示词工程-06、提示词优化案例_金融文本匹配

任务介绍

提示词设计

→提示词:根据给定图片任务要求,帮我创建第九个代码


←AI回复

09_Text_Matching_FewShot.py

py 复制代码
import os
from dotenv import load_dotenv
from openai import OpenAI


def main():
    """
    文本匹配任务 - Few-Shot 学习示例:
    1. 使用 Few-Shot 方式让模型理解文本匹配任务
    2. 识别成对的句子中,2句话是否有关联
    3. 按照指定格式输出:'是' 或 '不是'
    """
    # 1. 加载环境变量
    load_dotenv()
    
    api_key = os.getenv("API_KEY")
    if not api_key:
        raise ValueError("未在环境变量或 .env 中找到 API_KEY,请先配置后再运行。")
    
    # 2. 初始化客户端(兼容阿里云 DashScope 的 OpenAI 模式)
    client = OpenAI(
        api_key=api_key,
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )
    # 也可以使用本地模型:base_url="http://localhost:11434/v1"
    
    # 3. 定义 Few-Shot 示例数据(让模型学习什么是文本匹配任务)
    examples_data = [
        {
            "sentence1": "公司ABC发布了季度财报,显示盈利增长。",
            "sentence2": "财报披露,公司ABC利润上升",
            "answer": "是"
        },
        {
            "sentence1": "黄金价格下跌,投资者抛售。",
            "sentence2": "外汇市场交易额创下新高",
            "answer": "不是"
        }
    ]
    
    # 4. 定义需要判断的文本对(测试数据)
    test_pairs = [
        {
            "sentence1": "股票市场今日大涨,投资者乐观。",
            "sentence2": "持续上涨的市场让投资者感到满意。"
        },
        {
            "sentence1": "油价大幅下跌,能源公司面临挑战。",
            "sentence2": "未来智能城市的建设趋势愈发明显。"
        },
        {
            "sentence1": "利率上升,影响房地产市场。",
            "sentence2": "高利率对房地产有一定冲击。"
        }
    ]
    
    # 5. 构建消息列表
    messages = []
    
    # 5.1 添加系统提示(解释什么是文本匹配任务)
    messages.append({
        "role": "system",
        "content": "你是一个文本匹配专家。你的任务是判断给定的两个句子是否有关联。\n\n"
                   "如果两个句子在语义上相关、讨论同一主题或存在逻辑关联,则回答'是';\n"
                   "如果两个句子在语义上无关、讨论不同主题或不存在逻辑关联,则回答'不是'。\n\n"
                   "请按照以下格式输出:\n"
                   "- 如果有关联,输出:是\n"
                   "- 如果无关联,输出:不是"
    })
    
    # 5.2 添加 Few-Shot 示例(让模型学习如何判断文本匹配)
    for example in examples_data:
        # 添加用户输入(待判断的句子对)
        messages.append({
            "role": "user",
            "content": f"句子一:{example['sentence1']}\n句子二:{example['sentence2']}"
        })
        # 添加助手回复(期望的判断结果)
        messages.append({
            "role": "assistant",
            "content": example["answer"]
        })
    
    # 6. 对每个文本对进行匹配判断
    print("=" * 80)
    print("文本匹配任务 - Few-Shot 学习示例")
    print("=" * 80)
    print(f"\nFew-Shot 示例数量: {len(examples_data)}")
    print(f"待判断的文本对数量: {len(test_pairs)}")
    print("\n" + "-" * 80)
    
    # 显示 Few-Shot 示例
    print("\n【Few-Shot 示例】")
    for i, example in enumerate(examples_data, 1):
        print(f"\n示例 {i}:")
        print(f"  句子一: {example['sentence1']}")
        print(f"  句子二: {example['sentence2']}")
        print(f"  答案: {example['answer']}")
    
    print("\n" + "-" * 80)
    
    # 对每个测试文本对进行判断
    results = []
    for i, pair in enumerate(test_pairs, 1):
        print(f"\n【测试 {i}】")
        print(f"句子一: {pair['sentence1']}")
        print(f"句子二: {pair['sentence2']}")
        print("\n判断结果:")
        
        # 添加当前问题到消息列表
        current_messages = messages + [{
            "role": "user",
            "content": f"句子一:{pair['sentence1']}\n句子二:{pair['sentence2']}"
        }]
        
        # 调用 API
        response = client.chat.completions.create(
            model="qwen3-max",
            messages=current_messages
        )
        
        # 获取判断结果
        result = response.choices[0].message.content.strip()
        print(result)
        
        results.append(result)
        print("-" * 80)
    
    # 7. 汇总结果
    print("\n" + "=" * 80)
    print("结果汇总")
    print("=" * 80)
    print(f"\n期望结果: ['是', '不是', '是']")
    print(f"实际结果: {results}")
    
    # 验证结果
    expected_results = ['是', '不是', '是']
    correct_count = sum(1 for i, (expected, actual) in enumerate(zip(expected_results, results)) 
                        if expected == actual)
    
    print(f"\n正确率: {correct_count}/{len(test_pairs)} ({correct_count/len(test_pairs)*100:.1f}%)")
    
    print("\n" + "=" * 80)
    print("任务完成!")
    print("=" * 80)


if __name__ == "__main__":
    main()

运行代码

bash 复制代码
python3 AI_LLM_RAG_Agent_Dev/09_Text_Matching_FewShot.py

结果:

bash 复制代码
================================================================================
文本匹配任务 - Few-Shot 学习示例
================================================================================

Few-Shot 示例数量: 2
待判断的文本对数量: 3

--------------------------------------------------------------------------------

【Few-Shot 示例】

示例 1:
  句子一: 公司ABC发布了季度财报,显示盈利增长。
  句子二: 财报披露,公司ABC利润上升
  答案: 是

示例 2:
  句子一: 黄金价格下跌,投资者抛售。
  句子二: 外汇市场交易额创下新高
  答案: 不是

--------------------------------------------------------------------------------

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

判断结果:
是
--------------------------------------------------------------------------------

【测试 2】
句子一: 油价大幅下跌,能源公司面临挑战。
句子二: 未来智能城市的建设趋势愈发明显。

判断结果:
不是
--------------------------------------------------------------------------------

【测试 3】
句子一: 利率上升,影响房地产市场。
句子二: 高利率对房地产有一定冲击。

判断结果:
是
--------------------------------------------------------------------------------

================================================================================
结果汇总
================================================================================

期望结果: ['是', '不是', '是']
实际结果: ['是', '不是', '是']

正确率: 3/3 (100.0%)

================================================================================
任务完成!
================================================================================
相关推荐
難釋懷2 小时前
秒杀优化-基于阻塞队列实现秒杀优化
redis·缓存
JaydenAI2 小时前
[LangChain之链]LangChain的Chain——由Runnable构建的管道
python·langchain
草帽lufei2 小时前
LangChain 框架核心向量存储
langchain
猫头虎2 小时前
如何使用Docker部署OpenClaw汉化中文版?
运维·人工智能·docker·容器·langchain·开源·aigc
静听山水2 小时前
Redis核心数据结构-Set
数据结构·数据库·redis
vx-bot5556663 小时前
企业微信接口在金融级业务场景下的合规架构与实践
金融·架构·企业微信
无尽的沉默3 小时前
Redis下载安装
数据库·redis·缓存
曾经的三心草3 小时前
redis-9-集群
java·redis·mybatis