Skip to content

Latest commit

 

History

History
435 lines (341 loc) · 13.9 KB

File metadata and controls

435 lines (341 loc) · 13.9 KB
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,以此类推

运行效果

图片描述

  • 推荐了两种方案
    1. 不换行
    2. 换行

继续对话

执行第一种方案

图片描述

  • 执行成功

图片描述

验证方案推荐

图片描述

  • 按照推荐方式验证

验证

按照推荐进行验证
  • 验证结果

图片描述

总结

  • 这次我们
    • 分颜色 输出 上下文
    • 让智能体使用起终端工具

图片描述

  • 如何让智能体 更加具有主动性呢?
  • 下次再说👋

  • 本文来自 oeasy Python 系统教程。
  • 想完整、扎实学 Python,
  • 搜索 oeasy 即可。