RAG与Agent智能体项目实战教程跟练与解析(前置准备与OpenAI库基础使用)

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

前置准备

注册登录下面的网址

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

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

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

bash 复制代码
pip install openai
点击并拖拽以移动

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

python 复制代码
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)
点击并拖拽以移动

代码逐行解释

python 复制代码
# 导入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. 安装依赖

运行下面的

bash 复制代码
pip install python-dotenv
点击并拖拽以移动

2. 创建配置文件

项目根目录新建 .env

python 复制代码
OPENAI_API_KEY=sk-你的密钥
DASHSCOPE_API_KEY=sk-你的密钥
点击并拖拽以移动

3.完整代码

python 复制代码
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初始化客户端导入与实例化客户端

python 复制代码
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 方法

python 复制代码
client.chat.completions.create()

用于发起对话请求,返回ChatCompletion对象

核心参数

model:指定调用的模型名称,例如qwen3‑max

messages:消息列表,列表中是多条字典,每条字典包含 role、content

三种 role 角色

system:系统角色,设定 AI 身份、行为规则、全局提示,作用于整个对话

assistant:AI 助手角色,代表模型历史回复

user:用户角色,代表用户提问与指令

简单示例

python 复制代码
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就可以切换不同大模型服务商。

python 复制代码
{
  "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 项choices0

message.content:模型输出的回答文本

finish_reason:结束原因

stop:正常结束

length:token 长度超限截断

function_call:触发函数调用

usage:令牌消耗统计

prompt_tokens:输入 token 数

completion_tokens:输出 token 数

total_tokens:总消耗 token

获取回答代码

python 复制代码
# 获取模型回复文本
ans = response.choices[0].message.content
print(ans)
点击并拖拽以移动

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

OpenAI库的流式输出

python 复制代码
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.choices0.delta.content,

end=" ",#每一段之间以空格间隔否则为回车符

flush=True

)

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

messages 整体是 List(列表),列表内每一条对话为 字典 dict,固定 role(角色)+content(内容)结构。

列表有序存放多轮历史对话,给模型传递上下文,实现连续问答。

三种 role 角色

system:系统设定,定义 AI 身份、回答风格

user:用户提问内容

assistant:AI 上一轮回复内容

流式输出

参数 stream=True 开启流式返回,返回Stream迭代对象,不能直接用 .choices0.message.content(会报属性错误)

流式正确写法:循环遍历分片chunk,读取 chunk.choices0.delta.content 逐段打印

对话持久化

代码里直接定义的messages仅单次生效,程序结束对话丢失。

生产环境方案:把对话历史存入文件 / 数据库做持久存储。

进阶:后续通过LangChain库实现对话短期记忆、长期记忆管理。

调用结构

复制代码
# messages标准格式
messages = [
    {"role":"system","content":"设定指令"},
    {"role":"user","content":"上轮问题"},
    {"role":"assistant","content":"上轮回答"},
    {"role":"user","content":"本轮新提问"}
]
相关推荐
青 春 记 忆6 小时前
LeetCode 21. 合并两个有序链表|Python 解法详解
python·算法·leetcode·链表
大数据魔法师8 小时前
DuckDB高阶实战指南!多文件处理、窗口函数、性能调优、工程化落地
python·数据分析
Patrick在香港9 小时前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术9 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
QAQo7T10 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
醉颜凉10 小时前
蓝桥杯2025年第十六届省赛真题-最大数字 Python题解
python·职场和发展·蓝桥杯
卷无止境11 小时前
当独立开发者也能造出3A画质的游戏:Godot引擎深度解析
后端·python·godot
TechEdu20260611 小时前
[人工智能]TensorFlow深度学习框架工程实践概览
人工智能·深度学习·ai·tensorflow