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":"本轮新提问"}
]
相关推荐
Mojitocean1 小时前
Win开发环境配置(持续更新)
开发语言·python
千里码aicood1 小时前
flask基于数字人的储粮知识问答原型系统研究与实现
后端·python·flask
StarRocks_labs1 小时前
从 6000+ Commit 中识别升级风险:一个 StarRocks AI 升级扫描工具的实现
starrocks·ai·commit·分析·claude code
E_ICEBLUE1 小时前
Python 实现 Markdown 转 Word、PDF:从转换到页面设置
python·pdf·word·markdown·格式转换
哒咩哒咩1291 小时前
Agent 智能体开发全攻略:从 ReAct 到企业级架构
python·langchain·fastapi
徒步@天涯1 小时前
dify安装报错:fetch-pack: invalid index-pack output
ai
H愚公移山H1 小时前
Tengine2.4.1 + OpenSSL1.1.1w 全平台编译踩坑手册(CentOS7 x86_64|Linux x64|ARM64|2026实战复盘)
python
码云骑士2 小时前
120-视频理解-大模型视频分析-抽帧-自动字幕摘要-高光片段
python·音视频
xfan_me2 小时前
手机在网状态接口-空号查询-空号过滤API
数据库·人工智能·python·智能手机
宝桥南山2 小时前
GitHub Copilot - 尝试配置和使用一下Microsoft Fabric Core MCP Server
运维·microsoft·ai·微软·powerbi·fabric