学习大模型RAG和Agent智能体基础知识day2
开头和一些废话
今天是学习的第二天!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”,…}',这样服务器就可以识别了。
结尾
好了这就是我要分享的,希望真的可以帮到你!如果有新的问题值得记录我会继续更新的,晚安!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)