本文属于【Azure 架构师学习笔记】系列。
本文属于【Azure AI】系列。
一、前言(承接上一篇)
上一篇我们成功跑通了第一个基础Azure Agent,核心实现了「文本总结」单一功能,只能处理纯文本输入,且无法记住上下文、不能扩展其他功能,只能满足最基础的使用需求。
这一篇我们直接对Agent进行升级,摆脱"单一功能、无记忆"的局限,打造一个真正能用的实用型Agent,全程复用已有的Azure GPT-4模型和azure_config.json配置文件,代码可直接复制运行,无需额外配置,新手也能轻松上手。
本篇核心收获(3个升级点+1个核心能力):
-
✅ 新增「多轮记忆功能」:Agent能记住你上一句的提问和回复,实现连贯对话,不用重复输入上下文;
-
✅ 支持「多工具调度」:在文本总结基础上,新增智能问答工具,Agent可自动识别任务类型,调用对应工具;
-
✅ 优化「意图解析逻辑」:不用死板输入"文本总结"前缀,输入自然语言(如"总结这段话""什么是Agent"),Agent可自动识别需求;
-
✅ 掌握「Agent扩展架构」:理解多工具、记忆模块的整合逻辑,为下一篇实现"文件处理"打下基础。
下面是这次的架构图:

二、实操
需确认以下2点:
-
确认azure_config.json文件存在(和本篇代码放在同一目录),文件中包含azure_endpoint、api_key、deployment_name三个核心配;
-
确认OpenAI依赖已安装,若未安装,打开CMD/PowerShell执行以下命令:
pip install openai --user。
代码
python
from openai import AzureOpenAI
import json
import os
# ===================== 1. Azure配置加载(完全复用第二篇,无需修改) =====================
# 配置文件路径
CONFIG_FILE = "azure_config.json"
def load_azure_config():
"""加载Azure OpenAI配置,新增容错处理,避免配置错误导致程序崩溃"""
if os.path.exists(CONFIG_FILE):
try:
with open(CONFIG_FILE, "r", encoding="utf-8") as f:
config = json.load(f)
# 验证核心配置是否完整(适配GPT-4部署,避免误填)
required_keys = ["azure_endpoint", "api_key", "deployment_name"]
if all(key in config for key in required_keys):
return config
else:
print("⚠️ Azure配置文件不完整,将重新引导输入")
except Exception as e:
print(f"⚠️ 配置文件读取失败({str(e)}),将重新引导输入")
# 若配置文件不存在/读取失败,引导用户重新输入并生成新文件(
config = {
"azure_endpoint": input("请输入AzureEndpoint:"),
"api_key": input("请输入Azure OpenAI API Key:"),
"deployment_name": input("请输入GPT-4模型部署名称:")
}
with open(CONFIG_FILE, "w", encoding="utf-8") as f:
json.dump(config, f, ensure_ascii=False, indent=4)
return config
# 初始化Azure OpenAI客户端
config = load_azure_config()
client = AzureOpenAI(
azure_endpoint=config["azure_endpoint"],
api_key=config["api_key"],
api_version="2025-01-01-preview" # 兼容GPT-4的稳定版本,避免调用失败
)
# ===================== 2. 核心工具模块(新增智能问答,复用文本总结) =====================
# 工具1:文本总结工具(优化提示词,适配多场景)
def summary_tool(text: str) -> str:
"""文本总结工具,GPT-4驱动,总结简洁、准确,适配职场、学习等多场景"""
try:
response = client.chat.completions.create(
model=config["deployment_name"],
messages=[
{"role": "system", "content": "你是专业的文本总结助手,总结需简洁、准确,突出核心要点,控制在100字内,无冗余内容,适配多场景需求。"},
{"role": "user", "content": f"请总结以下文本:\n{text}"}
],
temperature=0.2 # 降低随机性,确保总结结果稳定、可复用
)
return response.choices[0].message.content.strip()
except Exception as e:
return f"❌ 总结失败:{str(e)}(请检查Azure配置或网络连接)"
# 工具2:智能问答工具(新增,支持多轮上下文问答,依赖记忆模块)
def qa_tool(question: str, history: list) -> str:
"""智能问答工具,GPT-4驱动,可结合历史对话记忆,回答更连贯"""
# 构建对话历史,将之前的交互加入消息列表,实现上下文关联
messages = []
for q, a in history:
messages.append({"role": "user", "content": q})
messages.append({"role": "assistant", "content": a})
# 加入当前用户的提问
messages.append({"role": "user", "content": question})
try:
response = client.chat.completions.create(
model=config["deployment_name"],
messages=messages,
temperature=0.3 # 适度提高随机性,让回答更灵活
)
return response.choices[0].message.content.strip()
except Exception as e:
return f"❌ 问答失败:{str(e)}(请检查Azure配置或网络连接)"
# ===================== 3. 升级后Agent核心(带记忆+多工具调度) =====================
class MemoryAgent:
def __init__(self):
self.history = [] # 记忆存储列表,存储(用户提问,Agent回复)的元组
# 工具映射字典:工具名称→工具函数,后续新增工具只需添加映射,扩展性强
self.tools = {
"总结": summary_tool,
"问答": qa_tool
}
def parse_intent(self, msg: str) -> tuple:
"""智能意图解析(升级重点):自动识别用户需求,无需死板输入指令头"""
# 转换为小写,提高关键词匹配的容错性(不区分大小写)
instruction_lower = msg.lower()
# 关键词匹配,判断任务类型
if any(keyword in instruction_lower for keyword in ["总结", "概括", "简述", "提炼"]):
# 识别到总结需求,返回任务类型和待处理文本
return "总结", msg
else:
# 未识别到总结需求,默认视为问答需求(包含上下文问答)
return "问答", msg
def run(self, msg: str) -> str:
"""Agent运行入口:串联「解析指令→调用工具→记忆上下文→返回结果」全流程"""
print(f"🔍 Agent接收指令:{msg}")
# 1. 解析用户意图,判断任务类型
intent, content = self.parse_intent(msg)
# 2. 根据任务类型,调用对应工具
if intent == "总结":
# 调用总结工具,处理用户输入的文本
result = self.tools["总结"](content)
else:
# 调用问答工具,传入历史记忆,实现上下文关联
result = self.tools["问答"](content, self.history)
# 3. 将本次交互存入记忆(用于后续多轮对话)
self.history.append((msg, result))
# 控制记忆长度,避免占用过多内存(只保留最近5次交互,可按需调整)
if len(self.history) > 5:
self.history.pop(0)
# 4. 返回格式化结果,清晰易懂
return result
# ===================== 4. 运行测试(附完整样本,直接复制使用) =====================
if __name__ == "__main__":
# 初始化带记忆的多工具Agent
agent = MemoryAgent()
print("✅ 记忆型多工具Azure Agent已启动(基于GPT-4驱动)")
print("📌 支持功能:文本总结 + 多轮智能问答(带上下文记忆)")
print("📌 示例指令(直接复制使用,无需固定格式):")
print(" 1. 总结:今天召开项目会议,讨论了下一版本的功能迭代计划,确定了需求优先级,预计下周三完成开发。")
print(" 2. 提问:什么是AI Agent?")
print(" 3. 追问:它的核心模块有哪些?(无需重复说明,Agent会记住上一个问题)")
print("📌 输入「退出」即可结束运行")
# 交互测试,模拟实际使用场景(带多轮记忆演示)
while True:
user_input = input("\n请输入指令:")
if user_input in ["退出", "exit", "quit"]:
print("❌ Agent已停止运行")
break
# 运行Agent并输出结果
result = agent.run(user_input)
print(f"\nAgent:{result}\n")
出现启动提示后,证明代码正常:

测试:
- 基础文本总结 。 输入以下内容:
总结:今天完成了Azure环境配置,安装了Python依赖包,成功运行了第一个GPT-4智能Agent,测试了文本总结功能,后续将升级文件处理功能。
预期结果:Agent自动识别总结需求,调用总结工具,返回简洁的总结(100字内),示例如下:

- 多轮智能问答(验证记忆功能)。输入以下两条记录内容:
第一条: 什么是Azure OpenAI Agent?
第二条:它和普通的GPT-4调用有什么区别?
预期结果:Agent记住第一条指令的提问,第二条追问无需重复说明"Azure OpenAI Agent",直接给出连贯的回答,验证多轮记忆功能。


- 自然语言意图识别,输入以下内容:
简述一下AI Agent的核心作用
预期结果:Agent自动识别"简述"为总结需求,调用总结工具,返回简洁的核心作用说明,验证意图解析的灵活性。

- 异常场景验证。
输入以下指令,验证Agent的容错能力:
总结
预期结果:Agent不会崩溃,返回清晰的错误提示(如"请提供需要总结的文本内容"),避免程序异常退出。

注意记忆功能仅限于当前会话,退出之后会清除:

三、 知识点讲解
本次升级的核心逻辑
-
记忆机制:用列表self.history存储(用户提问,Agent回复)的元组,每次交互后存入,调用问答工具时传入历史记录,实现上下文关联;同时控制记忆长度,避免内存占用过多。
-
多工具调度:通过self.tools字典实现"工具名称→工具函数"的映射,后续新增文件处理、结果保存等工具,只需在字典中添加对应映射,无需修改Agent核心逻辑,扩展性强。
-
意图解析优化:摆脱"固定指令头"的局限,通过关键词匹配识别用户需求,更贴合自然语言交互习惯,为后续职场实战(处理文件指令)打下基础。
四、总结
本次升级让Agent具备了"记忆+多工具"能力,但仍局限于纯文本处理,无法满足职场中"处理文件"的高频需求。下一篇我们将进入实战落地阶段,基于本篇的架构,实现以下核心功能:
-
✅ 读取Word、PDF、TXT三种常见办公文件;
-
✅ 自动总结文件内容(结合本篇的总结工具);
-
✅ 将总结结果保存到本地文件(新增保存工具);
-
✅ 优化容错性,适配职场中常见的文件异常场景。
本篇我们完成了Azure Agent的核心升级,实现了「多轮记忆」和「多工具调度」两大核心功能,优化了意图解析逻辑,摆脱了"单一功能、无记忆"的局限,让Agent从"基础工具"升级为"实用型助手"。