OpenHands SDK实战:构建能理解、规划与执行的AI软件智能体
软件智能体是人工智能领域从感知走向行动的关键技术,它基于大语言模型的理解与推理能力,能够将高层级的人类指令分解为可执行的具体步骤。其核心原理在于将外部工具(如API、数据库、系统操作)进行标准化封装,并通过智能规划模块动态调用,从而实现对复杂任务的自主完成。这一技术为自动化流程带来了革命性价值,它超越了传统RPA脚本的刻板与脆弱性,能够灵活适应环境变化,处理非结构化任务。在应用场景上,软件智能体正
1. 项目概述:从“手”到“脑”的智能体进化
最近在折腾AI智能体开发时,发现了一个挺有意思的项目:OpenHands/software-agent-sdk。乍一看名字,可能会联想到“开源之手”,感觉像是某种机器人控制或硬件接口。但深入一扒,发现它其实是一个专注于构建“软件智能体”的软件开发工具包。这名字起得挺妙,“手”象征着执行和操作,而“软件智能体”正是那个能在数字世界里自主执行任务的“手”和“脑”。简单来说,这个SDK的目标,就是让开发者能更轻松地打造出能理解指令、规划步骤、调用工具(比如API、数据库、甚至其他软件),并最终完成复杂任务的AI程序,而不仅仅是生成一段文本或代码。
如果你正在研究AI Agent、自动化流程、RPA(机器人流程自动化)的下一代形态,或者单纯想让自己手头的重复性软件操作变得智能起来,那么这个项目值得你花时间了解一下。它试图解决的,正是当前AI应用从“对话”走向“行动”的关键瓶颈:如何让大语言模型(LLM)不仅“能说会道”,还能“动手做事”。接下来,我会结合自己搭建和测试的经验,拆解它的核心设计、实操要点以及那些官方文档可能不会明说的“坑”。
2. 核心架构与设计哲学拆解
2.1 什么是“软件智能体”?与传统RPA和脚本的区别
在深入SDK之前,我们得先统一认知:什么是“软件智能体”?你可以把它想象成一个数字世界里的高级实习生。你给它一个目标,比如“把上周销售数据整理成PPT,并邮件发给经理”,它不会只给你生成一段描述这个过程的文字,而是会真的去登录系统、查询数据库、整理Excel、生成图表、打开PPT模板、填入数据、保存文件、打开邮箱客户端、撰写邮件、添加附件、点击发送。这一连串的动作,涉及对多个软件环境的理解、操作和协调。
这与传统RPA有本质区别。传统RPA更像是“录屏回放”,依赖预先录制或严格定义的UI元素定位和操作序列,灵活性差,环境一变就容易失效。而软件智能体基于LLM的理解和规划能力,具备一定的泛化性和容错性。它也不同于简单的脚本,脚本需要开发者精确编写每一步逻辑,而智能体可以在高层目标指导下,自主分解任务、选择工具、处理异常。
OpenHands SDK的设计哲学,正是为了降低构建这类智能体的门槛。它没有试图造一个“万能智能体”,而是提供了一套标准化的“乐高积木”(核心组件)和“组装说明书”(框架与流程),让开发者可以基于自己的业务场景,快速拼装出专属的智能体。
2.2 SDK核心组件四层架构剖析
我仔细研究了其代码和设计,认为其架构可以抽象为四个层次,这有助于我们理解其运作方式。
第一层:能力抽象层(Tool & Skill) 这是智能体的“手”和“专业工具库”。SDK将一切可执行的操作抽象为“工具”。一个工具通常包含:工具描述(告诉LLM这个工具是干什么的)、输入参数定义、执行函数。例如,“读取文件”、“执行SQL查询”、“调用某REST API”、“模拟键盘输入”都可以被封装成工具。更高级的,多个基础工具可以组合成一个“技能”,比如“生成周报”技能,内部可能串联了“查询数据”、“生成图表”、“填充模板”等多个工具。这一层的关键在于抽象良好、描述清晰,确保LLM能准确理解何时该调用哪个工具。
第二层:大脑与记忆层(Agent Core & Memory) 这是智能体的“脑”和“记事本”。核心是一个与LLM(如GPT-4、Claude、或本地模型)交互的模块。它负责接收用户目标或上级指令,结合当前上下文(记忆)进行任务规划、工具调用决策和结果解析。记忆模块则至关重要,它保存了对话历史、工具执行结果、环境状态等。没有记忆的智能体就像金鱼,无法进行多轮复杂协作。SDK通常会提供短期记忆(会话内)和长期记忆(可持久化)的接口。
第三层:控制流与协调层(Orchestrator & Workflow) 单个智能体能力有限,复杂任务需要多个智能体协作,或者一个智能体需要遵循特定流程。这一层提供了任务编排和工作流引擎。例如,可以定义一个“审核流程”:智能体A生成初稿,触发智能体B进行合规检查,再交由智能体C进行格式化输出。SDK通过提供流程定义、状态管理、异常处理等机制,让多智能体协同变得可控。
第四层:环境与部署层(Runtime & Deployment) 智能体最终需要在一个环境中运行。这个环境可能是一个本地进程、一个Docker容器、一个云函数,或者集成到现有应用中。SDK需要提供轻量级的运行时,管理智能体的生命周期、资源隔离、安全沙箱(特别是当智能体需要执行系统级操作时)。部署层则关心如何打包、分发和监控智能体。
注意:OpenHands SDK目前可能更侧重于前两层,即提供强大的工具集成能力和智能体核心框架,对于复杂的工作流编排和企业级部署,可能需要结合其他系统或进行二次开发。
3. 快速上手指南:构建你的第一个文件处理智能体
理论讲再多不如动手试一下。我们假设一个最常见场景:构建一个能自动整理下载文件夹的智能体。它会根据文件扩展名,将文件移动到不同的子文件夹(如图片、文档、压缩包等)。
3.1 环境准备与初始化
首先,确保你的开发环境有Python 3.8+。然后安装SDK。通常可以通过pip安装开发中的版本,但务必查看项目README确认最新安装方式。
# 假设安装方式如下(请以官方文档为准)
pip install openhands-agent-sdk
# 或者从源码安装
# git clone https://github.com/OpenHands/software-agent-sdk.git
# cd software-agent-sdk
# pip install -e .
接下来,你需要一个LLM的API密钥。OpenHands SDK通常支持多种LLM后端。这里以OpenAI为例(你也可以配置使用开源的Llama、Qwen等本地模型,但需要相应的推理服务)。
import os
from openhands.agent import Agent
from openhands.tools import BaseTool
from typing import Optional
# 设置你的LLM API密钥(强烈建议使用环境变量,不要硬编码在代码中)
os.environ[“OPENAI_API_KEY”] = “your-api-key-here”
# 如果使用其他模型,可能需要设置如 ANTHROPIC_API_KEY, GROQ_API_KEY 等
3.2 定义自定义工具:文件操作工具
SDK的强大之处在于可以轻松扩展工具。我们来创建两个工具:一个用于扫描目录,一个用于移动文件。
import shutil
from pathlib import Path
from openhands.tools import tool
# 使用装饰器 @tool 可以快速将函数注册为工具,并自动生成描述供LLM理解。
@tool
def scan_directory(directory_path: str) -> list:
“””
扫描指定目录,返回文件列表信息。
Args:
directory_path: 要扫描的目录路径。
Returns:
包含文件信息的字典列表,如 [{‘name’: ‘a.jpg’, ‘size’: 1024, ‘type’: ‘file’}, …]
“””
path = Path(directory_path)
if not path.exists() or not path.is_dir():
return [{“error”: f”目录 {directory_path} 不存在或不是目录”}]
files = []
for item in path.iterdir():
if item.is_file():
files.append({
“name”: item.name,
“size”: item.stat().st_size,
“type”: “file”,
“suffix”: item.suffix.lower()
})
# 返回结构化的数据,便于LLM理解
return {“files”: files, “count”: len(files)}
@tool
def move_file_to_category(source_file: str, target_category: str, base_directory: str) -> dict:
“””
将文件移动到按类别划分的子文件夹中。
Args:
source_file: 要移动的源文件名(在base_directory下)。
target_category: 目标类别,如 ‘images’, ‘documents’。
base_directory: 基础目录路径,源文件在此目录下,目标文件夹也将创建于此。
Returns:
操作结果状态。
“””
base_path = Path(base_directory)
source_path = base_path / source_file
target_dir = base_path / target_category
if not source_path.exists():
return {“status”: “error”, “message”: f”源文件 {source_file} 不存在”}
# 创建目标目录(如果不存在)
target_dir.mkdir(exist_ok=True)
try:
shutil.move(str(source_path), str(target_dir / source_file))
return {“status”: “success”, “message”: f”已移动 {source_file} 到 {target_category}/”}
except Exception as e:
return {“status”: “error”, “message”: f”移动失败: {str(e)}”}
3.3 组装智能体并测试
现在,我们将工具赋予智能体,并给它一个目标。
# 1. 创建智能体实例,指定使用的LLM模型
agent = Agent(
name=“FileOrganizer”,
model=“gpt-4-turbo”, # 或 “claude-3-opus-20240229”, “qwen-plus” 等,取决于SDK支持
tools=[scan_directory, move_file_to_category], # 注入我们定义的工具
system_prompt=“””你是一个文件管理助手。你的任务是帮助用户整理文件。
你可以扫描目录获取文件列表,然后根据文件后缀名将其归类移动。
常见的归类规则:
- 图片(.jpg, .jpeg, .png, .gif, .bmp) -> ‘images’ 文件夹
- 文档(.pdf, .docx, .txt, .md) -> ‘documents’ 文件夹
- 压缩包(.zip, .rar, .7z) -> ‘archives’ 文件夹
- 其他文件暂时不动。
请一步一步地思考,先扫描,再决定如何移动。每次移动请确认文件存在。
“””
)
# 2. 给智能体下达指令
user_query = “请帮我整理一下 /Users/me/Downloads 这个文件夹里的文件。”
response = agent.run(user_query)
print(“智能体回复:”, response[“output”])
# 你可能会看到类似这样的输出:
# “我将开始整理 /Users/me/Downloads 目录。首先,扫描该目录...”
# “扫描完成,共发现15个文件。其中,a.jpg, b.png 是图片,将移动到 ‘images’ 文件夹...”
# “移动操作完成。所有文件已按类别整理完毕。”
在这个过程中,智能体内部发生了:
- 理解目标 :LLM解析用户指令,理解需要整理
/Users/me/Downloads。 - 规划任务 :根据系统提示,它知道第一步应该是扫描目录。于是它决定调用
scan_directory工具。 - 执行与观察 :SDK执行
scan_directory(“/Users/me/Downloads”),将返回的文件列表结果反馈给LLM。 - 决策与再执行 :LLM分析文件列表,根据后缀名对每个文件进行分类,然后为每个需要移动的文件规划一次
move_file_to_category调用。SDK会按顺序或并行(取决于配置)执行这些调用。 - 汇总回复 :所有工具调用完成后,LLM根据结果生成最终的自然语言回复给用户。
3.4 实操心得:工具描述与系统提示的博弈
这是你第一个容易踩坑的地方。智能体表现的好坏,极度依赖两点: 工具描述的清晰度 和 系统提示的引导性 。
- 工具描述 :
@tool装饰器会自动使用函数的docstring作为描述。务必把参数意义、返回值格式写清楚。LLM靠这个来决定是否调用以及如何传参。例如,如果move_file_to_category的参数source_file你描述成“文件路径”,LLM可能会错误地传入绝对路径/Users/me/Downloads/a.jpg,而我们的工具期望的是相对于base_directory的文件名a.jpg。所以描述要精确到:“源文件名(位于base_directory目录下)”。 - 系统提示 :这是智能体的“人格”和“工作手册”。你需要:
- 明确角色 :“你是一个文件管理助手。”
- 规定流程 :“请一步一步地思考,先扫描,再决定如何移动。”
- 定义规则 :清晰地列出分类规则。模糊的规则会导致混乱的决策。
- 设定边界 :“每次移动请确认文件存在。” 这能减少因幻觉(hallucination)导致的错误操作。
- 输出格式 :如果你希望它用特定格式回复,也可以在这里说明。
我的经验是,花在打磨工具描述和系统提示上的时间,往往比写代码本身还多。这是构建可靠智能体的关键。
4. 深入核心:任务规划、记忆与多智能体协作
4.1 任务分解与规划策略
简单的任务,智能体可以直线执行。但面对“分析本月销售数据,找出异常点,生成报告并邮件发送给团队”这样的复杂指令,就需要任务规划能力。OpenHands SDK的智能体核心通常内置或可接入规划模块。
规划一般有两种模式:
- LLM自主规划 :这是默认且常见的方式。依靠LLM(如GPT-4)强大的推理能力,将用户目标分解成一个任务列表(Task List)。例如:
[“从数据库读取销售数据”, “计算同比环比”, “识别销售额骤降的日期”, “用图表可视化异常点”, “将图表和摘要写入Word模板”, “获取团队邮箱列表”, “发送邮件”]。然后智能体再递归地处理每个子任务。 - 预定义工作流 :对于流程固定、容错率低的业务,可以采用预定义的工作流(如用YAML或DSL定义)。智能体更像一个严格的工作流执行引擎,每一步做什么、用什么工具都是预先定义好的,LLM只负责处理其中的自然语言部分(如生成报告内容)。
在OpenHands SDK中,你可能需要通过配置或扩展来强化规划能力。例如,可以设置 agent.run(goal, plan=True) 来让智能体先输出规划步骤,经用户确认后再执行,这在执行高风险操作前非常有用。
4.2 记忆系统的实现与选择
没有记忆,智能体就是“一回合制”的。记忆让智能体能在长对话中保持上下文,学习用户偏好,记住之前的操作结果。SDK通常会提供几种记忆后端:
- 对话缓冲记忆 :最简单的形式,只保留最近N轮对话。适用于短会话。
- 摘要记忆 :随着对话进行,LLM会自动将历史对话总结成一段摘要,后续基于摘要和最近对话进行。这能突破上下文长度限制,但可能丢失细节。
- 向量数据库记忆 :将对话历史中的关键信息(如实体、事实)转换成向量,存入像Chroma、Weaviate这样的向量数据库。当需要回忆时,通过语义搜索查找相关记忆。这是实现长期、精准记忆的先进方式。
- 知识图谱记忆 :更结构化的方式,将记忆中的实体和关系构建成图,适合推理复杂的关联信息。
在文件整理智能体的例子中,如果我们希望它记住“用户不喜欢把.log文件放到任何文件夹,就留在原处”,这个偏好就应该被存入长期记忆。下次整理时,智能体就会自动应用这个规则。
# 示例:配置一个带向量记忆的智能体(伪代码,具体API需查文档)
from openhands.memory import VectorMemory
from openhands.retrievers import VectorRetriever
vector_memory = VectorMemory(
retriever=VectorRetriever(embedding_model=“text-embedding-3-small”),
storage_path=“./agent_memory”
)
agent_with_memory = Agent(
name=“OrganizerPro”,
model=“gpt-4”,
tools=[…],
memory=vector_memory,
system_prompt=“…”
)
# 此后,agent与用户的每次交互都会被有选择地存入记忆,并在后续任务中被检索参考。
4.3 多智能体协作模式初探
当任务复杂到涉及多个专业领域时,就需要“术业有专攻”的智能体团队。OpenHands SDK的架构通常支持多智能体模式。
设想一个数字营销场景:
- 分析智能体 :擅长数据查询和洞察,工具包括数据库连接、数据分析库。
- 文案智能体 :擅长文本创作,工具包括SEO关键词检查、语气风格调整。
- 设计智能体 :擅长生成图片或排版,工具包括调用文生图API、Canva模板API。
- 调度智能体(主管) :接收用户指令“为新产品X策划一次社交媒体推广”,然后协调上面三个智能体工作。
实现方式可以是:
- 分层控制 :调度智能体将大任务分解,通过消息队列或直接函数调用,将子任务分配给专业智能体,并收集结果进行整合。
- 共享工作空间 :所有智能体对一个共享的“黑板”或数据库进行读写,从中获取任务更新自己的工作状态。调度智能体监控工作空间,推进流程。
# 简化的多智能体协作示例(概念代码)
class MarketingOrchestrator:
def __init__(self):
self.analyst_agent = Agent(name=“Analyst”, tools=[db_query, chart_generate], …)
self.copywriter_agent = Agent(name=“Copywriter”, tools=[seo_check, tone_adjust], …)
self.designer_agent = Agent(name=“Designer”, tools=[generate_image, apply_template], …)
def run_campaign(self, product_brief):
# 1. 分析数据
data_insight = self.analyst_agent.run(f”分析产品 {product_brief} 的历史市场数据和竞品”)
# 2. 基于数据撰写文案
copy = self.copywriter_agent.run(f”根据以下洞察撰写吸引人的社交媒体文案:{data_insight}”)
# 3. 基于文案设计海报
design_brief = f”为以下文案设计海报:{copy}”
poster = self.designer_agent.run(design_brief)
return {“insight”: data_insight, “copy”: copy, “poster”: poster}
这种模式威力巨大,但也带来了复杂性:智能体间通信成本、冲突解决、一致性问题等。OpenHands SDK如果能在这一层提供标准化的通信协议和协调原语,将大大简化开发。
5. 工程化实践:调试、监控与部署
5.1 调试智能体:日志、追踪与“思维过程”
调试一个不按预期执行的智能体比调试普通代码更棘手,因为它的决策过程在黑盒(LLM)里。OpenHands SDK应当提供良好的可观测性工具。
- 详细日志 :确保SDK能打印出智能体的每一步:接收的提示词、调用的工具、工具返回的结果、LLM的完整响应(包括其内部的“思考”过程,如果模型支持的话如GPT-4的
reasoning)。在初始化Agent时,通常可以设置verbose=True或debug=True。 - 思维链追溯 :对于支持思维链(Chain-of-Thought)的模型,一定要把CoT输出记录下来。这是理解智能体“为什么这么做”的金钥匙。
- 交互式调试 :有些高级框架提供“人工介入”模式,在智能体做出关键决策(如调用有副作用的工具)前暂停,等待用户确认。
在开发时,我习惯将每轮交互的完整上下文(包括系统提示、用户消息、工具调用序列、LLM响应)保存为JSON文件,便于事后分析和复现问题。
5.2 性能优化与成本控制
智能体应用可能产生高昂的LLM API调用成本,尤其是涉及复杂规划和多次工具调用时。
- 工具描述的优化 :冗长的工具描述会消耗大量Token。在保证清晰的前提下,尽量精简描述。可以考虑为工具起简短易懂的名字,LLM有时能根据名字猜出大致功能。
- 缓存策略 :对于纯查询类、结果不变的工具(如“获取今天日期”),可以在SDK层面或工具内部实现缓存,避免重复调用LLM和工具。
- 模型分级使用 :规划任务用能力强但贵的模型(如GPT-4),简单的文本补全或分类用便宜快速的模型(如GPT-3.5-Turbo)。SDK如果支持智能地路由不同任务到不同模型,会很有帮助。
- 限制递归深度 :防止智能体陷入无限的任务分解循环。设置最大递归深度或最大工具调用次数。
5.3 部署模式与安全考量
将智能体投入生产环境,需要考虑部署模式和安全。
部署模式 :
- 微服务 :将智能体封装成REST API或gRPC服务。这是最通用的方式,便于集成。
- 常驻进程 :作为后台守护进程运行,通过消息队列(如RabbitMQ、Kafka)接收任务。
- Serverless函数 :对于突发性、短任务场景,部署在云函数(AWS Lambda, Google Cloud Functions)上,按需运行,成本低。
- 边缘集成 :直接打包到桌面或移动应用中。
安全沙箱 :这是重中之重!如果你的智能体拥有“执行系统命令”、“读写文件”、“发送网络请求”的工具,就必须将其放在沙箱中运行。
- 权限最小化 :每个工具只授予完成其功能所需的最小权限。文件操作工具限制其可访问的目录。
- 操作确认 :对于高风险操作(删除文件、发送邮件、调用付费API),实现“二次确认”机制,可以要求用户交互确认,或在开发阶段由日志告警。
- 输入过滤与校验 :对所有从LLM传递给工具的参数进行严格的类型和范围校验,防止注入攻击。例如,在
move_file工具中,要检查source_file参数是否包含路径遍历符号(如..)。
OpenHands SDK如果能在工具定义层面就集成权限声明和沙箱机制,会大大提升生产安全性。
6. 常见问题与排查实录
在实际开发和测试中,我遇到了不少典型问题。这里列出一个速查表,希望能帮你节省时间。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 智能体不调用工具,一直用文字回答。 | 1. 工具描述不清晰,LLM不理解何时调用。 2. 系统提示未鼓励或要求使用工具。 3. LLM温度(temperature)设置过高,导致输出随机性大。 |
1. 检查工具函数的docstring,确保清晰描述了功能、输入和输出。 2. 在系统提示中加入明确指令,如“你必须使用提供的工具来完成任务,不要仅用文字描述。” 3. 尝试降低温度参数(如从0.7降到0.2),使输出更确定性。 |
| 智能体调用了错误工具,或参数传错。 | 1. 工具功能描述有歧义。 2. 多个工具功能相似,LLM混淆。 3. 参数名不直观。 |
1. 重写工具描述,突出其独特性和使用场景。给工具起区别度高的名字。 2. 在系统提示中明确不同工具的分工。 3. 使用更直观的参数名,如 target_filename 而非 dest 。 |
| 处理长任务时,智能体“忘记”了最初目标或中途结果。 | 1. 上下文长度超出模型限制,早期信息被丢弃。 2. 记忆模块未启用或配置不当。 |
1. 启用摘要记忆或向量记忆,将关键信息压缩或存储。 2. 在规划阶段,让智能体将中间结果用自然语言明确总结出来,这些总结会被保留在上下文中。 3. 考虑将复杂任务拆分成多个独立的Agent运行会话。 |
| 工具执行成功,但智能体在回复中误报失败(或相反)。 | LLM错误解析了工具返回的结构化数据。 | 1. 确保工具返回的数据结构尽量简单、稳定。优先返回JSON对象,避免复杂嵌套。 2. 在系统提示中教导LLM如何解读返回码,例如:“工具返回 {‘status’: ‘success’} 表示操作成功。” 3. 在工具函数内部做好异常捕获,返回统一的错误格式。 |
| 多智能体协作时,任务卡住或循环。 | 1. 智能体间通信协议不清晰,消息丢失或误解。 2. 缺乏全局状态管理或死锁。 |
1. 实现一个简单的共享状态机或任务队列,明确每个智能体的输入输出。 2. 为协作流程设置超时和重试机制。 3. 引入一个“监督员”智能体,监控整体进度,在僵局时介入协调。 |
| API调用成本飙升。 | 1. 任务规划过于细化,导致调用次数过多。 2. 工具描述或提示词过于冗长。 3. 未使用缓存。 |
1. 优化任务规划,合并可以批量处理的操作。 2. 精简所有提示词和描述。 3. 为查询类工具实现缓存层。 4. 考虑使用更经济的模型处理简单步骤。 |
7. 超越基础:扩展思路与高级应用场景
掌握了OpenHands SDK的基础用法后,你可以尝试将其应用到更激动人心的场景。
场景一:个性化AI助手 将智能体与你的个人数据源(Notion、云盘、邮件、日历)连接。打造一个真正懂你的助手:“帮我找出上个月所有关于项目A的会议纪要,并总结出待办事项。”“根据我最近的阅读历史,推荐周末可以看的3部电影。”
场景二:自动化软件测试 智能体可以学习软件的UI结构(通过DOM或可访问性树),然后根据测试用例自动执行点击、输入、验证操作。它比传统脚本更灵活,能处理一些UI变化,甚至能基于错误信息自主探索解决方案。
场景三:智能数据分析与报告 赋予智能体连接数据库(如Snowflake、BigQuery)、数据可视化库(如Plotly)和报告工具(如Jupyter、Power BI API)的能力。你只需说:“分析Q2销售数据,找出增长最快的三个区域,并生成一份包含趋势图的简报。”剩下的交给智能体。
场景四:游戏与模拟环境中的NPC 在游戏开发中,为NPC注入OpenHands智能体作为“大脑”,使其能理解玩家自然语言指令、动态规划任务(如“去铁匠铺买把剑,然后到城北森林猎杀野猪”),并与游戏世界中的其他实体(也是智能体)进行丰富互动,创造前所未有的沉浸感。
实现这些高级场景,关键在于 工具生态的丰富度 和 智能体规划的可靠性 。OpenHands SDK作为一个基础框架,其价值在于提供了标准化的接入方式。社区能否围绕它构建起一个强大的工具市场(如各种SaaS的API连接器、专业软件的操作插件),将决定其最终能走多远。
从我目前的实践来看,OpenHands/software-agent-sdk代表了一种务实的方向:不追求通用人工智能的空中楼阁,而是聚焦于如何将现有的大模型能力,通过工程化的手段,安全、可靠、可控地转化为能实际处理工作的软件实体。它还有很多路要走,特别是在稳定性、安全性和复杂协作方面,但无疑为开发者打开了一扇通往下一代人机交互和自动化的大门。如果你对AI应用开发感兴趣,现在正是深入探索这类框架的好时机,从解决身边的一个具体小问题开始,亲手组装你的第一个“软件之手”。
更多推荐




所有评论(0)