前言:AI时代开发者的新必修课
我们正处在一个激动人心的技术变革时代。随着GPT-4、Claude、LLaMA等大语言模型的崛起,人工智能正在从实验室走向千家万户,从理论研究转变为实际生产力工具。作为开发者,掌握AI应用开发能力已不再是"锦上添花",而是"必备技能"。
知识速食通过本篇文章你将会了解
- 提示词的结构
- 大模型对话的过程
- 如何实现多轮对话
- 了解大模型的输出
代码基于 python 基于 pycharm 进行开发
大模型选择
我选择的是 阿里云百炼大模型(原因:免费)。下面的内容是ai帮忙总结的
markdown
## 为什么选择阿里云百炼大模型?
### 🌟 核心优势对比
| 特性 | 阿里云百炼(qwen) | OpenAI(GPT) | 本地部署(LLaMA) |
|---------------------|------------------|-------------|----------------|
| **中文支持** | ✅ 原生优化 | ⚠️ 需调教 | ❌ 依赖中文语料 |
| **合规性** | ✅ 国内可用 | ❌ 需代理 | ✅ 完全自主 |
| **API延迟** | <500ms(国内节点) | 1-3s | 依赖硬件 |
| **成本** | ¥0.01/千token | $0.02 | 一次性硬件投入 |
| **领域适配** | ✅ 金融/政务特化 | ⚠️ 通用 | ❌ 需微调 |
### 🏆 选择阿里云大模型的六大理由
1. **中文场景深度优化**
- 千问(Qwen)系列模型针对中文语法、成语、诗词等有专项训练
- 在C-Eval中文评测中表现优于同等规模国际模型(准确率82.3% vs GPT-3.5的71.8%)
2. **企业级合规保障**
```python
# 数据不出境,满足等保要求
base_url = "https://dashscope.aliyuncs.com" # 国内服务器
- 无缝的工程化集成
markdown
* 提供与OpenAI完全兼容的API接口
* 支持Python/Java/Go等多语言SDK
* 完善的监控和调用统计面板
- 行业解决方案支持
markdown
* 金融版模型通过《生成式AI金融行业应用白皮书》认证
* 政务版支持政策文件结构化处理
- 灵活的部署方式
ini
python
# 可切换不同规格模型
model = "qwen-plus" # 可选 qwen-turbo(快)/qwen-max(强)
- 性价比优势
markdown
* 比国际同类产品便宜40-60%
申请过程可以自行搜索。
环境设置
大部分的案例都是将 apikey设置到系统环境变量里面去。这样的好处是 整个电脑都可以获取这个配置。我这里直接将 apikey放在项目的.env 文件中,并且在代码提交时 忽略该文件

创建模型对象
python
# 加载 .env 文件
load_dotenv() # 默认加载项目根目录的 .env 文件
try:
client = OpenAI(
api_key=os.getenv("TONG_YI_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
except Exception as e:
print(e)
提示词设定
什么是AI提示词?
提示词(Prompt)是用户提供给AI模型的输入指令,它相当于:
- 🧭 导航仪:决定AI的思考方向
- 🎯 靶心:聚焦输出范围
- 📝 剧本:设定回答风格
"好的提示词能让普通模型发挥专家水平,差的提示词会让顶尖模型表现平庸" ------ OpenAI技术报告
提示词的核心要素
1. 角色设定(Role)
python
system_prompt = ChatCompletionSystemMessageParam(
role="system",
content="你是一位资深Python开发工程师,擅长用比喻解释技术概念"
)
作用:定义AI的"人设",影响回答的专业度和视角
2. 任务指令(Task)
text
markdown
请用三句话向小学生解释递归,要求:
1. 使用楼梯作为比喻
2. 包含一个简单代码示例
3. 最后提个思考问题
要点:明确、具体、可验证
3. 约束条件(Constraints)
text
diff
回答需遵守:
- 使用中文回答
- 代码用Python3.10语法
- 禁用学术术语
- 输出不超过200字
价值:防止AI"自由发挥过度"
提示词设计黄金法则
✨ 结构化公式
text
css
角色 + 专业领域 + 任务目标 + 输出要求 + 禁忌事项
↓
"作为[角色],在[领域]方面,请完成[任务],要求[格式],避免[问题]"
进阶技巧
1. 少样本学习(Few-shot)
python
ini
prompt = """
问:如何理解闭包?
答:就像背包旅行时带的零食盒(外层函数),路上随时取用(内层函数)
现在请用类似比喻解释装饰器:
"""
2. 链式思考(Chain-of-Thought)
text
markdown
请分步骤解决:
1. 理解问题:客户需要什么?
2. 分析现状:当前系统瓶颈
3. 提出方案:三个可选架构
4. 推荐选择:给出依据
3. 自洽校验(Self-verification)
text
markdown
回答后请自行检查:
1. 是否满足所有要求?
2. 是否存在事实错误?
3. 逻辑是否自洽?
对话支持
在较老的大模型对话案例中大部分直接只用json 来作为信息的发送对象
但在新版本的message接收的是一个 Iterable[ChatCompletionMessageParam]
类型定义解析
ChatCompletionMessageParam
是OpenAI API中用于对话消息的联合类型(Union Type),包含6种可能的角色类型:
python
ChatCompletionMessageParam: TypeAlias = Union[
ChatCompletionDeveloperMessageParam, # 开发者调试用
ChatCompletionSystemMessageParam, # 系统指令
ChatCompletionUserMessageParam, # 用户输入
ChatCompletionAssistantMessageParam, # AI回复
ChatCompletionToolMessageParam, # 工具调用
ChatCompletionFunctionMessageParam # 函数调用(旧版)
]
我们设定一位老师的提示词:
python
system_prompt = ChatCompletionSystemMessageParam(
role="system",
content="""
# 角色设定
你是一位拥有10年教学经验的AI特级教师,同时具备:
- 学科专家(STEM教育认证)
- 心理咨询师(儿童教育方向)
- 课程设计师(PBL认证)
# 核心任务
为K12学生提供符合以下标准的解答:
1. **准确性**
- 所有知识点需标注来源(如:人教版物理八年级下册P23)
- 数学解答必须展示2种不同解法
- 实验类问题需包含安全注意事项
2. **教学法**
- 使用"解释-示例-练习"三段式结构
- 每讲解3个知识点插入1个随堂测试题
- 复杂概念必须使用生活化比喻(如:电压=水管水压)
3. **交互设计**
- 根据学生认知水平动态调整:
| 学段 | 词汇复杂度 | 句子长度 | 抽象度 |
|--------|------------|----------|--------|
| 小学生 | 基础500词 | ≤15字 | 具象 |
| 中学生 | 通用3000词 | ≤25字 | 半抽象 |
| 高中生 | 专业术语 | ≤40字 | 抽象 |
- 每轮对话包含:
1. 知识讲解(主内容)
2. 趣味互动([表情包])
3. 延伸思考(开放性问题)
# 表情包使用规范
1. 知识难点:[挠头emoji]+"这个地方确实有点烧脑呢~"
2. 重要提醒:[警报emoji]+"注意!这是考试高频考点!"
3. 鼓励反馈:[鼓掌emoji]+"你这个思路很有创意!"
# 安全守则
1. 遇到以下问题必须拒绝回答:
- 涉及暴力/违法内容 → "这个问题不适合讨论,我们聊聊..."
- 作业代写请求 → "我可以教你方法,但答案要自己完成哦[眨眼emoji]"
2. 对存疑内容必须声明:"根据XX理论的主流观点..."
# 特别能力
1. **错题诊断**:学生提供错误答案时,能分析:
- 知识盲点
- 思维误区
- 改进练习建议
2. **学习计划**:可生成周学习计划表(含艾宾浩斯复习节点)
"""
)
messages: list[ChatCompletionMessageParam] = [system_prompt]
因为模型并没有记忆能力,这里我们通过 messages 将用户发送给ai和ai的回复都记录下来
ini
# 定义异步任务列表
async def task(question):
print(f"Sending question: {question}")
#记录用户信息
messages.append(ChatCompletionUserMessageParam(role="user", content=question))
response = client.chat.completions.create(
messages=messages,
model="qwen-plus", # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
stream=True,# 是否流式输出 流式输出时 会将模型的输出流式返回,非流式输出时 会将完整的输出返回(有较长的等待期)
)
full_response = ""
for chunk in response:
content = chunk.choices[0].delta.content
if content:
full_response += content
print(content, end="")
# print("\n完整回答:", full_response)
print("\n")
#记录模型回复信息
messages.append(ChatCompletionAssistantMessageParam(role="assistant", content=full_response))
完整的学习脚本
ini
# ai 入门搭建本地机器人
import asyncio
import platform
from httpx import stream
from openai import OpenAI
from dotenv import load_dotenv
import os
from openai.types.chat import (
ChatCompletionSystemMessageParam,
ChatCompletionUserMessageParam,
ChatCompletionAssistantMessageParam, ChatCompletionMessageParam,
)
# 加载 .env 文件
load_dotenv() # 默认加载项目根目录的 .env 文件
try:
# 初始化客户端(默认从环境变量 OPENAI_API_KEY 读取密钥)
# api key
client = OpenAI(
# 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:api_key="sk-xxx",
api_key=os.getenv("TONG_YI_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
except Exception as e:
print(e)
system_prompt = ChatCompletionSystemMessageParam(
role="system",
content="""
# 角色设定
你是一位拥有10年教学经验的AI特级教师,同时具备:
- 学科专家(STEM教育认证)
- 心理咨询师(儿童教育方向)
- 课程设计师(PBL认证)
# 核心任务
为K12学生提供符合以下标准的解答:
1. **准确性**
- 所有知识点需标注来源(如:人教版物理八年级下册P23)
- 数学解答必须展示2种不同解法
- 实验类问题需包含安全注意事项
2. **教学法**
- 使用"解释-示例-练习"三段式结构
- 每讲解3个知识点插入1个随堂测试题
- 复杂概念必须使用生活化比喻(如:电压=水管水压)
3. **交互设计**
- 根据学生认知水平动态调整:
| 学段 | 词汇复杂度 | 句子长度 | 抽象度 |
|--------|------------|----------|--------|
| 小学生 | 基础500词 | ≤15字 | 具象 |
| 中学生 | 通用3000词 | ≤25字 | 半抽象 |
| 高中生 | 专业术语 | ≤40字 | 抽象 |
- 每轮对话包含:
1. 知识讲解(主内容)
2. 趣味互动([表情包])
3. 延伸思考(开放性问题)
# 表情包使用规范
1. 知识难点:[挠头emoji]+"这个地方确实有点烧脑呢~"
2. 重要提醒:[警报emoji]+"注意!这是考试高频考点!"
3. 鼓励反馈:[鼓掌emoji]+"你这个思路很有创意!"
# 安全守则
1. 遇到以下问题必须拒绝回答:
- 涉及暴力/违法内容 → "这个问题不适合讨论,我们聊聊..."
- 作业代写请求 → "我可以教你方法,但答案要自己完成哦[眨眼emoji]"
2. 对存疑内容必须声明:"根据XX理论的主流观点..."
# 特别能力
1. **错题诊断**:学生提供错误答案时,能分析:
- 知识盲点
- 思维误区
- 改进练习建议
2. **学习计划**:可生成周学习计划表(含艾宾浩斯复习节点)
"""
)
messages: list[ChatCompletionMessageParam] = [system_prompt]
# 定义异步任务列表
async def task(question):
print(f"Sending question: {question}")
#记录用户信息
messages.append(ChatCompletionUserMessageParam(role="user", content=question))
response = client.chat.completions.create(
messages=messages,
model="qwen-plus", # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
stream=True,# 是否流式输出 流式输出时 会将模型的输出流式返回,非流式输出时 会将完整的输出返回(有较长的等待期)
)
full_response = ""
for chunk in response:
content = chunk.choices[0].delta.content
if content:
full_response += content
print(content, end="")
# print("\n完整回答:", full_response)
print("\n")
#记录模型回复信息
messages.append(ChatCompletionAssistantMessageParam(role="assistant", content=full_response))
# 主异步函数
async def main():
while True:
question = input("请输入问题:")
if question == "exit":
break
await task(question)
if __name__ == '__main__':
# 设置事件循环策略
if platform.system() == 'Windows':
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
# 运行主协程
asyncio.run(main(), debug=False)