LemonAI:让大语言模型操控真实软件,实现自然语言驱动的自动化
2026/5/4 22:18:34 网站建设 项目流程

1. 项目概述:当你的AI助手学会“动手”

最近在折腾AI应用开发的朋友,可能都绕不开一个核心痛点:如何让大语言模型(LLM)从“能说会道”的聊天伙伴,变成一个能真正“动手干活”的自动化执行者?比如,你告诉它“帮我查一下明天的天气,然后订一张机票”,它不仅能理解你的意图,还能自动打开浏览器、搜索信息、登录网站、完成预订等一系列操作。这听起来像是科幻电影里的场景,但hexdocom/lemonai这个开源项目,正试图将这种能力带到我们面前。

简单来说,LemonAI是一个AI智能体(AI Agent)框架,它的核心目标是打通大语言模型与现实世界应用程序之间的“最后一公里”。它不满足于让AI仅仅生成文本或代码,而是赋予AI操控真实软件工具(如浏览器、IDE、办公软件)的能力,实现基于自然语言指令的端到端任务自动化。你可以把它想象成一个超级能干的“数字助理”,你只需要用人类语言下达指令,它就能理解、规划并操作各种软件来完成复杂的工作流。

这个项目特别适合以下几类朋友:一是AI应用开发者,希望快速构建具备复杂交互能力的智能体;二是自动化工程师或RPA(机器人流程自动化)爱好者,寻求更智能、更灵活的自动化方案;三是任何对AI赋能实际工作流程感兴趣的技术探索者。如果你曾为连接LLM和具体API而烦恼,或者设想过让AI直接操作你的电脑来完成重复性任务,那么LemonAI值得你深入了解。

2. 核心架构与设计哲学

2.1 从“思考”到“执行”的智能体范式

LemonAI的设计建立在经典的智能体(Agent)范式之上:感知(Perception)- 规划(Planning)- 行动(Action)- 观察(Observation)的循环。但与许多停留在“规划”阶段的框架不同,LemonAI的强项在于“行动”层。它并不试图让LLM去直接生成操控GUI的底层代码(那太复杂且不稳定),而是创新性地采用了“工具封装”和“操作系统级自动化”相结合的思路。

其核心架构可以分解为三层:

  1. 大脑层(Brain):由大语言模型(如GPT-4、Claude或本地模型)担任。负责理解用户指令、拆解任务步骤、决定下一步调用哪个工具,并解析工具执行的结果。
  2. 工具层(Tools):这是LemonAI的肌肉。它将各种应用程序的功能封装成一个个独立的“工具”(Tool)。一个工具通常对应一个具体的操作,比如“在Chrome中打开网页”、“在VSCode中写入文件”、“点击屏幕上的某个按钮”。这些工具通过统一的接口暴露给大脑层调用。
  3. 执行层(Executor):这是LemonAI的神经末梢。它负责将工具层定义的抽象操作,转化为操作系统能识别的具体指令。这里大量依赖成熟的自动化库,例如通过pyautogui控制鼠标键盘,通过selenium控制浏览器,通过特定软件的API或CLI进行交互。

这种设计的精妙之处在于解耦。大脑只需要知道“用什么工具”和“传递什么参数”,完全不用关心这个工具在Windows还是macOS上,是通过什么底层机制实现的。这极大地降低了智能体开发的复杂度,也提高了跨平台的适应性。

2.2 工具生态:可扩展性的基石

LemonAI的核心竞争力之一在于其工具生态的设计。它内置了一批常用工具,但更鼓励开发者扩展。一个工具的定义通常包含:

  • 名称(Name)和描述(Description):这是给LLM“看”的。描述必须清晰准确,让LLM能准确理解这个工具是干什么的,在什么场景下使用。
  • 参数(Parameters):定义工具所需的输入,例如“打开网页”工具需要url参数。
  • 执行方法(_run:具体的代码实现,里面封装了自动化逻辑。

例如,一个简单的“搜索谷歌”工具可能长这样:

from lemonai.tool import Tool class GoogleSearchTool(Tool): name = “google_search” description = “在谷歌搜索引擎中搜索指定的关键词” parameters = { “query”: {“type”: “string”, “description”: “要搜索的关键词”} } def _run(self, query: str): # 使用 selenium 打开浏览器,导航到 google.com,输入关键词并执行搜索 driver.get(“https://www.google.com“) search_box = driver.find_element(By.NAME, “q”) search_box.send_keys(query) search_box.submit() # 可以返回搜索结果页面的标题或前几条摘要 return driver.title

通过这样标准化的封装,任何应用程序的功能都可以被“工具化”,并注入到LemonAI的智能体中,供LLM随时调用。这种设计使得智能体的能力边界可以像搭积木一样轻松扩展。

3. 实操:从零构建你的第一个自动化智能体

理论说得再多,不如动手一试。下面我将带你一步步配置环境,并创建一个能自动进行网络搜索并总结信息的智能体。

3.1 环境准备与基础配置

首先,确保你的开发环境是Python 3.8以上。创建一个新的虚拟环境是一个好习惯。

# 创建并激活虚拟环境(以conda为例) conda create -n lemonai-demo python=3.10 conda activate lemonai-demo # 安装LemonAI核心库 pip install lemonai

除了核心库,我们还需要安装一些本次演示所需的自动化工具依赖。因为我们要操作浏览器,所以需要selenium和对应的WebDriver。

pip install selenium webdriver-manager

webdriver-manager是一个很实用的工具,它能自动下载和管理不同浏览器的驱动,省去手动配置的麻烦。

接下来是配置LLM。LemonAI支持多种模型后端。这里我们以使用OpenAI API为例(你需要拥有一个API Key)。

export OPENAI_API_KEY=‘你的-api-key’

如果你倾向于使用开源模型,LemonAI也支持通过litellm或直接集成transformers库来调用本地模型,但这通常需要更强的本地算力。

3.2 定义工具与创建智能体

现在,我们来编写核心代码。创建一个名为search_agent.py的文件。

import os from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from lemonai import Agent, Tool from lemonai.providers import OpenAIProvider # 1. 定义我们自己的工具:获取网页正文 class GetWebpageContentTool(Tool): “”“获取给定URL对应网页的正文文本内容。”“” name = “get_webpage_content” description = “打开一个网页URL,并提取其主要文本内容。适用于获取新闻、文章等信息。” parameters = { “url”: {“type”: “string”, “description”: “要访问的网页地址”} } def _run(self, url: str): # 初始化一个浏览器实例(这里使用Chrome,无头模式不显示界面) options = webdriver.ChromeOptions() options.add_argument(‘--headless’) # 无头模式,后台运行 options.add_argument(‘--disable-gpu’) options.add_argument(‘--no-sandbox’) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) try: driver.get(url) # 等待页面加载,简单起见用固定等待,生产环境建议用显式等待 import time time.sleep(3) # 一个简单的正文提取:获取整个body的文本。实际应用中可能需要更精细的选择器。 body_text = driver.find_element(By.TAG_NAME, ‘body’).text # 截取前2000个字符作为示例,避免上下文太长 return body_text[:2000] finally: driver.quit() # 2. 定义另一个工具:在谷歌进行搜索 class GoogleSearchTool(Tool): “”“在谷歌上搜索关键词,并返回第一个结果的链接和标题。”“” name = “google_search” description = “使用谷歌搜索引擎搜索一个查询词,返回第一个搜索结果的链接和标题。” parameters = { “query”: {“type”: “string”, “description”: “搜索关键词”} } def _run(self, query: str): options = webdriver.ChromeOptions() options.add_argument(‘--headless’) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) try: driver.get(“https://www.google.com“) search_box = driver.find_element(By.NAME, ‘q’) search_box.send_keys(query) search_box.submit() time.sleep(2) # 获取第一个结果的标题和链接 first_result = driver.find_elements(By.CSS_SELECTOR, ‘div.g’)[0] title = first_result.find_element(By.CSS_SELECTOR, ‘h3’).text link = first_result.find_element(By.CSS_SELECTOR, ‘a’).get_attribute(‘href’) return f“标题:{title}\n链接:{link}” finally: driver.quit() # 3. 初始化LLM提供者(这里用OpenAI) llm_provider = OpenAIProvider(model=“gpt-4-turbo-preview”) # 或使用 “gpt-3.5-turbo” # 4. 创建智能体,并注入我们定义的工具 agent = Agent( provider=llm_provider, tools=[GetWebpageContentTool(), GoogleSearchTool()], verbose=True # 开启详细日志,方便观察执行过程 ) # 5. 运行智能体! if __name__ == “__main__”: task = “请搜索‘最近一周人工智能领域的重要进展’,然后阅读其中一篇报道,并为我总结其核心内容。” result = agent.run(task) print(“\n=== 任务完成 ===\n”) print(result)

3.3 运行解析与过程观察

运行这个脚本:python search_agent.py。当verbose=True时,你会在控制台看到类似以下的思考过程:

[思考] 用户指令:请搜索‘最近一周人工智能领域的重要进展’,然后阅读其中一篇报道,并为我总结其核心内容。 [规划] 我需要先搜索信息,然后获取具体文章内容进行总结。 [行动] 调用工具 ‘google_search’,参数:{“query”: “最近一周人工智能领域的重要进展”} [观察] 工具返回:标题:OpenAI发布新一代模型... - 科技新闻网 | 链接:https://example.com/article/123 [规划] 我得到了一个相关文章的链接。现在需要获取它的内容。 [行动] 调用工具 ‘get_webpage_content’,参数:{“url”: “https://example.com/article/123”} [观察] 工具返回:(网页正文文本,约2000字符) [规划] 我已经获得了文章内容,现在可以对其进行总结。 [思考] (LLM内部对获取的文本进行摘要分析) [最终输出] 根据您的要求,我搜索并阅读了一篇关于OpenAI发布新模型的报道。其核心内容是...

这个过程完美展示了智能体的“思考-行动”循环。LLM(大脑)根据目标,自主决定先调用google_search工具,从返回结果中提取出URL,再调用get_webpage_content工具获取详细信息,最后利用自身的文本理解能力生成摘要。整个过程完全自动化,无需人工干预每一步。

注意:在实际运行中,你可能会遇到一些实际问题。例如,谷歌搜索页面结构可能变化,导致我们的CSS选择器div.g失效。这就是为什么在生产环境中,工具函数的鲁棒性需要精心设计,可能需要更复杂的等待逻辑和元素定位策略。此外,无头浏览器虽然高效,但有些网站会检测并屏蔽无头模式,此时可能需要添加更多options参数来模拟真实浏览器。

4. 深入核心:工具的实现、管理与编排

4.1 打造健壮的工具函数

上面演示的工具比较简单。一个用于生产环境的工具,需要考虑诸多因素:

  1. 错误处理与重试:网络请求可能失败,元素可能找不到。工具内部必须有完善的try...except逻辑,并可能包含重试机制。
  2. 资源管理:像浏览器驱动(driver)这类资源,必须确保在任何情况下(包括异常)都能被正确关闭,避免内存泄漏。上面代码中使用try...finally块是基本要求。
  3. 参数验证与默认值:在_run方法开始处,验证输入参数的有效性。为可选参数提供合理的默认值。
  4. 返回结构化数据:尽量让工具返回结构化的字典(Dict),而不是纯文本字符串。例如,google_search工具可以返回{“title”: “…”, “url”: “…”, “snippet”: “…”},这样后续工具或LLM能更容易解析信息。
  5. 性能与超时:为长时间操作设置超时限制,避免智能体“卡死”。

一个更健壮的GetWebpageContentTool示例框架:

def _run(self, url: str, timeout: int = 10): import requests from bs4 import BeautifulSoup headers = {‘User-Agent’: ‘Mozilla/5.0 …’} try: resp = requests.get(url, headers=headers, timeout=timeout) resp.raise_for_status() # 检查HTTP错误 soup = BeautifulSoup(resp.content, ‘html.parser’) # 移除脚本、样式等无关标签 for script in soup([“script”, “style”]): script.decompose() text = soup.get_text() # 清理多余的空格和换行 lines = (line.strip() for line in text.splitlines()) chunks = (phrase.strip() for line in lines for phrase in line.split(” “)) text = ‘\n’.join(chunk for chunk in chunks if chunk) return {“success”: True, “content”: text[:5000]} # 限制长度 except requests.exceptions.RequestException as e: return {“success”: False, “error”: f“网络请求失败:{e}”} except Exception as e: return {“success”: False, “error”: f“解析失败:{e}”}

这个版本使用requestsBeautifulSoup,比用浏览器驱动更轻量,但无法处理JavaScript渲染的页面。工具选型需根据实际目标网站决定。

4.2 工具的管理与发现:注册表模式

当工具数量增多时,手动维护一个工具列表会变得麻烦。LemonAI通常采用“工具注册表”的模式来集中管理。你可以创建一个tool_registry.py文件:

from lemonai.tool import Tool from .web_tools import GoogleSearchTool, GetWebpageContentTool from .file_tools import ReadFileTool, WriteFileTool from .os_tools import RunCommandTool class ToolRegistry: _tools = {} @classmethod def register(cls, tool_class: type[Tool]): instance = tool_class() cls._tools[instance.name] = instance return tool_class # 方便用作装饰器 @classmethod def get_tools(cls): return list(cls._tools.values()) @classmethod def get_tool(cls, name: str): return cls._tools.get(name) # 注册工具 @ToolRegistry.register class MyGoogleSearchTool(GoogleSearchTool): pass # 使用时 from tool_registry import ToolRegistry agent = Agent(provider=llm_provider, tools=ToolRegistry.get_tools())

这种方式让工具管理变得清晰,也支持动态加载。

4.3 任务的复杂编排:让智能体处理多步骤工作流

简单的智能体可以自动规划,但对于极其复杂、有严格顺序或条件分支的任务,有时需要更高层级的“编排”。LemonAI智能体本身具备规划能力,但我们可以通过设计“元工具”或结合工作流引擎来增强。

一种模式是创建子任务工具。例如,一个ScheduleMeetingTool工具,其内部逻辑是:先调用SearchCalendarTool查空闲时间,再调用SendEmailTool发邀请,最后调用CreateCalendarEventTool创建日程。这个复杂流程对主智能体来说是透明的,它只需要调用一次ScheduleMeetingTool

另一种更高级的模式是利用LemonAI作为工作流中的一个智能节点。例如,使用Airflow或Prefect这类工作流调度平台,其中一个任务节点就是启动一个LemonAI智能体去完成特定信息搜集或决策,然后将结果传递给下一个节点(可能是数据处理的Python函数)。这样,AI的灵活性与工作流引擎的可靠性、可观测性就结合起来了。

5. 实战进阶:集成外部应用与处理复杂场景

5.1 操作桌面软件:以VSCode和Excel为例

LemonAI的真正威力在于操作各种桌面应用。这通常通过以下几种方式实现:

  • 操作系统自动化(UI Automation):使用pyautoguipywinauto(Windows)或pyobjc(macOS)来模拟鼠标键盘操作,识别和点击窗口控件。
  • 应用脚本接口:许多软件提供API、CLI或脚本接口(如VSCode的扩展API、Excel的VBA或openpyxl库)。
  • 中间件协议:通过WebSocket、HTTP等协议与应用的调试端口或插件通信。

示例:创建一个简单的文件编辑工具(模拟VSCode操作)

假设我们想创建一个工具,让智能体能在指定路径用VSCode打开一个文件并插入一行内容。完全模拟GUI操作非常脆弱,我们可以利用VSCode的命令行接口来实现,这稳定得多。

import subprocess import os from lemonai.tool import Tool class VSCodeEditFileTool(Tool): name = “vscode_edit_file” description = “使用Visual Studio Code打开一个文件,并在文件末尾追加一行指定的内容。如果文件不存在会被创建。” parameters = { “file_path”: {“type”: “string”, “description”: “要编辑的文件的绝对路径”}, “content_to_append”: {“type”: “string”, “description”: “要追加到文件末尾的文本内容”} } def _run(self, file_path: str, content_to_append: str): # 1. 确保文件存在 os.makedirs(os.path.dirname(file_path), exist_ok=True) if not os.path.exists(file_path): open(file_path, ‘w’).close() # 2. 使用code命令在后台打开文件(不阻塞) # ‘code’是VSCode的命令行工具,需要先安装 try: subprocess.Popen([“code”, file_path]) except FileNotFoundError: return {“success”: False, “error”: “未找到‘code’命令,请确保VSCode已安装并添加到PATH。”} # 3. 直接使用Python在文件末尾追加内容(更可靠) try: with open(file_path, ‘a’, encoding=‘utf-8’) as f: f.write(“\n” + content_to_append) return {“success”: True, “message”: f“已成功在 {file_path} 末尾追加内容。”} except Exception as e: return {“success”: False, “error”: f“写入文件失败:{e}”}

这个工具避开了不可靠的GUI自动化,而是结合了CLI调用和直接的文件操作,实现了“用VSCode编辑”这个用户意图的核心部分。

5.2 处理需要“状态”的交互流程

有些任务需要维持一个会话状态。例如,操作一个需要登录的网站。你不能让智能体每次操作都重新登录。这时,需要设计状态感知的工具

解决方案是使用工具类实例属性外部会话管理器来保持状态。

class LoginSessionTool(Tool): name = “login_to_site” description = “登录到特定网站,并建立一个持久的会话。必须在执行其他需要认证的操作前调用。” parameters = { “username”: {“type”: “string”, “description”: “用户名”}, “password”: {“type”: “string”, “description”: “密码”} } def __init__(self): super().__init__() self.session = None # 用于保存requests.Session或selenium driver self.is_logged_in = False def _run(self, username: str, password: str): if self.is_logged_in: return {“status”: “info”, “message”: “已经登录过了。”} # 模拟登录过程 self.session = requests.Session() login_data = {‘user’: username, ‘pass’: password} resp = self.session.post(‘https://example.com/login‘, data=login_data) if resp.ok: self.is_logged_in = True return {“status”: “success”, “message”: “登录成功,会话已建立。”} else: return {“status”: “error”, “message”: “登录失败。”} class PostArticleTool(Tool): name = “post_article” description = “在已登录的网站上发布一篇文章。需要先调用login_to_site工具。” parameters = { “title”: {“type”: “string”, “description”: “文章标题”}, “content”: {“type”: “string”, “description”: “文章内容”} } def __init__(self, login_tool: LoginSessionTool): super().__init__() self.login_tool = login_tool # 依赖注入,共享状态 def _run(self, title: str, content: str): if not self.login_tool.is_logged_in or not self.login_tool.session: return {“status”: “error”, “message”: “请先登录。”} # 使用共享的session发帖 data = {‘title’: title, ‘content’: content} resp = self.login_tool.session.post(‘https://example.com/post‘, data=data) # … 处理响应

在创建智能体时,你需要先实例化LoginSessionTool,再将其传递给PostArticleTool,以确保它们共享同一个会话状态。

login_tool = LoginSessionTool() post_tool = PostArticleTool(login_tool) agent = Agent(provider=llm_provider, tools=[login_tool, post_tool])

这样,当你给智能体下达“先登录,然后发布一篇标题为Hello的文章”的指令时,它就能正确地进行有状态的操作了。

6. 避坑指南与性能优化

在实际使用LemonAI构建复杂智能体的过程中,你会遇到不少挑战。以下是我从实践中总结出的关键注意事项和优化技巧。

6.1 常见问题与排查清单

问题现象可能原因排查与解决思路
智能体陷入循环,反复调用同一个工具1. 工具描述不清晰,LLM无法理解其功能或输出。
2. 工具返回的结果格式混乱,LLM无法解析。
3. 任务目标本身模糊或不可实现。
1.优化工具描述:用最清晰、无歧义的语言描述工具的功能、输入和输出。可以加上“Use this tool when you want to…”这样的引导句。
2.结构化工具输出:让工具返回JSON等结构化数据,并在描述中说明返回字段的含义。
3.设置最大步数限制:在Agent初始化时设置max_steps=20,防止无限循环。
4.细化用户指令:给AI更明确、可拆分的指令。
工具执行失败(如元素找不到、网络超时)1. 目标网站或应用UI结构发生变化。
2. 网络环境不稳定。
3. 缺少必要的等待或条件判断。
1.增强工具鲁棒性:使用更通用的CSS选择器或XPath;添加显式等待(WebDriverWait);实现重试机制。
2.添加超时和异常处理:在工具内部捕获所有可能的异常,并返回清晰的错误信息供LLM判断。
3.使用备用方案:例如,网页抓取失败时,可以尝试调用官方API(如果有)。
LLM不理解何时使用某个工具工具集太大,或工具之间的功能描述有重叠。1.工具功能隔离:确保每个工具职责单一,描述独特。
2.提供示例:在工具描述中或给LLM的系统提示里,加入几个工具使用场景的示例。
3.分层设计工具:提供一些高级的“复合工具”,内部封装多个低级工具的操作流程,降低LLM的规划负担。
执行速度非常慢1. LLM API调用延迟高。
2. 工具本身是I/O密集型或计算密集型操作。
3. 智能体规划步骤过多。
1.模型选型:在精度和速度间权衡,对于简单任务可换用更快的模型(如GPT-3.5-Turbo)。
2.异步执行:如果多个工具调用没有依赖关系,可以考虑用异步方式并发执行(但这需要更复杂的智能体架构支持)。
3.缓存结果:对于相同参数的耗时工具调用,可以引入缓存机制。
处理长文本上下文时丢失信息LLM有上下文长度限制,工具返回的网页内容或文档可能很长。1.工具内预处理:在工具内部对长文本进行摘要、提取关键信息后再返回。
2.分步处理:设计智能体先获取目录或大纲,再决定具体获取哪部分内容。
3.使用具有长上下文能力的模型

6.2 提升智能体可靠性的核心技巧

  1. 系统提示词(System Prompt)工程:这是控制智能体行为的关键。除了告诉它“你是一个有帮助的AI助手”,更要明确它的角色、目标和约束。例如:

    “你是一个自动化助手,可以调用各种工具来操作电脑。你的目标是准确理解用户请求,并将其分解为一系列具体的工具调用。你必须严格遵守以下规则:1. 一次只调用一个工具。2. 在调用工具前,确保你拥有所有必需的参数。3. 如果工具执行失败,分析错误信息并尝试另一种方法或告知用户。4. 除非用户明确要求,否则不要对工具返回的结果进行过度解读或添加未提及的信息。” 一个好的系统提示能显著减少智能体的“幻觉”和错误规划。

  2. 让工具输出对LLM“友好”:LLM是文本模型,它“阅读”工具返回的结果。如果返回的是庞大的HTML或二进制数据,LLM会无法处理。确保工具返回的是干净、简洁、信息密度高的文本。例如,网页内容工具应该剥离HTML标签、广告、导航栏,只保留核心正文。

  3. 实施“护栏”机制:对于可能危险或产生副作用的工具(如删除文件、发送邮件),可以在工具内部增加确认逻辑,或者通过一个“安全层”来拦截某些敏感操作。例如,在删除文件的工具里,可以检查路径是否在某个安全目录之外,或者要求传入一个确认码。

  4. 记录与复盘:务必开启verbose日志,或使用更专业的日志库记录下智能体的完整思考链(Chain-of-Thought)。当任务失败时,这些日志是 priceless 的调试依据。你可以分析是工具描述问题、LLM理解问题,还是工具执行本身的问题。

6.3 成本与性能考量

  • LLM API成本:智能体的每一步“思考”和“规划”都可能消耗Token。复杂的任务可能导致数十次LLM调用,成本不容忽视。优化方向:a) 使用更小、更便宜的模型进行简单规划;b) 优化提示词,让LLM的思考更简洁;c) 设计更“粗粒度”的工具,减少规划步骤。
  • 执行时间:浏览器自动化、文件操作等I/O行为是主要耗时点。避免在循环中频繁启动/关闭浏览器,尽量复用会话。对于可预见的批量操作,考虑用传统脚本完成,智能体只负责决策和调度。
  • 并发与扩展:单个智能体是顺序执行的。如果要处理大量独立任务,需要部署多个智能体实例。这时需要考虑任务队列(如RabbitMQ、Redis)、资源池(如浏览器池)和结果收集机制。

LemonAI为我们打开了一扇门,让AI能够直接与数字世界交互。它的价值不在于替代所有自动化脚本,而在于提供了一种自然语言编程的范式。对于流程多变、规则模糊的长尾自动化需求,传统RPA和脚本编写成本高昂,而一个配备了合适工具集的LemonAI智能体,则能通过人类的自然语言指令快速适应。当然,它目前仍处于发展阶段,工具生态的丰富度、执行的绝对可靠性、复杂任务的规划能力,都是需要社区共同努力去完善的方向。从今天开始,为你日常使用的软件封装几个简单的工具,尝试让AI助手帮你完成一些固定的操作流程,你会对AI智能体的未来有更切实的体会。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询