开头

各位好啊!
如你所见博主是个新手,新到这是我第一次发博客。
现在是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的方法,毕竟这个警告太烦了!

结语

好了,今天遇到的问题就这些,如果我写的没错的话,希望可以帮到你。

最后,可以给个赞吗?(装可爱)

Logo

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

更多推荐