学习大模型RAG与Agent智能体基础知识day1
开头
各位好啊!
如你所见博主是个新手,新到这是我第一次发博客。
现在是2026.5.20的凌晨(哦情人节到了…),前几周刚刚学完langchain的基础知识,跟着教程做了个前后端(前端因为没学所以代码直接搬教程的)的AI私厨管家,借助阿里云成功在本地网络上跑起来了。
把前后端代码打包放到GitHub后,我开始下一段旅程:RAG知识的学习
学了一两天,我突然想到,或许把遇到的问题和有趣的事情写在博客里可以帮到别人,我自己也能当个错题本(有的错误不是第一次犯了)
所以,就是这样啦,我不擅长写文章,能看到这里真的很谢谢你!
对了,如果你真的想看看那个AI私厨的代码,到这个网址:
https://github.com/QHzzy035/AI_PrivateKitchen
接下来是日志部分!
代码一览
# 导入依赖
from openai import OpenAI
from dotenv import load_dotenv
import os
#导入环境变量
load_dotenv()
# 获取openai对象
openai_object = OpenAI(
base_url=os.getenv("DASHSCOPE_BASE_URL"),
api_key=os.getenv("DASHSCOPE_API_KEY"),
)
# 定义模型
response = openai_object.chat.completions.create(
model = "qwen3.5-plus",
messages=[
{"role":"system","content":"你是一个python编程专家,而且话很多。"},
{"role":"assistant","content":"好的,我是python编程专家,很高兴见到你,你要问什么?"},
{"role":"user","content":"使用python编程技术输出1-10。"}
],
stream=True
)
# 流式输出
for chunk in response:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
日志1:导入dotenv
不要忘记导入dotenv中的load_dotenv并运行load_dotenv,除非你的环境变量都在高级系统设置中配置好了:(这是第二次犯错了)
from dotenv import load_dotenv
import os
如果没有导入这个,调用openai模型时会显示超时(没找到base_url,自动换成了openai官网的url,普通网络打不开)
日志2:流式输出
流式输出存在一些奇怪的地方,我一开始在输出部分写了这些代码:
for chunk in response:
print(chunk.choices[0].delta.content,end="",flush=True)
结果输出就一直蹦出NoneNoneNone(后来发现其实运行一段时间后就正常吐字了),然后我改成了:
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content,end="",flush=True)
有了检测后None不再蹦出来了,结果运行到最后报错:IndexError: list index out of range
根据网上给的资料:
因为 if chunk.choices[0].delta.content: 会先执行 chunk.choices[0],如果 choices 是空列表,就会 IndexError。
所以我又加上了判断chunk.choices非空的代码:
for chunk in response:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
好啦,这下解决了!
日志3:messages警告
等下,messages那块,一直警告:
应为类型 ‘Iterable[ChatCompletionDeveloperMessageParam | ChatCompletionSystemMessageParam | ChatCompletionUserMessageParam | ChatCompletionAssistantMessageParam | ChatCompletionToolMessageParam | ChatCompletionFunctionMessageParam]’,但实际为 ‘list[dict[str, str]]’
问了AI告诉我是:
OpenAI SDK 的 messages 参数在类型系统中被定义为多种特定消息类型的联合(如 ChatCompletionSystemMessageParam、ChatCompletionUserMessageParam 等),每个类型有严格的字段要求(例如 role 必须是特定字面量,content 必须存在)。而你直接使用了通用的 list[dict[str, str]],类型检查器无法确认这些字典是否真的符合 API 所需的精确结构。
简单说就是:openai的消息有专门给用户消息,系统消息,AI回复消息,这三类设计的函数,按照SDK设计应该这样改:
from openai.types.chat import ChatCompletionSystemMessageParam, ChatCompletionUserMessageParam, ChatCompletionAssistantMessageParam
messages = [
ChatCompletionSystemMessageParam(role="system", content="..."),
ChatCompletionAssistantMessageParam(role="assistant", content="..."), # 注意拼写
ChatCompletionUserMessageParam(role="user", content="...")
]
嗯,有点类似之前学lanngchain写的HumanMessage?但是不太一样,HumanMessages用在键值对中与"messages"相对的值位置:
response = agent.stream(
{"messages":[HumanMessage(content="宝宝,出去玩怎么样?不要老是坐在家里嘛。")]},
stream_mode = "messages"
)
(嗯,请无视文本)
后面我可能会换成SDK的方法,毕竟这个警告太烦了!
结语
好了,今天遇到的问题就这些,如果我写的没错的话,希望可以帮到你。
最后,可以给个赞吗?(装可爱)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)