探秘AutoGen:模型配置与代码执行全解析(26/30)

一、AutoGen 初相识

在当今人工智能飞速发展的时代,大语言模型如璀璨星辰照亮了各个领域。而在这片星空中,AutoGen 以其独特的光芒,吸引着众多开发者的目光。它是微软精心打造的一款开源的通用多代理对话框架,犹如一把神奇的钥匙,旨在开启基于大型语言模型(LLM)的下一代智能应用程序的大门。

(一)AutoGen 诞生背景

随着人工智能技术的不断进步,大语言模型在自然语言处理、文本生成等方面展现出了惊人的能力。然而,这些模型在面对复杂的实际任务时,往往需要繁琐的人工干预和配置。就好比一个强大的工具,虽然本身功能强大,但使用起来却需要花费大量的时间和精力去调试和设置。AutoGen 的出现,正是为了解决这一痛点。它通过自动化和简化人工智能代理的创建过程,让开发者能够更加轻松地利用大语言模型的强大能力,为各种复杂任务提供高效的解决方案。

(二)核心概念剖析

从本质上讲,AutoGen 是一个多代理系统。在这里,代理就像是一个个智能小助手,它们各自具备特定的功能和任务,能够相互协作、交流,共同完成复杂的任务。这些代理可以根据不同的需求和场景进行定制化设计,就像搭建积木一样,开发者可以根据自己的想法,将不同功能的代理组合在一起,构建出一个功能强大的智能系统。

(三)核心优势尽显

  1. 简化开发流程:想象一下,开发一个基于大语言模型的应用程序,以往需要开发者手动处理大量的细节,从模型的选择、配置,到与各种工具和服务的集成,每一个环节都需要耗费大量的时间和精力。而 AutoGen 就像是一个贴心的助手,它提供了一系列预置组件和工具,大大简化了复杂 Multi - Agent 系统的开发过程。开发者可以专注于业务逻辑的实现,而无需在繁琐的基础架构搭建上花费过多时间,真正实现了快速开发。
  2. 强大的定制能力:不同的任务和场景往往需要不同的解决方案。AutoGen 深知这一点,它允许开发者为不同的任务创建专门的 Agent。无论是处理文本生成、数据分析,还是进行智能客服、自动化测试等任务,都可以通过定制化的 Agent 来实现。这种高度的定制能力,使得 AutoGen 能够灵活应对各种复杂的需求,为开发者提供了无限的可能性。
  3. 无缝集成与扩展:在实际应用中,我们常常需要将不同的人工智能模型和服务结合起来使用。AutoGen 就像是一个万能的连接器,它能够促进不同人工智能模型和服务的无缝集成。不仅如此,其模块化代理架构还方便与第三方工具和服务集成,轻松扩展 LLM 应用程序的功能。就像搭乐高积木一样,你可以不断地添加新的模块和功能,让你的应用程序变得越来越强大。
  4. 提高对话稳健性:在多代理对话系统中,对话的稳定性和可靠性至关重要。AutoGen 通过一系列的技术手段,提高了人工智能对话的稳健性和可靠性。它能够有效地处理各种异常情况,确保对话的流畅进行,为用户带来更加稳定和可靠的使用体验。
  5. 支持多种运行模式:无论是希望系统能够自主运行,自动完成一系列任务,还是需要人工进行监督和干预,AutoGen 都能满足你的需求。它支持自主运行和人工监督两种模式,开发者可以根据实际情况进行灵活选择,为不同的应用场景提供了更加合适的解决方案。
  6. 加速原型设计:对于开发者来说,快速验证想法和进行实验是非常重要的。AutoGen 提供了快速原型设计的能力,通过预置组件,能够大大缩短开发时间,让开发者能够迅速将自己的创意转化为实际的应用。这不仅提高了开发效率,还为创新提供了更加便捷的途径。
  7. 降低开发门槛:以往,开发基于大语言模型的应用程序需要开发者具备深厚的专业知识和丰富的经验。而 AutoGen 的出现,打破了这一壁垒。它通过自动化流程和简单易用的接口,使得非专业人员也能够轻松上手,利用大语言模型的强大能力进行应用开发。这为人工智能技术的普及和应用提供了更加广阔的空间。

(四)广泛应用场景

  1. 智能客服领域:在如今的电商、金融等行业,智能客服的需求日益增长。AutoGen 可以构建出能够理解用户问题、提供准确回答,并能根据用户需求进行进一步交互的智能客服代理。这些代理能够快速响应用户的咨询,解决常见问题,大大提高客户服务的效率和质量,为企业节省大量的人力成本。
  2. 软件开发助力:对于开发者来说,代码编写、调试和优化是一项繁琐的工作。AutoGen 可以作为自动编码助手,根据需求生成代码片段,甚至整个模块。它还能帮助进行代码审查和优化,提高软件开发的效率和质量,让开发者能够更加专注于实现核心功能。
  3. 复杂问题解决:在科研、工程等领域,常常会遇到各种复杂的问题,需要综合考虑多个因素,进行深入的分析和推理。AutoGen 可以组织多个代理,分别负责不同方面的任务,通过协作和交流,共同解决复杂的问题。例如,在数据分析项目中,不同的代理可以分别负责数据收集、清洗、分析和可视化,最终为用户提供全面的数据分析报告。
  4. 创意写作激发:无论是文学创作、广告文案撰写,还是剧本创作等领域,都需要源源不断的创意。AutoGen 可以作为创意伙伴,与创作者进行对话,提供灵感和建议,帮助创作者突破思维定式,创作出更加优秀的作品。例如,在写一篇科幻小说时,它可以提供新奇的情节构思、独特的角色设定等。
  5. 数据分析洞察:在大数据时代,数据分析对于企业的决策至关重要。AutoGen 可以构建数据分析代理,自动处理和分析大量的数据,发现数据中的潜在模式和趋势,并以直观的方式呈现给用户。这使得企业能够更加快速地获取有价值的信息,为决策提供有力支持。

二、AutoGen 配置进行时

2.1 环境准备

AutoGen 的运行离不开 Python 环境的支持,Python 就像是它的 “土壤”,为其生长和发展提供了必要的条件。在选择 Python 版本时,建议使用 3.8 及以上版本,因为这些版本能够更好地兼容 AutoGen 的各种功能和特性。就好比选择合适的土壤来种植植物,只有土壤肥沃、适宜,植物才能茁壮成长。如果你的 Python 版本过低,可能会导致一些功能无法正常使用,甚至在安装过程中就会遇到各种问题。因此,在开始使用 AutoGen 之前,请务必检查你的 Python 环境是否符合要求。

关于Python安装,我专门写了一篇文章,比较详细,欢迎读者学习参考:

01-Python详细安装教程(大妈看了都会)

2.2 安装步骤详解

安装 AutoGen 的过程就像是搭建一座房子,每一个步骤都需要认真对待。首先,确保你的 Python 环境已经准备就绪。然后,打开终端或命令行界面,输入安装命令 “pip install autogen”。这就像是在告诉计算机:“我要安装 AutoGen 这座房子啦,请帮我准备好所需的材料。” 安装过程中,pip 工具会自动下载并安装 AutoGen 及其依赖项。

不过,在这个过程中,可能会遇到一些 “小插曲”。比如,网络问题可能导致下载速度缓慢,甚至下载失败。这时候,你可以尝试更换网络环境,或者使用国内的镜像源来加速下载。就像在不同的道路上行驶,有时候换一条路就能更快地到达目的地。此外,如果遇到依赖项安装失败的情况,需要仔细查看错误信息,找出问题所在。可能是因为某些依赖项的版本不兼容,或者是系统缺少某些必要的库。针对这些问题,可以通过查阅相关文档、在社区中寻求帮助等方式来解决。

2.3 模型配置要点

模型配置是使用 AutoGen 的关键环节,它决定了 AutoGen 在处理任务时的 “智慧” 程度。在配置模型时,需要根据实际需求选择合适的大语言模型。目前,AutoGen 支持多种主流的大语言模型,如 OpenAI 的 GPT 系列、谷歌的 BERT 等。不同的模型在性能、功能和适用场景上都有所不同,就像不同的工具适用于不同的工作一样。

以使用 OpenAI 的 GPT - 3.5 模型为例,首先需要获取 OpenAI 的 API 密钥。这就像是一把钥匙,只有拥有它,才能打开模型的大门,让 AutoGen 与之进行交互。获取 API 密钥后,将其配置到 AutoGen 中。具体来说,在 Python 代码中,可以通过以下方式进行配置:

from autogen import config_list_from_json

config_list = config_list_from_json(env_or_file="OAI_CONFIG_LIST",

filter_dict={

"model": ["gpt-3.5-turbo"]

})

在这段代码中,config_list_from_json函数用于从环境变量或文件中读取配置列表。env_or_file="OAI_CONFIG_LIST"表示配置信息存储在名为OAI_CONFIG_LIST的环境变量或文件中。filter_dict={"model": ["gpt-3.5-turbo"]}则指定了要使用的模型为gpt-3.5-turbo。

配置完成后,还需要进行测试,确保模型能够正常工作。可以编写一个简单的测试代码,让 AutoGen 与模型进行对话,看看是否能够得到预期的结果。例如:

from autogen import AssistantAgent, UserProxyAgent

assistant = AssistantAgent("assistant", llm_config={"config_list": config_list})

user_proxy = UserProxyAgent("user_proxy")

user_proxy.initiate_chat(assistant, message="请介绍一下人工智能的发展历程。")

在这段代码中,创建了一个AssistantAgent和一个UserProxyAgent。AssistantAgent负责与模型进行交互,处理用户的请求。UserProxyAgent则模拟用户,向AssistantAgent发送消息。initiate_chat方法用于启动对话,向AssistantAgent发送消息 “请介绍一下人工智能的发展历程。” 然后观察输出结果,看是否符合预期。如果出现问题,需要仔细检查配置是否正确,API 密钥是否有效等。

2.4 代理与工作流配置

代理和工作流配置是 AutoGen 的重要组成部分,它们决定了 AutoGen 如何处理任务以及各个代理之间如何协作。在 AutoGen 中,代理就像是一个个智能的 “小助手”,它们各自承担着不同的任务,通过相互协作来完成复杂的工作。

配置代理时,需要根据任务的需求和特点,选择合适的代理类型,并设置相应的参数。例如,AssistantAgent主要用于与模型进行交互,处理用户的请求;UserProxyAgent则可以模拟用户的行为,向其他代理发送消息。以一个简单的文本生成任务为例,我们可以这样配置代理:

from autogen import AssistantAgent, UserProxyAgent

assistant = AssistantAgent("assistant",

system_message="你是一个专业的文本生成助手,能够根据用户的需求生成高质量的文本。",

llm_config={"config_list": config_list})

user_proxy = UserProxyAgent("user_proxy")

在这段代码中,为AssistantAgent设置了一个系统消息,明确了它的职责是作为一个专业的文本生成助手。这样,当它接收到用户的请求时,就会根据这个系统消息来生成相应的文本。

工作流配置则是定义了代理之间的交互流程和任务执行顺序。通过合理配置工作流,可以让多个代理协同工作,高效地完成复杂任务。例如,在一个数据分析项目中,可能需要先由一个代理收集数据,然后由另一个代理对数据进行清洗和预处理,最后再由一个代理进行数据分析和可视化。这就需要配置一个合适的工作流,确保各个代理能够按照正确的顺序和方式进行协作。

在 AutoGen 中,可以使用GroupChat和GroupChatManager来管理多个代理之间的对话和协作。例如:

from autogen import GroupChat, GroupChatManager

groupchat = GroupChat(agents=[assistant, user_proxy], messages=[], max_round=10)

manager = GroupChatManager(groupchat=groupchat, llm_config={"config_list": config_list})

在这段代码中,创建了一个GroupChat对象,将assistant和user_proxy两个代理添加到其中。同时,设置了最大对话轮数为 10。然后,创建了一个GroupChatManager对象,用于管理这个GroupChat。通过这种方式,可以有效地管理多个代理之间的对话和协作,实现复杂的工作流。

通过以上步骤,我们可以完成 AutoGen 的基本配置,为后续的开发和应用打下坚实的基础。在实际应用中,还需要根据具体的任务和需求,不断调整和优化配置,以充分发挥 AutoGen 的强大功能。

三、代码执行实战秀

3.1 执行原理剖析

在 AutoGen 中,代码执行的触发机制主要依赖于 UserProxyAgent。当 UserProxyAgent 接收到的消息中包含可执行代码块,并且在没有人工用户输入的情况下,它会自动触发代码执行。这一过程就像是收到了明确指令的机器人,一旦条件满足,就会立即开始执行任务。

具体而言,AutoGen 会将代码发送到指定的执行环境中进行运行。默认情况下,它会使用 Docker 容器来隔离和运行代码,确保代码执行的安全性和稳定性。这就好比将代码放在一个独立的小房间里运行,避免了对其他部分的干扰,也防止了其他因素对代码执行的影响。如果在配置中指定了特定的工作目录,比如在 user_proxy 代理的参数code_execution_config中设置了work_dir,那么代码将在该指定目录下执行。

在执行过程中,AutoGen 会密切关注代码的执行状态和结果。如果代码执行成功,它会将执行结果返回给相关的代理,以便进一步处理。而如果代码执行出现错误,AutoGen 会将错误信息反馈给代理,帮助开发者定位和解决问题。这就像是一个贴心的助手,不仅能帮你做事,还能及时告诉你事情的进展情况。

3.2 执行流程演示

为了更直观地理解代码执行过程,我们以一个简单的任务为例:计算两个数的和,并输出结果。

首先,我们需要配置好模型和代理。假设我们使用 OpenAI 的 GPT - 4 模型,配置代码如下:

import autogen

config_list = [{'model': 'gpt-4', 'api_key': 'your_api_key'}]

这里需要将your_api_key替换为你自己的 OpenAI API 密钥。

接着,创建 AssistantAgent 和 UserProxyAgent 两个代理:

assistant = autogen.AssistantAgent(name="assistant",

llm_config={"cache_seed": 42,

"config_list": config_list,

"temperature": 0})

user_proxy = autogen.UserProxyAgent(name="user_proxy",

human_input_mode="NEVER",

max_consecutive_auto_reply=10,

is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),

code_execution_config={"work_dir": "coding", "use_docker": False})

在这个配置中,human_input_mode="NEVER"表示 UserProxyAgent 不会征求人类用户的反馈,max_consecutive_auto_reply=10设置了最大连续自动回复次数,is_termination_msg用于判断消息是否表示任务结束,code_execution_config则指定了代码执行的工作目录和是否使用 Docker 容器。

然后,通过 user_proxy 向 assistant 发送任务:

user_proxy.initiate_chat(assistant, message="请编写一个Python代码,计算3和5的和,并输出结果。")

当 assistant 接收到任务后,它会根据自身的能力和配置,生成相应的代码。在这个例子中,它可能会生成如下代码:

result = 3 + 5

print(result)

接着,UserProxyAgent 会自动触发代码执行。它会在指定的coding目录下创建一个临时文件,将生成的代码写入该文件,并在该目录下执行该文件。执行完成后,UserProxyAgent 会将执行结果反馈给 assistant。如果代码执行成功,assistant 会接收到结果 8,并根据任务要求进行后续处理。如果代码执行出现错误,比如语法错误或逻辑错误,UserProxyAgent 会将错误信息反馈给 assistant,assistant 会尝试重新生成代码或提供解决方案。

3.3 执行结果处理

当代码执行完成后,我们需要对执行结果进行处理和分析。如果代码执行成功,我们可以获取到输出结果,并根据实际需求进行进一步的操作。例如,如果是一个数据分析任务,我们可以对输出的数据分析结果进行可视化展示,或者将结果保存到数据库中。

在处理结果时,我们可以通过编写相应的代码来解析和利用这些结果。比如,对于上述计算两个数和的任务,我们可以在 UserProxyAgent 中添加如下代码来处理结果:

def process_result(result):

try:

output = int(result.strip())

print(f"计算结果为: {output}")

# 这里可以进行更多的操作,比如将结果保存到文件或数据库

except ValueError:

print("结果解析错误,可能不是一个有效的整数。")

user_proxy.register_function(

    function_map={

        "process_result": process_result

    }    

)

在这个代码中,process_result函数用于处理代码执行的结果。它尝试将结果转换为整数,并进行相应的处理。如果结果解析失败,会输出错误信息。

如果代码执行出现错误,我们需要仔细分析错误信息,找出问题所在。错误信息通常会包含错误类型、错误发生的位置等关键信息,这有助于我们快速定位和解决问题。例如,如果是语法错误,我们可以检查代码是否符合 Python 语法规范;如果是逻辑错误,我们可以逐步调试代码,找出逻辑上的漏洞。

在实际应用中,我们还可以通过设置断点、打印中间变量等方式来调试代码。比如,在生成的代码中添加如下调试语句:

result = 3 + 5

print(f"调试信息:计算结果为 {result}")

print(result)

这样,在代码执行时,会输出调试信息,帮助我们了解代码的执行过程和中间结果。

通过对执行结果的有效处理和分析,以及对错误的及时调试和解决,我们可以不断优化代码,提高任务的执行效率和准确性。

四、常见问题速解决

在使用 AutoGen 进行配置与代码执行的过程中,难免会遇到一些问题,这些问题就像是前进道路上的 “小石子”,虽然不大,但如果不及时解决,也会影响我们的开发进度。下面为大家汇总一些常见问题,并给出相应的解决方案和排查方向。

4.1 Python 版本不兼容

AutoGen 要求 Python 版本在 3.8 到 3.13 之间。如果使用不兼容的 Python 版本,就像给汽车加了不匹配的燃油,可能会导致安装失败或运行时错误。例如,在低版本 Python 环境中安装 AutoGen,可能会出现模块无法导入的情况。

此时,我们需要检查 Python 版本,在终端或命令行中运行python --version或python3 --version来查看当前 Python 版本。如果版本不兼容,可以使用工具如pyenv来安装和管理多个 Python 版本。最后,使用pyenv切换到 3.8 到 3.13 之间的 Python 版本。

4.2 依赖库安装失败

在安装 AutoGen 时,可能会遇到依赖库安装失败的问题,尤其是在网络环境不佳或依赖库版本冲突的情况下。网络问题就像道路堵塞,会导致依赖库下载缓慢甚至失败;而版本冲突则如同两个不兼容的零件,无法正常组装在一起。

为了解决这个问题,我们可以使用国内镜像源,在pip install命令中添加国内镜像源,例如-i Simple Index。如果遇到版本冲突,可以尝试指定依赖库的版本号,例如pip install pyautogen==0.1.0。如果某些依赖库安装失败,还可以尝试手动下载并安装这些库。

4.3 模型配置错误

在使用 AutoGen 时,如果配置的模型不正确,可能会导致运行时错误或性能不佳。比如,使用了不被支持的模型,或者模型的 API 密钥配置错误,就像使用了错误的钥匙,无法打开模型的大门。

要解决这个问题,首先要检查模型配置,确保使用的模型是当前推荐的模型,例如 GPT - 4。如果使用其他模型,可能需要调整系统提示。如果使用较弱的模型(如 GPT - 3.5 - turbo),可能需要调整系统提示以适应模型的能力。此外,如果使用非 OpenAI 或 Azure 托管的模型,可能需要额外注意模型的对齐和安全性问题。

4.4 代码执行失败

在代码执行过程中,可能会出现代码执行失败的情况。这可能是由于代码语法错误、依赖项未安装、工作目录不存在等原因导致的。例如,代码中存在拼写错误,或者在执行代码时,缺少必要的库,就像建造房屋时缺少关键的建筑材料。

当遇到代码执行失败时,我们需要仔细检查代码,查看是否有语法错误。可以使用 Python 的语法检查工具,如pylint或flake8。同时,要确保代码中所需的依赖项已经安装。如果是在指定的工作目录下执行代码,要确保该工作目录存在。此外,还可以查看代码执行的日志信息,从中获取更多的错误提示,以便快速定位和解决问题。

通过对这些常见问题的了解和掌握,我们能够更加顺利地使用 AutoGen 进行开发,充分发挥其强大的功能,为我们的项目带来更多的价值。

五、未来展望与总结

AutoGen 作为一款极具创新性的通用多代理对话框架,为我们打开了基于大型语言模型的下一代智能应用程序的大门。其强大的功能和广泛的应用场景,使其在人工智能领域展现出了巨大的潜力。

在未来,随着人工智能技术的不断发展,AutoGen 有望在多个方面取得更大的突破。从技术角度来看,它可能会进一步优化与更多不同类型大语言模型的集成,不仅能够更加高效地利用模型的能力,还能适应不同场景下对模型性能、成本等方面的多样化需求。例如,在处理大规模数据的复杂分析任务时,能够自动选择最合适的模型组合,以达到最佳的处理效果。

在应用拓展方面,AutoGen 将在更多领域发挥重要作用。在医疗领域,它可以协助医生进行疾病诊断、制定治疗方案,通过多代理协作,整合患者的病历信息、医学研究成果以及临床经验,为医生提供更全面、准确的诊断建议。在教育领域,AutoGen 能够构建智能学习助手,根据学生的学习情况和需求,提供个性化的学习计划、辅导内容以及答疑解惑,极大地提高学习效率和质量。在工业制造中,它可以优化生产流程,实现自动化的生产调度、故障预测与排查,从而提升生产效率,降低生产成本。

此外,随着人们对人工智能应用的安全性和可靠性要求越来越高,AutoGen 也会在这些方面进行改进。通过更加严格的代码审查机制、安全的执行环境以及对模型输出的可靠性验证,确保在各种应用场景下都能为用户提供稳定、安全且准确的服务。

总结来看,AutoGen 以其简化开发流程、强大的定制能力、无缝集成与扩展等诸多优势,为开发者提供了便捷且高效的工具,让我们能够更轻松地利用大语言模型的强大能力。它不仅在当前的各个领域展现出了重要价值,更为未来人工智能技术的发展和应用奠定了坚实的基础。相信在不久的将来,AutoGen 将在人工智能的舞台上大放异彩,为我们的生活和工作带来更多的惊喜和变革。

博主还写了与本文相关文章,欢迎批评指正: 

AI Agent实战30篇目录集绵: 

第一章 Agent基本概念【共7篇】

1、AI Agent 介绍(1/30)

2、AI Agent:重塑业务流程自动化的未来力量(2/30)

3、AI Agent 实战:三步构建,七步优化,看智能体如何进入企业生产(3/30)

4、探秘 AI Agent 之 Coze 智能体:从简介到搭建全攻略(4/30)

5、探秘多AI Agent模式:机遇、应用与未来展望(5/30)

6、探秘 AI Agent 之 Coze 智能体:工作流模式(6/30)

7、探秘 AI Agent 之 Coze 智能体:插件创建与使用(7/30)

第二章 Agent案例分析 【共8篇】

1、AI Agent案例全解析:百度营销智能体(8/30)

2、AI Agent案例与实践全解析:字节智能运维(9/30)

3、Agent 案例分析:金融场景中的智能体-蚂蚁金服案例(10/30)

4、华为 AI Agent:企业内部管理的智能变革引擎(11/30)

5、微众银行金融场景 Agent:创新实践与深度剖析(12/30)

6、京东物流营销 Agent:智能驱动,物流新篇(13/30)

7、数势科技:解锁数据分析 Agent 的智能密码(14/30)

8、南方电网场景中 Agent 的智慧赋能与创新实践(15/30)

第三章 AI Agent应用开发【6篇】

1、让 Agent 具备语音交互能力:技术突破与应用前景(16/30)

2、探寻AI Agent:开启知识图谱自动生成新篇章(17/30)

3、解锁AI Agent潜能:智能时代的信息处理利器(18/30)

4、解锁Agent的数据分析潜能,开启智能决策新时代(19/30)

5、解锁AI Agent潜能:LLaMA3-1-8B-Instruct WebDemo部署实战(20/30)

6、解锁AI Agent潜能:Llama3_1-8B-Instruct与FastApi实战(21/30)

第四章 多Agent框架【7篇】

 1、探秘MetaGPT:革新软件开发的多智能体框架(22/30)

2、单智能体入门:开启智能新世界的钥匙(23/30)

3、多 Agent 框架入门:开启智能协作新时代(24/30)

4、探秘AutoGen框架:从入门到实践的全攻略(25/30)

5、探秘AutoGen:模型配置与代码执行全解析(26/30)

后期文章正在努力创作中,敬请期待......

6.AutoGen工具使用

7.AutoGen控制退出代理对话

第五章 Agent与应用系统【1篇】

1.AI Agent 在客户关系管理系统的整合应用

第六章 智能体工具【1篇】

1.Text2Sql

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在走向自律

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值