笔记跟着黑马程序员大模型RAG与Agent智能体项目实战教程,基于主流的LangChain技术从大模型提示词到实战项目学习记录的

前置准备

注册登录下面的网址

大模型服务平台百炼控制台

创建APIKey,获得千问大模型免费额度

打开pycharm,新建项目,新建python文件,并在终端运行下面的命令,下载openai这个库

pip install openai

通过下面的代码进行调用API

from openai import OpenAI
import os

client = OpenAI(
    # 如果没有配置环境变量,请用阿里云百炼API Key替换:api_key="sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://llm-loac4vqn7yqa87y4.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",
)

messages = [{"role": "user", "content": "你是谁"}]
completion = client.chat.completions.create(
    model="qwen3-max-2026-01-23",  # 您可以按需更换为其它深度思考模型
    messages=messages,
    extra_body={"enable_thinking": True},
    stream=True
)
is_answering = False  # 是否进入回复阶段
print("\n" + "=" * 20 + "思考过程" + "=" * 20)
for chunk in completion:
    if not chunk.choices:
        continue
    delta = chunk.choices[0].delta
    if hasattr(delta, "reasoning_content") and delta.reasoning_content is not None:
        if not is_answering:
            print(delta.reasoning_content, end="", flush=True)
    if hasattr(delta, "content") and delta.content:
        if not is_answering:
            print("\n" + "=" * 20 + "完整回复" + "=" * 20)
            is_answering = True
        print(delta.content, end="", flush=True)

代码逐行解释

# 导入OpenAI兼容SDK库
from openai import OpenAI
# 导入系统环境变量模块,读取密钥
import os

# 初始化百炼兼容OpenAI格式客户端
client = OpenAI(
    # 从系统环境变量读取API密钥
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    # 阿里云百炼专属接口地址
    base_url="https://llm-loac4vqn7yqa87y4.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",
)

# 构造对话列表,仅用户提问:你是谁
messages = [{"role": "user", "content": "你是谁"}]

# 调用大模型接口
completion = client.chat.completions.create(
    model="qwen3-max-2026-01-23", # 指定调用的模型版本
    messages=messages, # 传入对话上下文
    extra_body={"enable_thinking": True}, # 开启深度思考模式,返回思考过程
    stream=True # 开启流式分片返回
)

is_answering = False # 标记:是否已经开始输出最终答案

# 打印分割标题:思考过程
print("\n" + "=" * 20 + "思考过程" + "=" * 20)

# 循环遍历流式返回的每一块数据chunk
for chunk in completion:
    # 当前分片无有效内容,跳过本次循环
    if not chunk.choices:
        continue
    # 取出本次增量更新的delta对象
    delta = chunk.choices[0].delta

    # 判断存在思考内容字段且不为空
    if hasattr(delta, "reasoning_content") and delta.reasoning_content is not None:
        # 还没进入回答阶段,连续打印思考文字
        if not is_answering:
            print(delta.reasoning_content, end="", flush=True)

    # 判断存在正式回答内容且不为空
    if hasattr(delta, "content") and delta.content:
        # 第一次输出回答时,打印标题并切换标记
        if not is_answering:
            print("\n" + "=" * 20 + "完整回复" + "=" * 20)
            is_answering = True
        # 连续打印最终回答,实时刷新缓冲区
        print(delta.content, end="", flush=True)

开发调用大模型接口,直接硬编码 API Key 容易泄露,配置系统环境变量又会修改本机环境。使用 .env + python‑dotenv,仅项目级别生效,无需改动系统环境变量。

1. 安装依赖

运行下面的

pip install python-dotenv

2. 创建配置文件

项目根目录新建 .env

OPENAI_API_KEY=sk-你的密钥
DASHSCOPE_API_KEY=sk-你的密钥

3.完整代码

from openai import OpenAI
import os
from dotenv import load_dotenv

# 新增:加载项目下.env文件
load_dotenv()

client = OpenAI(
    # 读取.env中的 DASHSCOPE_API_KEY
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://llm-loac4vqn7yqa87y4.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",
)

# 增加判空,防止密钥为空
api_key = os.getenv("DASHSCOPE_API_KEY")
if not api_key:
    raise ValueError("未读取到 DASHSCOPE_API_KEY,请检查项目根目录 .env 文件")

messages = [{"role": "user", "content": "你是谁"}]
completion = client.chat.completions.create(
    model="qwen3-max-2026-01-23",  # 您可以按需更换为其它深度思考模型
    messages=messages,
    extra_body={"enable_thinking": True},
    stream=True
)
is_answering = False  # 是否进入回复阶段
print("\n" + "=" * 20 + "思考过程" + "=" * 20)
for chunk in completion:
    if not chunk.choices:
        continue
    delta = chunk.choices[0].delta
    if hasattr(delta, "reasoning_content") and delta.reasoning_content is not None:
        if not is_answering:
            print(delta.reasoning_content, end="", flush=True)
    if hasattr(delta, "content") and delta.content:
        if not is_answering:
            print("\n" + "=" * 20 + "完整回复" + "=" * 20)
            is_answering = True
        print(delta.content, end="", flush=True)

OpenAI 库基础使用

OpenAI 库是官方 Python SDK,封装 HTTP 请求、身份校验等底层逻辑,方便调用聊天、绘图、语音等 API。

获取客户端对象:传入api_keybase_url初始化客户端导入与实例化客户端

from openai import OpenAI
client = OpenAI(
    api_key="your_api_key_here",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

两个核心参数
api_key:服务商提供的身份密钥,不建议硬编码写在代码中,推荐使用.env环境变量管理。
base_url:API 接口地址,修改该参数就可以切换不同大模型服务商(OpenAI、阿里云百炼、腾讯云等兼容接口)

调用模型:调用接口发送请求

OpenAI SDK:调用模型 create 方法

client.chat.completions.create()

用于发起对话请求,返回ChatCompletion对象
核心参数
model:指定调用的模型名称,例如qwen3‑max
messages:消息列表,列表中是多条字典,每条字典包含 role、content
三种 role 角色
system:系统角色,设定 AI 身份、行为规则、全局提示,作用于整个对话
assistant:AI 助手角色,代表模型历史回复
user:用户角色,代表用户提问与指令
简单示例

response = client.chat.completions.create(
    model="qwen3-max",
    messages=[
        {"role":"system","content":"你是Python编程专家"},
        {"role":"assistant","content":"我是Python编程专家,请问需要什么帮助?"},
        {"role":"user","content":"for循环输出1到5的数字"}
    ]
)


要点:messages 数组维护完整对话上下文,多轮对话需要把历史消息全部传入。

处理结果:接收并解析返回数据不用手写 http 请求,更换base_url就可以切换不同大模型服务商。

{
  "id": "chatcmpl-xxxx",
  "object": "chat.completion",
  "created": 1735689600,
  "model": "gpt-3.5-turbo-0125",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "生成的回复内容"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 50,
    "completion_tokens": 80,
    "total_tokens": 130
  }
}

OpenAI SDK:处理接口返回结果
调用create()后得到ChatCompletion响应对象。
核心字段
choices:模型返回结果数组,一般取第 0 项choices[0]
message.content:模型输出的回答文本
finish_reason:结束原因
stop:正常结束
length:token 长度超限截断
function_call:触发函数调用
usage:令牌消耗统计
prompt_tokens:输入 token 数
completion_tokens:输出 token 数
total_tokens:总消耗 token
获取回答代码

# 获取模型回复文本
ans = response.choices[0].message.content
print(ans)

国内兼容 OpenAI 协议的大模型,返回数据结构保持一致,代码无需改动。

OpenAI库的流式输出

from openai import OpenAI
import os
from dotenv import load_dotenv

# 新增:加载项目下.env文件
load_dotenv()
# 获取client对象,OpenAI类对象
client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://llm-loac4vqn7yqa87y4.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",
)
#2.调用模型接口,传入对话上下文并开启流式增量输出
response = client.chat.completions.create(
    model="qwen3-max-2026-01-23",  # 您可以按需更换为其它深度思考模型
    messages=[
{"role":"system","content":"你是Python编程专家"},
{"role":"assistant","content":"我是Python编程专家,请问需要什么帮助?"},
{"role":"user","content":"for循环输出1到5的数字"}
    ],
    stream=True #开启流式输出功能
)
#3.处理结果,迭代遍历流式返回结果分片,实时拼接并打印增量内容
#print(response.choices[0].message.content)
for chunk in response:
    print(
        chunk.choices[0].delta.content,
          end=" ",#每一段之间以空格间隔否则为回车符
        flush=True# 强制刷新缓冲区,实时打印输出,不等待缓冲区填满
    )

在2.调用模型处添加 stream=True #开启流式输出功能


在3.处理结果处修改,遍历流式响应迭代器,逐块解析返回分片(chunk),通过delta增量字段获取本轮新增生成内容,end=""取消默认换行符实现连贯打字输出,flush=True强制刷新标准输出缓冲区,确保内容即时打印至控制台。

for chunk in response:
    print(
        chunk.choices[0].delta.content,
          end=" ",#每一段之间以空格间隔否则为回车符
        flush=True
    )

OpenAI库附带历史消息调用模型

messages 整体是 List(列表),列表内每一条对话为 字典 dict,固定 role(角色)+content(内容)结构。
列表有序存放多轮历史对话,给模型传递上下文,实现连续问答。
三种 role 角色
system:系统设定,定义 AI 身份、回答风格
user:用户提问内容
assistant:AI 上一轮回复内容
流式输出
参数 stream=True 开启流式返回,返回Stream迭代对象,不能直接用 .choices[0].message.content(会报属性错误)
流式正确写法:循环遍历分片chunk,读取 chunk.choices[0].delta.content 逐段打印
对话持久化
代码里直接定义的messages仅单次生效,程序结束对话丢失。
生产环境方案:把对话历史存入文件 / 数据库做持久存储。
进阶:后续通过LangChain库实现对话短期记忆、长期记忆管理。
调用结构

# messages标准格式
messages = [
    {"role":"system","content":"设定指令"},
    {"role":"user","content":"上轮问题"},
    {"role":"assistant","content":"上轮回答"},
    {"role":"user","content":"本轮新提问"}
]
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐