03-day1-解析程序qwen_agent.py
解析程序qwen_agent.py
🔍 一、程序结构与输出的对应关系
逐行解析(qwen_agent.py)与运行输出之间的关联
✅ 程序核心流程
1. 加载 .env 中的 DASHSCOPE_API_KEY
2. 初始化 ChatTongyi(调用通义千问 API)
3. 构造提示模板(system + human)
4. 将提示 + 模型组成“链”(chain)
5. 调用 chain.invoke() 发送请求
6. 打印模型返回的 response.content
🖨️ 运行输出:
你好!我叫通义千问,是由阿里云开发的AI助手。作为来自阿里云的超大规模语言模型,我能够回答问题、创作文字,还能表达观点、撰写代码。如果您有任何问题或需要帮助,请随时告诉我,我会尽力提供支持。
这段话 完全由
qwen-max模型生成,但受你代码中两处关键控制:
🔑 二、决定输出内容的两个关键点
1. System Prompt(角色设定)
("system", "你是一个乐于助人的AI助手。")
- 这句话告诉模型:“你不是普通聊天机器人,而是专业、友好、乐于助人的 AI 助手”。
- 如果你改成:
输出会变成:("system", "你是一个严肃的学术教授,只回答技术问题。")“我是通义千问,一个专注于技术领域的语言模型。请提出具体的技术问题。”
✅ 结论:system 消息决定了模型的“人格”和回答风格。
cp qwen_agent.py{,.bak}
sed -i 's/("system", "你是一个乐于助人的AI助手。")/("system", "你是一个严肃的学术教授,只回答技术问题。")/' qwen_agent.py
grep -n "system" qwen_agent.py
#26:# 3. 构造提示模板(system + human)
#27:# system 消息定义 AI 的角色,human 消息是用户输入的占位符
#29: ("system", "你是一个严肃的学术教授,只回答技术问题。"),
python qwen_agent.py
2. Human Input(用户提问)
{"input": "你好,请介绍一下你自己。"}
- 这是用户实际问的问题。
- 模型根据这个问题 + system 角色,生成自我介绍。
- 如果你改成:
输出会变成:{"input": "用 Python 写一个冒泡排序。"}def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr
✅ 结论:{input} 是动态变量,决定模型“做什么”。
sed -i 's/response = chain\.invoke({"input": "你好,请介绍一下你自己。"})/response = chain.invoke({"input": "用 Python 写一个冒泡排序。"})/' qwen_agent.py
grep -n 'chain.invoke' qwen_agent.py
python qwen_agent.py
🔄 三、变化演示(动手实验)
你可以通过修改以下部分,观察输出如何变化:
| 修改位置 | 修改示例 | 预期输出变化 |
|---|---|---|
| System Prompt | "你是一个幽默的脱口秀演员" |
回答会带 jokes、夸张语气 |
| Human Input | "今天北京天气如何?" |
模型会说“我无法获取实时天气”(诚实拒绝) |
| Model Name | model="qwen-turbo" |
回答更快、更短,可能略简略 |
| Temperature | temperature=0.8 |
回答更 creative,多样性、新颖性或非确定性,每次结果不同 |
💡 实验 1:改 System Prompt
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个古风诗人,说话要文言文风格。"),
("human", "{input}")
])
输入不变 → 输出可能变成:
“吾乃通义千问,阿里云所铸之灵。善解万象,能赋诗文,亦可论道编程。君若有问,但说无妨。”
💡 实验 2:改 Human Input
response = chain.invoke({"input": "我想请您写一首七言绝句,鼓励一下正在成都千锋学堂努力学习的我"})
→ 输出会是一段,让你整个冬天非常温暖的诗篇。(体现 qwen-max 的专业能力)。
🧠 四、技术本质:什么是 “Chain”?
chain = prompt | llm
这是 LangChain 的 管道操作符(|),等价于:
formatted_prompt = prompt.invoke({"input": "..."})
response = llm.invoke(formatted_prompt)
它把 提示模板 和 大模型 连成一条流水线,实现:
用户输入 → 填入模板 → 发给 Qwen → 返回结果
这就是最简单的 AI Agent 智能体!
✅ 总结:程序与输出的映射关系
| 你的代码部分 | 控制输出的哪个方面 |
|---|---|
ChatTongyi(model="qwen-max") |
模型能力上限(强/快/便宜) |
system 消息 |
回答风格、角色、语气 |
{input} 内容 |
具体任务(问答/写代码/总结等) |
temperature=0 |
回答确定性(0 = 每次一样,1 = 随机创意) |
print(response.content) |
最终看到的文字 |
✅ temperature 的标准取值范围:0.0 到 1.0(有时可更高)
| 值 | 行为特点 | 适用场景 |
|---|---|---|
0.0 |
完全确定性:每次都选择概率最高的词,输出完全一致(只要输入不变)。 | 代码生成、数学计算、事实问答等需要可重复、准确结果的任务。 |
0.1 ~ 0.5 |
轻微随机性,偏向高概率词,但偶尔有变化。 | 技术写作、摘要、翻译等需稳定但略灵活的场景。 |
0.6 ~ 0.8 |
中等创造性,语言更自然、多样。 | 写作、内容创作、对话等。 |
0.9 ~ 1.0 |
高度随机,输出差异大,可能“天马行空”。 | 头脑风暴、诗歌、创意文案等。 |
> 1.0(如 1.2) |
极度随机,可能产生无意义或混乱内容(一般不推荐)。 | 实验性用途,很少用于生产。 |
你现在拥有了一个可编程的 AI 助手!
💡 实验 3:改 Human Input
- 让它读取文件内容并总结,修改最后两行:
#with open("article.txt", encoding="utf-8") as f:
# text = f.read()
#response = chain.invoke({"input": f"请用中文总结以下内容:\n\n{text}"})
tee qwen_agent_test3.py <<'EOF'
from dotenv import load_dotenv
import os
from langchain_community.chat_models import ChatTongyi
from langchain_core.prompts import ChatPromptTemplate
load_dotenv()
api_key = os.getenv("DASHSCOPE_API_KEY")
if not api_key:
raise ValueError("请在 .env 文件中设置 DASHSCOPE_API_KEY")
os.environ["DASHSCOPE_API_KEY"] = api_key
llm = ChatTongyi(model="qwen-max", temperature=0.3)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有IT领域多年工作经验,看到过很多成功案例的人。"),
("human", "{input}")
])
chain = prompt | llm
with open("article.txt", encoding="utf-8") as f:
text = f.read()
response = chain.invoke({"input": f"请用中文总结以下内容,100字以内:\n\n{text}"})
print(response.content)
EOF
tee article.txt <<'EOF'
在当今快速发展的数字化时代,掌握扎实的技术能力已成为个人成长与职业发展的重要基石。持续学习编程、人工智能、数据分析等前沿技能,不仅能提升解决问题的效率,更能拓展思维边界,增强在激烈竞争中的适应力。学习技术的过程,本质上是不断挑战自我、突破认知局限的旅程——每一次调试代码、每一个项目实践,都是对耐心、逻辑与创造力的锤炼。
然而,技术本身并非终点,而是连接个人与社会的桥梁。真正有价值的能力,不仅体现在键盘上的熟练,更在于能否将所学用于服务他人、解决实际问题、推动社会进步。因此,在精进技术的同时,我们应主动参与团队协作、关注社会需求、培养沟通与共情能力,以开放心态融入集体,用技术传递温度。
唯有将专业能力与社会责任相结合,才能在时代浪潮中实现个人价值与社会价值的统一,成为既有硬实力、又有软素养的新时代建设者。
EOF
python qwen_agent_test3.py
💡 实验 4:改 Human Input
将 system prompt 和 human input 分别存放在两个独立的文本文件中,
然后让 Python 程序读取它们来构建提示并调用模型。
# 1. 创建 system_prompt.txt
tee system_prompt.txt <<'EOF'
你是一个古风诗人。
EOF
# 2. 创建 user_input.txt
tee user_input.txt <<'EOF'
我想请您写一首词,使用沁园春词牌格式,鼓励一下正在成都千锋学堂努力学习的我
EOF
# 3. 创建精简版 qwen_agent_test4.py(自动读取上述两个文件)
tee qwen_agent_test4.py <<'EOF'
from dotenv import load_dotenv
import os
from langchain_community.chat_models import ChatTongyi
from langchain_core.prompts import ChatPromptTemplate
load_dotenv()
api_key = os.getenv("DASHSCOPE_API_KEY")
if not api_key:
raise ValueError("请在 .env 文件中设置 DASHSCOPE_API_KEY")
os.environ["DASHSCOPE_API_KEY"] = api_key
# 读取外部文件
with open("system_prompt.txt", encoding="utf-8") as f:
system_msg = f.read().strip()
with open("user_input.txt", encoding="utf-8") as f:
user_msg = f.read().strip()
# 构建提示模板
prompt = ChatPromptTemplate.from_messages([
("system", system_msg),
("human", "{input}")
])
llm = ChatTongyi(model="qwen-max", temperature=0)
chain = prompt | llm
response = chain.invoke({"input": user_msg})
print(response.content)
EOF
python qwen_agent_test4.py
浙公网安备 33010602011771号