开头和一些废话

今天是学习的第二天!2026.5.20(今天在12点前把这些都搞完了,还是不错的)
如果你看过我的第一篇投稿,那容我说声谢谢,能有人看到这些对我来说是件很开心的事。

今天有两个代码文件需要展示,感觉错误都是基础知识没掌握。。。

好吧,不管怎么说,还是要记录一下,如果有人能在这里找到一些问题的解决方案,那我就算是帮到别人了,也是件好事,hhh

代码1:新闻标题分类

# 导入依赖
from openai import OpenAI
from dotenv import load_dotenv

import os

# 加载环境变量
load_dotenv()

# 获取client对象
client = OpenAI(
    base_url=os.getenv("DASHSCOPE_BASE_URL"),
    api_key=os.getenv("DASHSCOPE_API_KEY")
)

# 示例数据:键为分类标签,值为对应的文本样例
examples_data = {
    '科技': '苹果公司今日发布新一代iPhone,搭载自研M4芯片,支持卫星通话功能,预计下半年出货量突破9000万台。',
    '体育': '欧冠半决赛次回合,皇马主场2-1逆转拜仁,总比分4-3晋级决赛,何塞卢补时阶段连入两球。',
    '娱乐': '歌手林俊杰“JJ20”世界巡回演唱会伦敦站落幕,全场大合唱《不为谁而作的歌》,气氛热烈。',
    '财经': '美联储宣布维持基准利率不变,并暗示年内可能降息三次,美股三大指数应声上涨超1%。'
}

# 所有可能的分类标签(用于提示)
examples_types = ['科技', '体育', '娱乐', '财经']

# 待分类的提问数据
questions = [
    "特斯拉Q1财报超出预期,上海工厂产能恢复至满负荷,股价盘后大涨5%。",
    "《黑神话:悟空》荣获2024年科隆游戏展最佳视觉奖,国产3A游戏再获国际认可。",
    "巴黎奥运会男子100米决赛,美国选手莱尔斯以9秒79夺冠,创造新的赛会纪录。",
    "央行宣布下调存款准备金率0.25个百分点,释放长期资金约5000亿元。",
    "周杰伦晒出与费玉清合影,网友猜测两人将合作新歌。"
]

# ========== 请编写缺失的代码 ==========
# 任务:根据上述示例数据 examples_data 和分类标签 examples_types,
# 构建符合 OpenAI Chat Completions API 的 messages 列表,其中 system 消息应定义任务目标,
# 并将示例数据以 few-shot 方式加入 messages。
# 然后对 questions 中的每一个文本,调用 client.chat.completions.create 接口获取分类结果,
# 并打印出模型返回的分类标签。
#
# 提示:
# - 系统提示应包含:角色(新闻分类专家)、可能的类别列表、对未知类别的处理方式(如“不清楚类别”)。
# - few-shot 示例格式:先 user 输入文本,后 assistant 输出正确标签。
# - 每次调用时,将完整的 messages(system + few-shot示例 + 当前提问)作为参数传入。
# - 模型名称可自行选择(例如 "qwen3:4b" 或 "gpt-3.5-turbo")。

# 代码补全部分

# 定义要放进模型的消息部分,先把系统提示词放进去
messages = [{"role": "system","content":"你是一个被新闻公司所用的分类模型,用于给各个新闻进行分类,只要给出新闻的一小部分就可以识别并分类,你的回答只有分类的结果:'科技', '体育', '娱乐', '财经',还有不属于这几种时的'未知'"}]

# 利用循环把实例放进消息中(记得加items(),这样才能同时接收键值对)
for key,value in examples_data.items():
    messages.append({"role":"user","content":value})
    messages.append({"role":"assistant","content":key})

# 看看有没有放进去了
for chunk in messages:
    print(chunk)

for qs in questions:
    response = client.chat.completions.create(
        model = "qwen3.5-plus",
        messages=messages + [{"role": "user", "content": f"按照示例,回答这段文本的分类类别:{qs}"}]
    )
    print(response.choices[0].message.content)

是的,我把教程代码喂给AI,让他改一下然后当作编程题做了(有兴趣的话你也做一下?)

这段代码的主要目的是让模型根据给出的少量实例(few-shot),让模型学会分类这些新闻概要。

写这段代码的过程中其实很磕磕绊绊,还大致的运作流程还是懂了,下面是一个我遇到的严重问题,做好准备。。。

日志1

啊哈,当然有严重的问题,不过我要先说说消息部分编写的事,今天我先是把消息换成SDK类型了,因为我嫌它一直报黄色警告太烦了。

然后…现在我又换回去了,毕竟SDK是给严格检查用的,想了想写着也麻烦,所以现在看见警告就按下alt+enter,选择对语句禁止,然后就多了一行…

# 定义消息
messages = [
    {"role":"system","content":"你是住在用户隔壁的女大学生,性格有点阴郁,宅,但是心地善良,有一天你出门去买泡面遇到了用户"},
    {"role":"user","content":"你好,今天天气不错啊。"},
    {"role":"assistant","content":"对,是不错。"},
    {"role":"user","content":"啊,刚刚说到哪了?"}
]
# 定义模型
# noinspection PyTypeChecker(看这里!!)
response = openai_object.chat.completions.create(
    model = "qwen3.5-plus",
    messages = messages,
    stream=True
)

好吧,你不会在意我在系统提示词里写了什么的,对吧?重点是这段:
#noinspection PyTypeChecker

加上去后,瞬间清净了,除了每次都要点点鼠标外没啥麻烦。现在先这样用着吧。

好了,说正事

文件最后的输出部分出了点问题,原本写的是:

for qs in questions:
    response = client.chat.completions.create(
        model = "qwen3.5-plus",
        messages=messages.append({"role": "user", "content": f"按照示例,回答这段文本的分类类别:{qs}"})
    )
    print(response.choices[0].message.content)

结果报错:

BadRequestError: Error code: 400 - {‘error’: {‘message’: “[] is too short - ‘messages’”, ‘type’: ‘invalid_request_error’, ‘param’: None, ‘code’: None}, ‘request_id’: ‘chatcmpl-f39a1250-9952-9793-b0ef-2fa31f3e8c2a’}

看出问题了吗?

问题出在:

messages=messages.append({"role": "user", "content": f"按照示例,回答这段文本的分类类别:{qs}"})

这行里使用了append函数,而python社区约定:

append() 是原地修改列表的方法,它直接改变原列表对象,而不是返回一个新列表。对于原地操作,Python 社区约定此类方法应返回 None(例如 list.sort()、list.reverse() 也返回 None),以明确表示没有生成新对象。

所以看起来messages收到了None,难怪会报错
(其实就是我python基础知识忘光了呜呜)

好了,接下来就到了第二段代码了:

代码2:信息抽取

# 导入依赖
from openai import OpenAI
from dotenv import load_dotenv
import json
import os

# 加载环境变量
load_dotenv()

# 初始化客户端
client = OpenAI(
    base_url=os.getenv("DASHSCOPE_BASE_URL"),
    api_key=os.getenv("DASHSCOPE_API_KEY"),
)

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

# 示例数据(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"
        }
    }
]

# 待抽取的测试数据(请自行编造新的股票信息)
questions = [
    "2025-07-20,新能源汽车板块走强。股票比亚迪港股今日开盘价280港元,盘中最高触及295港元,最低275港元,收报288港元,成交额达到1200万股。",
    "2025-08-05,医药行业利好。股票恒瑞医药A股今日开盘价45.6人民币,一度涨至48.2人民币,后回落至44.9人民币,最终以46.5人民币收盘(成交量未披露)。",
    "2025-09-12,科技股普跌。股票中芯国际H股开盘价18.8港元,收盘价17.2港元,最高19.0港元,最低16.9港元,成交量880万股。"
]

# ========== 请补全缺失的代码 ==========
# 任务:
# 1. 根据 examples_data 构建 few-shot 消息列表 messages,其中:
#    - 第一条为 system 消息,内容需包含 schema 字段、输出格式(JSON字符串)、缺失字段处理方式('原文未提及')。
#    - 然后按照 "user" 输入文本、"assistant" 输出 JSON 的顺序,依次添加每个示例。
# 2. 对 questions 中的每一个问题,调用 client.chat.completions.create 接口(模型可自选,如 "qwen3:4b"),
#    将 messages 加上当前提问(作为新的 user 消息)传入,获取模型返回的 JSON 字符串并打印。

# 提示:
# - 使用 json.dumps(answers, ensure_ascii=False) 生成 assistant 的 content。
# - 提问时的 user content 可以写为 f"按照上述示例,现在抽取这个句子的信息:{q}"。
# - 注意 list.append() 返回 None,请勿将其直接赋值给 messages。

# 请在此处编写你的代码:

# 初始化消息,把系统提示词写上去
messages = [{"role":"system","content":"你是一个用于文本要点提取的助手,可以从股市信息中提取各个股票的重要点并转换为JSON格式。JSON的信息主要包含以下五种:'日期', '股票名称', '开盘价', '收盘价', '成交量'。如果有信息不在这五种里面,用'未定义信息'代替。"}]

# 添加实例
for dic in examples_data:
    messages.append({"role": "user", "content": dic["content"]})
    messages.append({"role": "assistant", "content": json.dumps(dic["answers"], ensure_ascii=False)})

# 看看加进去了没
for chunk in messages:
    print(chunk)

# 调用模型
for qs in questions:
    response = client.chat.completions.create(
        model = "qwen3.5-plus",
        messages = messages + [{"role":"user","content":f"请根据之前的实例,照样子把以下文本转为JSON格式:{qs}"}],
    )
    print(response.choices[0].message.content)

也是一题被我改造成编程题的教程,主要考察的是文本提取和分类

日志2

在添加实例部分出了点“小”问题。
现在可运行的代码长这样:

# 添加实例
for dic in examples_data:
    messages.append({"role": "user", "content": dic["content"]})
    messages.append({"role": "assistant", "content": json.dumps(dic["answers"], ensure_ascii=False)})

但是之前是:

# 添加实例
for dic in examples_data:
    messages.append({"role": "user", "content": dic["content"]})
    messages.append({"role": "assistant", "content": dic["answers"]})

我不说你能回答出来为什么出错吗?









好了不逗你了

之前不行的原因是:API 要求 messages 中每条消息的 content 字段必须是字符串或特定格式的多模态列表,而我的代码中直接传入了 dic[“answers”](一个 Python 字典对象)

在请求被发送到 API 服务器时,客户端会将 Python 对象序列化为 JSON。当服务器解析到 “content”: {…}(字典)而不是 “content”: “…”(字符串)时,就会报类型错误,提示 Input should be a valid string

这就是为什么要用dumps函数进行转换,这样相当于把字典里的内容全都倒出来,连成一个字符串’{“日期”:“2023-01-10”,…}',这样服务器就可以识别了。

结尾

好了这就是我要分享的,希望真的可以帮到你!如果有新的问题值得记录我会继续更新的,晚安!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐