黑马大模型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%)

================================================================================
任务完成!
================================================================================
相关推荐
大流星1 天前
LangChainJs之基础模型(一)
javascript·langchain
AIOps打工人1 天前
我以为 LangChain 就是调用大模型,直到我写出第一条 Chain
langchain
大模型真好玩2 天前
LangChain DeepAgents 速通指南(十)—— DeepAgents Code 智能体服务核心源码解读
人工智能·langchain·agent
vivo互联网技术2 天前
从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战
服务器·数据库·redis·elasticsearch·深度分页
花千树_0103 天前
多工具调用只是开始:用 Regnexe 构建真正会反思的 Java Agent
langchain·agent
用户3074596982075 天前
Redis 延时队列详解
redis
烤代码的吐司君5 天前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
大模型真好玩7 天前
LangChain DeepAgents 速通指南(九)—— 生产级智能体框架 DeepAgents Code 源码导读
人工智能·langchain·agent
leeyi7 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent