Error in user YAML: (<unknown>): found a tab character that violate indentation while scanning a plain scalar at line 3 column 3
---
- oeasy Python 0786
- 这是 oeasy 系统化 Python 教程,从基础一步步讲,扎实、完整、不跳步。愿意花时间学,就能真正学会。
- 本教程同步发布在:
- 个人网站: `https://oeasy.org`
- 蓝桥云课: `https://www.lanqiao.cn/courses/3584`
- GitHub: `https://github.com/overmind1980/oeasy-python-tutorial`
- Gitee: `https://gitee.com/overmind1980/oeasypython`
----
上次我们让智能体使用起终端工具
- 由于 大模型能力 很强
- 用起来得心应手
-
我有一个大胆的想法:
- 以后 就只靠说话
- 就控制系统文件操作了?🤔
- 可行吗?🤔
def show_messages(messages):
print()
counter = 1
for message in messages:
print("\033[4" + str(counter) + "m",end="")
print(message,end="")
print("\33[0m",end="")
counter = counter + 1
if counter == 7:
counter = 1
- 按颜色区分上下文
from openai import OpenAI
import subprocess
import re
import json
client = OpenAI(
base_url='https://api-inference.modelscope.cn/v1', api_key='ms-2af1d081-9a7f-4a34-8ec2-b32d7ea8765c', # ModelScope Token
)
def execute_command(command):
"""执行终端命令并返回结果"""
try:
result = subprocess.run(command, shell=True, capture_output=True, text=True, timeout=30)
if result.returncode == 0:
return f"命令执行成功:\n{result.stdout}"
else:
return f"命令执行失败 (返回码: {result.returncode}):\n{result.stderr}"
except subprocess.TimeoutExpired:
return "命令执行超时 (30秒)"
except Exception as e:
return f"命令执行出错: {str(e)}"
def parse_and_execute_commands(text):
"""解析文本中的命令标记并执行"""
# 查找 [COMMAND: xxx] 格式的命令
command_pattern = r'\[COMMAND:\s*([^\]]+)\]'
commands = re.findall(command_pattern, text)
results = []
for cmd in commands:
cmd = cmd.strip()
print(f"\n执行命令: {cmd}")
result = execute_command(cmd)
results.append(f"命令: {cmd}\n结果: {result}")
print(f"结果: {result}")
return results
def chat_with_commands():
"""支持命令执行的对话循环"""
messages = [
{
'role': 'system',
'content': '''你是一个有用的助手,可以执行终端命令来获取系统信息。
当你需要执行命令时,请使用以下格式:
[COMMAND: 命令内容]
例如:
- [COMMAND: date] - 获取当前时间
- [COMMAND: ls -la] - 列出文件
- [COMMAND: pwd] - 获取当前目录
- [COMMAND: whoami] - 获取当前用户
- [COMMAND: uname -a] - 获取系统信息
命令会被自动执行,结果会作为上下文提供给你。请根据命令结果给出更准确的回答。'''
}
]
while True:
user_input = input("\n用户: ")
if user_input.lower() in ['quit', 'exit', '退出']:
break
messages.append({
'role': 'user',
'content': user_input
})
print("\n助手: ", end='', flush=True)
print("=====Message=====")
print(messages)
response = client.chat.completions.create(
model='Qwen/Qwen3-Next-80B-A3B-Instruct',
messages=messages,
stream=True
)
assistant_response = ""
for chunk in response:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
print(content, end='', flush=True)
assistant_response += content
# 检查回复中是否包含命令
command_results = parse_and_execute_commands(assistant_response)
# 如果有命令执行结果,将其添加到上下文中
if command_results:
context_message = "\n\n命令执行结果:\n" + "\n\n".join(command_results)
messages.append({
'role': 'assistant',
'content': assistant_response
})
messages.append({
'role': 'user',
'content': f"以下是命令执行结果,请根据这些信息继续回答:{context_message}"
})
print("\n\n基于命令结果的补充回答: ", end='', flush=True)
# 基于命令结果生成补充回答
response = client.chat.completions.create(
model='Qwen/Qwen3-Next-80B-A3B-Instruct',
messages=messages,
stream=True
)
final_response = ""
for chunk in response:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
print(content, end='', flush=True)
final_response += content
messages.append({
'role': 'assistant',
'content': final_response
})
else:
messages.append({
'role': 'assistant',
'content': assistant_response
})
if __name__ == "__main__":
print("智能助手已启动!可以使用终端命令获取系统信息。")
print("输入 'quit' 或 'exit' 退出程序。")
chat_with_commands()
def show_messages(messages):
print()
counter = 1
for message in messages:
print("\033[4" + str(counter) + "m",end="")
print(message,end="")
print("\33[0m")
counter = counter + 1
if counter == 7:
counter = 1
- 定义专门函数
- 输出上下文
from openai import OpenAI
import subprocess
import re
import json
client = OpenAI(
base_url='https://api-inference.modelscope.cn/v1', api_key='ms-2af1d081-9a7f-4a34-8ec2-b32d7ea8765c', # ModelScope Token
)
def execute_command(command):
"""执行终端命令并返回结果"""
try:
result = subprocess.run(command, shell=True, capture_output=True, text=True, timeout=30)
if result.returncode == 0:
return f"命令执行成功:\n{result.stdout}"
else:
return f"命令执行失败 (返回码: {result.returncode}):\n{result.stderr}"
except subprocess.TimeoutExpired:
return "命令执行超时 (30秒)"
except Exception as e:
return f"命令执行出错: {str(e)}"
def parse_and_execute_commands(text):
"""解析文本中的命令标记并执行"""
# 查找 [COMMAND: xxx] 格式的命令
command_pattern = r'\[COMMAND:\s*([^\]]+)\]'
commands = re.findall(command_pattern, text)
results = []
for cmd in commands:
cmd = cmd.strip()
print(f"\n执行命令: {cmd}")
result = execute_command(cmd)
results.append(f"命令: {cmd}\n结果: {result}")
print(f"结果: {result}")
return results
def chat_with_commands():
"""支持命令执行的对话循环"""
messages = [
{
'role': 'system',
'content': '''你是一个有用的助手,可以执行终端命令来获取系统信息。
当你需要执行命令时,请使用以下格式:
[COMMAND: 命令内容]
例如:
- [COMMAND: date] - 获取当前时间
- [COMMAND: ls -la] - 列出文件
- [COMMAND: pwd] - 获取当前目录
- [COMMAND: whoami] - 获取当前用户
- [COMMAND: uname -a] - 获取系统信息
命令会被自动执行,结果会作为上下文提供给你。请根据命令结果给出更准确的回答。'''
}
]
while True:
user_input = input("\n用户: ")
if user_input.lower() in ['quit', 'exit', '退出']:
break
messages.append({
'role': 'user',
'content': user_input
})
print("\n助手: ", end='', flush=True)
response = client.chat.completions.create(
model='Qwen/Qwen3-Next-80B-A3B-Instruct',
messages=messages,
stream=True
)
assistant_response = ""
for chunk in response:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
print(content, end='', flush=True)
assistant_response += content
# 检查回复中是否包含命令
command_results = parse_and_execute_commands(assistant_response)
# 如果有命令执行结果,将其添加到上下文中
if command_results:
context_message = "\n\n命令执行结果:\n" + "\n\n".join(command_results)
messages.append({
'role': 'assistant',
'content': assistant_response
})
messages.append({
'role': 'user',
'content': f"以下是命令执行结果,请根据这些信息继续回答:{context_message}"
})
print("\n\n基于命令结果的补充回答: ", end='', flush=True)
# 基于命令结果生成补充回答
response = client.chat.completions.create(
model='Qwen/Qwen3-Next-80B-A3B-Instruct',
messages=messages,
stream=True
)
final_response = ""
for chunk in response:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
print(content, end='', flush=True)
final_response += content
messages.append({
'role': 'assistant',
'content': final_response
})
else:
messages.append({
'role': 'assistant',
'content': assistant_response
})
show_messages(messages)
def show_messages(messages):
print()
counter = 1
for message in messages:
print("\033[4" + str(counter) + "m",end="")
print(message,end="")
print("\33[0m")
counter = counter + 1
if counter == 7:
counter = 1
if __name__ == "__main__":
print("智能助手已启动!可以使用终端命令获取系统信息。")
print("输入 'quit' 或 'exit' 退出程序。")
chat_with_commands()
今天星期几
- 输出效果
- 可以利用上下文吗?
这一天有什么发生历史上
- 上下文 确实起到了作用
| 角色名称(英文/中文) | 核心作用 | 典型应用场景 | 示例 |
|---|---|---|---|
| system(系统) | 全局指令设定者,为其他角色定义交互规则、背景约束,不直接参与对话内容 | 初始化助手人设、限定回答风格、设定任务边界 | “你是专业的数学老师,回答需用初中学生能理解的语言,步骤不超过3步” |
| user(用户) | 需求发起者,向助手提出问题、下达任务或提供信息 | 日常问答、指令下达、信息输入 | “帮我写一封请假条”“解释什么是区块链” |
| assistant(助手) | 需求响应者,根据system规则和user需求生成回答、执行任务 | 回答问题、生成内容、完成指令 | 针对请假条需求,生成完整的请假条文本;解释区块链时附带简单案例 |
| tool(工具) | 能力扩展角色,助手无法直接完成的任务(如计算、查询、绘图)需调用它 | 数据计算、实时搜索、文件处理、图像生成 | 助手接到“计算2024年第一季度天数”的需求,调用calculator工具返回结果;接到“画一只猫”的需求,调用image_generator工具生成图片 |
| function(函数) | 具体执行单元,属于tool的细分,是助手可调用的代码/接口函数 | 复杂逻辑处理、API调用、数据转换 | 助手需“解析Excel表格中的销售数据”,调用pandas_read_excel函数读取数据,再调用data_visualize函数生成图表 |
| agent(智能体) | 自主协作角色,拥有独立目标,可代替用户或助手完成多步骤任务,甚至调用其他角色 | 自动化流程、多任务协作、复杂问题拆解 | 用户提出“整理2024年3月的会议纪要并生成PPT”,agent会先调用user确认会议纪要文件,再调用function提取关键信息,最后调用tool生成PPT |
| memory(记忆) | 信息存储角色,记录对话历史、用户偏好、任务进度,供其他角色调用 | 多轮对话上下文衔接、个性化服务 | 用户之前说过“喜欢极简风格的报告”,memory存储该偏好,助手后续生成报告时会自动应用极简格式;多轮对话中,memory记录前序讨论的结论,避免重复提问 |
我想建立5个文本文件,从1.txt到5.txt,每个文件里面有数字对应个数的数字,1.txt中有1个1,5.txt中有5个5,以此类推
- 推荐了两种方案
- 不换行
- 换行
执行第一种方案
- 执行成功
- 按照推荐方式验证
按照推荐进行验证
- 验证结果
- 这次我们
- 分颜色 输出 上下文
- 让智能体使用起终端工具
- 如何让智能体 更加具有主动性呢?
- 下次再说👋
- 本文来自 oeasy Python 系统教程。
- 想完整、扎实学 Python,
- 搜索 oeasy 即可。









