笔记跟着黑马程序员大模型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_key、base_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":"本轮新提问"}
]