1. 从写代码到管事情:AI 角色的根本性转变
1.1 为什么“编程”这个词已经装不下现在的 AI 了
过去两年,我身边做开发的朋友聊起 AI,话题基本绕不开“帮我补全这段代码”“解释一下这个报错”。那时候 AI 的定位很清晰——一个坐在你旁边、随时待命的编程助手。你给它一个函数签名,它给你补全实现;你贴一段堆栈,它帮你定位问题。这个阶段的核心交互模式是“你问我答”,AI 是被动的、工具化的。
但从去年下半年开始,我明显感觉到风向变了。越来越多的团队不再满足于让 AI 只写代码,而是让它去调度任务、协调资源、甚至代表你跟外部系统打交道。这就是 Agent 这个概念真正落地的信号。Agent 和传统的编程助手最大的区别在于:编程助手等你下指令,Agent 自己会拆解目标、规划步骤、调用工具、检查结果,遇到问题还会自己调整策略。
举个我自己的例子。以前我要做一个数据报表,流程是:写 SQL 查数据、用 Python 做清洗、生成图表、写邮件发出去。每一步都是我手动串联。现在我用一个 Agent 框架把这些步骤定义成工具,然后只告诉它“帮我生成上周的销售周报并发给团队”,它就能自己跑完整个链路。我做的事情从“写代码”变成了“定义能力和边界”。这个转变,才是标题里“从编程到个人助理”的真正含义。
1.2 个人助理型 AI 到底能帮你做什么
很多人对“个人助理”的理解还停留在“帮我设个闹钟”“查个天气”这种层面。但结合大模型和 Agent 架构之后,个人助理型 AI 的能力边界被极大地拓宽了。我把它归纳为四类核心能力:
- 信息聚合与摘要:从多个来源(邮件、文档、聊天记录、数据库)拉取信息,去重、归纳、生成结构化摘要。比如每天早上帮你汇总昨天所有项目群里的关键决策和待办事项。
- 任务规划与执行:把一个模糊的目标拆解成可执行的步骤,逐步调用工具完成。比如“帮我准备下周的客户演示”,它会自动查日程、整理产品资料、生成演示大纲、甚至预约会议室。
- 跨系统操作:通过 API 或 RPA 跟各种 SaaS 工具交互,在 CRM 里更新客户状态、在项目管理工具里创建任务、在日历里安排时间。
- 主动提醒与建议:基于对你的工作习惯和历史数据的理解,主动提示风险或建议下一步动作。比如“这个客户的合同还有三天到期,上次沟通记录显示他们对价格有异议,建议提前跟进”。
这四类能力叠加起来,AI 就不再是一个“你问它才答”的工具,而是一个真正能帮你分担认知负荷的助理。而支撑这一切的底层技术,就是我们接下来要拆解的大模型、Agent 架构和工具调用机制。
1.3 谁适合读这篇,以及你需要什么基础
这篇内容面向的是有一定技术基础、想把 AI 从“编程助手”升级成“个人助理”的开发者和技术管理者。你不需要是算法专家,但至少要能看懂 Python 代码、理解 API 调用的基本逻辑、知道什么是 JSON。如果你已经在用大模型的 API 做一些小工具,那读起来会更顺畅。
我会尽量避开纯学术的推导,重点讲清楚三件事:架构怎么设计、工具怎么接、坑怎么避。每一部分都会配上我实际项目中的代码片段和配置示例,你可以直接拿去改。对于完全没有编程经验的朋友,前三节的概念部分也能帮你理解这个领域在发生什么,但后面的实操部分可能需要你找一位开发同学配合。
2. 拆解个人助理型 AI 的核心架构
2.1 大模型是大脑,但不是全部
很多人一提到做 AI 助理,第一反应就是“选哪个大模型”。这个问题当然重要,但我想先泼一盆冷水:大模型只是整个系统的大脑,光有大脑没有手脚,什么都干不了。我见过不少团队花大量时间对比模型效果,结果发现真正卡住项目进度的是工具调用的稳定性和上下文管理。
大模型在个人助理系统里承担的核心职责是:理解用户意图、拆解任务步骤、决定调用哪个工具、根据工具返回结果决定下一步。它不负责实际执行,也不负责存储状态。你可以把它想象成一个非常聪明的调度员,它知道该找谁办事,但具体办事的是各个专业岗位。
选模型的时候,我一般从三个维度评估:
| 维度 | 说明 | 我的经验值 |
|---|---|---|
| 函数调用能力 | 能否稳定输出结构化的工具调用请求 | 这是硬门槛,不达标直接淘汰 |
| 上下文窗口 | 能同时容纳多少对话历史和工具返回结果 | 至少 32K,推荐 128K 以上 |
| 推理成本 | 每次调用的 token 费用和延迟 | 按日均调用量算,别只看单价 |
函数调用能力是我最看重的。一个模型如果经常输出格式错误的工具调用请求,后面所有的工程优化都是白搭。我实测下来,目前主流的大模型在这个能力上差距不小,选型阶段一定要用你自己的真实场景做压测,别只看跑分。
2.2 Agent 架构:ReAct、Plan-and-Execute 还是混合模式
Agent 架构决定了 AI 怎么“思考”和“行动”。目前主流的有两种范式:
ReAct 模式是“想一步做一步”。模型先输出一个思考(Thought),然后决定一个动作(Action),执行后拿到观察结果(Observation),再进入下一轮思考。这种模式灵活,适合步骤不确定、需要根据中间结果调整策略的场景。缺点是如果任务步骤多,容易“跑偏”,而且每一轮都要调用一次模型,成本和延迟都高。
Plan-and-Execute 模式是“先想清楚再动手”。模型先制定一个完整的执行计划,然后按计划逐步执行,执行过程中只在必要时才重新规划。这种模式适合步骤明确、可预先拆解的任务,比如“生成周报”这种流程固定的场景。优点是效率高、成本低,缺点是不够灵活,遇到计划外的情况可能卡住。
我在实际项目中用的是混合模式:先用 Plan-and-Execute 生成一个粗粒度的计划,然后在每个步骤内部用 ReAct 模式处理细节。这样既有全局规划的效率,又有局部调整的灵活性。具体实现上,我会在系统提示词里明确告诉模型:“先输出一个不超过 5 步的计划,然后逐步执行,每步执行时如果遇到需要额外信息的情况,可以调用工具获取。”
2.3 工具层设计:让 AI 真正“有手有脚”
工具层是个人助理型 AI 和普通聊天机器人的分水岭。没有工具,AI 只能动嘴;有了工具,AI 才能动手。工具的设计质量直接决定了整个系统的可用性。
我设计工具时遵循三个原则:
第一,一个工具只做一件事。不要设计一个“万能工具”让它根据参数决定行为,这样模型很容易搞混。比如“查询数据库”和“更新数据库”应该是两个独立的工具,而不是一个工具加一个 action 参数。
第二,工具的输入输出必须是严格结构化的。用 JSON Schema 定义每个参数的类型、必填项、取值范围。模型对结构化输入的理解能力远强于自然语言描述。我一般会在工具描述里写清楚每个参数的用途和示例值。
第三,工具要能优雅地失败。任何工具调用都可能出错——网络超时、权限不足、参数错误。工具返回的错误信息要足够清晰,让模型能理解发生了什么并决定是重试、换工具还是放弃。我见过太多系统因为工具报错信息是一堆乱码,导致模型陷入无限重试的死循环。
下面是一个我用过的工具定义示例,用 Python 的装饰器风格:
from agent_framework import tool @tool( name="query_sales_data", description="查询指定时间范围内的销售数据,返回汇总统计", parameters={ "start_date": {"type": "string", "description": "开始日期,格式 YYYY-MM-DD"}, "end_date": {"type": "string", "description": "结束日期,格式 YYYY-MM-DD"}, "region": {"type": "string", "description": "地区筛选,可选值:north/south/east/west,不填则查全国"} } ) def query_sales_data(start_date: str, end_date: str, region: str = None): # 实际查询逻辑 result = db.query(...) return {"total": result.total, "breakdown": result.breakdown}这个工具定义里,description 字段是给模型看的,要写得像给一个新员工交代任务一样清楚。parameters 里的每个字段都要有 type 和 description,description 里最好带上示例值。
2.4 记忆系统:让助理记住你是谁
一个没有记忆的助理,每次对话都像第一次见面,体验会非常割裂。记忆系统要解决三个层次的问题:
短期记忆是当前对话的上下文。这个由大模型的上下文窗口天然支持,但要注意控制长度,太长了会稀释重要信息。我的做法是保留最近 10 轮完整对话,更早的对话做摘要压缩。
长期记忆是跨对话的持久化信息。比如你的偏好、常用联系人、项目背景。这部分我一般用向量数据库存储,每次对话开始时根据当前问题检索相关记忆注入到系统提示词里。
工作记忆是当前任务的中间状态。比如 Agent 执行到第几步、已经获取了哪些数据、还缺什么信息。这部分我用一个结构化的 JSON 对象维护,每次模型调用时作为上下文传入。
记忆系统的设计有个常见误区:什么都想记。结果记忆库越来越大,检索出来的内容越来越不相关。我的经验是,只记那些会影响未来决策的信息。比如“用户偏好用表格展示数据”值得记,“用户今天问了一次天气”不值得记。
3. 实操:从零搭建一个能用的个人助理 Agent
3.1 环境准备与依赖安装
我假设你已经有了 Python 开发环境,版本建议 3.10 以上,因为很多 Agent 框架用到了新的类型注解特性。下面是我常用的依赖清单:
pip install openai>=1.0.0 pip install pydantic>=2.0 pip install chromadb pip install fastapi uvicorn pip install python-dotenv这里解释一下每个依赖的用途。openai是调用大模型 API 的官方库,虽然名字叫 openai,但很多兼容接口的模型也能用。pydantic用来做数据校验和结构化输出,Agent 的工具参数定义全靠它。chromadb是轻量级向量数据库,用来做长期记忆的存储和检索。fastapi和uvicorn用来把 Agent 包装成 HTTP 服务,方便跟其他系统集成。python-dotenv用来管理 API Key 等敏感配置。
环境变量文件.env里至少要有:
LLM_API_KEY=your_key_here LLM_BASE_URL=https://api.your-provider.com/v1 LLM_MODEL_NAME=your_model_name注意:API Key 绝对不要硬编码在代码里,也不要在对话中明文传输。我见过有人把 Key 写在 GitHub 公开仓库里,结果被扫到后一夜之间跑掉几百美元额度。
3.2 定义你的第一个工具:从查询天气开始
工具的定义是整个系统的基础。我先用一个最简单的天气查询工具来演示完整流程。虽然天气查询看起来简单,但它包含了工具设计的全部要素:参数定义、错误处理、返回值格式化。
import requests from pydantic import BaseModel, Field class WeatherInput(BaseModel): city: str = Field(description="城市名称,如'北京'、'上海'") date: str = Field(default="today", description="日期,today/tomorrow 或 YYYY-MM-DD") def get_weather(city: str, date: str = "today") -> dict: try: # 这里替换成你实际使用的天气 API resp = requests.get( "https://api.weather.example.com/v1/current", params={"city": city, "date": date}, timeout=5 ) resp.raise_for_status() data = resp.json() return { "success": True, "city": city, "date": date, "temperature": data["temp"], "condition": data["weather"], "humidity": data["humidity"] } except requests.Timeout: return {"success": False, "error": "天气服务超时,请稍后重试"} except Exception as e: return {"success": False, "error": f"查询失败:{str(e)}"}这个工具的关键点在于:返回值永远是结构化的字典,且包含 success 字段。这样模型能清楚地知道调用是否成功,失败时也能看到具体原因。我见过有人直接返回原始 API 的响应,结果模型面对一堆嵌套字段完全不知道该怎么用。
3.3 组装 Agent 主循环:让模型自己决定下一步
Agent 的主循环是整个系统的心脏。它的逻辑是:把用户输入、系统提示词、可用工具列表、历史对话一起发给模型,模型返回一个响应,如果响应里包含工具调用请求,就执行工具,把结果追加到对话历史,再次调用模型,直到模型返回最终答案。
import json from openai import OpenAI client = OpenAI() def run_agent(user_input: str, tools: list, max_turns: int = 10): messages = [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": user_input} ] for turn in range(max_turns): response = client.chat.completions.create( model=LLM_MODEL_NAME, messages=messages, tools=tools, tool_choice="auto" ) msg = response.choices[0].message messages.append(msg) # 如果没有工具调用,说明模型给出了最终答案 if not msg.tool_calls: return msg.content # 执行所有工具调用 for tool_call in msg.tool_calls: func_name = tool_call.function.name func_args = json.loads(tool_call.function.arguments) # 从注册表中找到对应函数并执行 result = TOOL_REGISTRY[func_name](**func_args) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": json.dumps(result, ensure_ascii=False) }) return "抱歉,任务步骤过多,我暂时无法完成。"这段代码里有几个关键设计。max_turns是防止模型陷入死循环的保险丝,我一般设 10 到 15。每次工具执行的结果都用json.dumps序列化后追加到消息历史,确保模型能解析。tool_choice="auto"让模型自己决定是否调用工具,而不是强制每次都必须调用。
3.4 系统提示词怎么写才不让模型跑偏
系统提示词是 Agent 的“岗位说明书”,写得好不好直接决定 Agent 的表现。我写系统提示词一般包含五个部分:
角色定义:用一句话说清楚这个 Agent 是谁、服务谁。比如“你是一个专业的企业行政助理,服务于一家科技公司的中层管理者。”
能力边界:明确列出它能做什么、不能做什么。比如“你可以查询销售数据、安排日程、发送邮件。你不能修改财务数据、不能代表用户做出承诺。”
工具使用规范:告诉它什么时候该用哪个工具,以及使用时的注意事项。比如“查询数据前先确认时间范围,如果用户没有指定,默认查最近 7 天。”
输出格式要求:规定最终答案的格式。比如“用简洁的中文回答,数据用表格呈现,重要结论加粗。”
异常处理原则:遇到不确定的情况怎么办。比如“如果工具返回错误,先尝试换一种方式,连续失败两次后向用户说明情况并请求指示。”
我实测下来,系统提示词的长度控制在 500 到 1500 字之间效果最好。太短了约束不够,太长了模型会忽略部分内容。而且每次修改提示词后,一定要用一组固定的测试用例回归验证,确保没有引入新的问题。
4. 踩坑实录:那些文档里不会告诉你的问题
4.1 工具调用格式错误:最常见的翻车现场
模型输出格式错误的工具调用请求,是我遇到频率最高的问题。表现包括:参数类型不对(该传字符串传了数字)、必填参数缺失、JSON 格式不合法、调用了不存在的工具名。
排查这类问题的第一步是打开详细日志。我一般会在工具执行前把模型返回的原始 tool_calls 打印出来,看看具体错在哪里。如果发现是参数类型问题,可以在工具定义里用 Pydantic 的严格模式做二次校验,校验失败时返回一个清晰的错误信息给模型,让它重新生成。
from pydantic import ValidationError def safe_execute(func_name, func_args): try: # 用 Pydantic 模型做参数校验 validated = TOOL_SCHEMAS[func_name](**func_args) return TOOL_REGISTRY[func_name](**validated.dict()) except ValidationError as e: return { "success": False, "error": f"参数校验失败:{e.errors()}", "hint": "请检查参数类型和必填项" }这个hint字段很关键。模型看到具体的错误原因和修复提示后,下一次生成正确调用的概率会大幅提升。我统计过,加上这个提示后,格式错误的重复发生率从 30% 降到了 8% 左右。
4.2 上下文爆炸:当对话历史撑爆窗口
Agent 跑多轮任务时,对话历史会迅速膨胀。每一轮的工具调用和返回结果都追加到消息列表里,几轮下来就可能超过模型的上下文窗口。表现是模型开始“失忆”,忘记之前的指令,或者直接报错。
我的解决方案是分层压缩。具体策略是:
- 最近 3 轮对话保留完整内容
- 第 4 到第 10 轮只保留用户输入和最终答案,去掉中间的工具调用细节
- 超过 10 轮的内容做摘要,用模型生成一段 200 字以内的总结
def compress_history(messages, keep_recent=3): if len(messages) <= keep_recent * 2: return messages recent = messages[-(keep_recent * 2):] older = messages[:-(keep_recent * 2)] # 对早期对话做摘要 summary = summarize_with_llm(older) return [ {"role": "system", "content": f"之前的对话摘要:{summary}"} ] + recent这个压缩策略我用了大半年,在保持任务连贯性的同时,把上下文长度控制在了窗口的 60% 以内,留出了足够的余量给工具返回结果。
4.3 工具调用死循环:模型为什么一直重试同一个操作
死循环是另一个高频问题。模型调用一个工具,失败了,它不理解失败原因,又用同样的参数调用一次,又失败,如此反复直到耗尽 max_turns。
根因通常是错误信息不够具体。如果工具返回的是“操作失败”这种模糊信息,模型只能猜,猜不对就重试。解决方法是让错误信息包含三个要素:什么操作失败了、为什么失败、建议怎么改。
比如数据库查询失败,不要返回“查询失败”,而是返回:
{ "success": false, "error": "字段 'sales_amount' 不存在", "available_fields": ["sales_total", "order_count", "avg_price"], "hint": "请使用 available_fields 中的字段名重新查询" }这样模型看到后就知道该换成sales_total重试,而不是盲目重复。我在多个项目里验证过,详细的错误信息能把死循环发生率降低 70% 以上。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 模型不调用工具,直接回答 | 系统提示词没强调工具可用性 | 检查提示词是否列出工具清单 | 在提示词中明确“你可以使用以下工具” |
| 工具调用参数类型错误 | 工具定义描述不清 | 打印原始 tool_calls 查看 | 用 Pydantic 严格校验并返回详细错误 |
| 多轮后模型失忆 | 上下文超限 | 统计 token 数量 | 实施分层压缩策略 |
| 同一工具反复调用失败 | 错误信息模糊 | 查看工具返回内容 | 错误信息包含原因和修复建议 |
| 响应速度慢 | 模型推理慢或工具超时 | 分别计时模型调用和工具执行 | 工具设超时,模型选轻量版 |
| 最终答案格式不对 | 输出格式要求不明确 | 检查系统提示词 | 给出具体的格式示例 |
5. 让助理更“透明”:可观测性与安全边界
5.1 日志与追踪:每一步都要能回放
个人助理型 AI 和普通聊天机器人最大的区别在于,它会产生副作用——发邮件、改数据、创建任务。一旦出错,后果比说错话严重得多。所以可观测性不是可选项,是必选项。
我的做法是给每一次 Agent 运行生成一个唯一的 trace_id,把以下信息结构化记录到日志系统:
- 用户输入原文
- 每一轮模型调用的完整请求和响应
- 每一次工具调用的名称、参数、返回值、耗时
- 最终输出
- 整个链路的 token 消耗和总耗时
这些日志不仅能用于排查问题,还能用于分析用户行为、优化提示词、评估模型效果。我一般用 JSON 格式输出到标准输出,然后由日志收集系统统一处理。
import uuid, time, logging def run_agent_with_trace(user_input, tools): trace_id = str(uuid.uuid4()) start_time = time.time() logger.info(json.dumps({ "trace_id": trace_id, "event": "agent_start", "user_input": user_input })) # ... 执行逻辑 ... logger.info(json.dumps({ "trace_id": trace_id, "event": "agent_end", "duration_ms": (time.time() - start_time) * 1000, "total_tokens": total_tokens }))5.2 权限控制:哪些事助理绝对不能做
给 AI 授权就像给新员工开权限,原则是最小必要。我一般把工具分成三个风险等级:
低风险:只读操作,比如查询数据、搜索文档、读取日历。这类工具可以放开调用,最多加个频率限制。
中风险:写操作但可撤销,比如创建草稿、添加待办、更新状态。这类工具需要记录操作日志,并且要能回滚。
高风险:不可逆操作,比如发送邮件、删除数据、发起支付。这类工具我一般要求人工确认,Agent 生成操作预览,用户确认后才真正执行。
HIGH_RISK_TOOLS = ["send_email", "delete_record", "make_payment"] def execute_tool(tool_name, args, user_confirmed=False): if tool_name in HIGH_RISK_TOOLS and not user_confirmed: return { "success": False, "requires_confirmation": True, "preview": f"即将执行 {tool_name},参数:{args}", "message": "此操作需要用户确认" } # 正常执行 return TOOL_REGISTRY[tool_name](**args)这个确认机制看起来简单,但能避免绝大多数“AI 自作主张”的事故。我自己的助理 Agent 就设了这条规则,发邮件前必须我点确认,至今没出过问题。
5.3 数据隐私:哪些信息不能进模型
个人助理会接触到大量敏感信息——邮件内容、日程安排、客户数据。这些信息在调用大模型 API 时,会离开你的服务器。所以必须明确哪些数据可以发、哪些必须脱敏。
我的原则是:能本地处理的绝不外发,必须外发的先脱敏。具体做法包括:
- 人名、公司名、邮箱地址在发送前替换成占位符,模型返回后再替换回来
- 财务数据只发汇总值,不发明细
- 涉及个人身份的信息(身份证号、手机号)一律不进入模型上下文
- 如果业务对数据出境有要求,优先选择支持私有化部署的模型
脱敏和还原的逻辑我封装成一个中间件,在消息发送前和接收后自动处理,业务代码不用关心。
def desensitize(text): text = re.sub(r'[\w\.-]+@[\w\.-]+', '[EMAIL]', text) text = re.sub(r'1[3-9]\d{9}', '[PHONE]', text) return text def restore(text, mapping): for placeholder, original in mapping.items(): text = text.replace(placeholder, original) return text这套机制我建议在项目第一天就加上,不要等到出事了再补。后期加脱敏逻辑,改造成本会高很多。
5.4 我的实操心得:三个容易被忽视的细节
第一个细节是工具描述里的示例值。很多人写工具定义时只写参数类型,不写示例。但模型对示例的敏感度远高于类型描述。比如date参数,写“格式 YYYY-MM-DD”和写“格式 YYYY-MM-DD,例如 2024-03-15”,后者的调用正确率明显更高。
第二个细节是系统提示词里的否定指令。告诉模型“不要做什么”往往比“要做什么”更有效。比如“不要编造数据,如果工具没有返回结果就如实告知”,这一句能挡掉很多幻觉问题。
第三个细节是定期回归测试。每次改提示词、换模型、加工具,都要跑一遍固定的测试用例集。我维护了一个包含 50 个典型场景的测试集,覆盖查询、操作、异常处理等各类情况。这个习惯帮我挡掉了好几次“改一个坏三个”的回归问题。
6. 从能用 to 好用:下一步可以怎么扩展
6.1 多 Agent 协作:让专业的人做专业的事
单个 Agent 什么都能干,但什么都不精。当任务复杂度上来之后,多 Agent 协作是自然的演进方向。我的做法是设一个“调度 Agent”和若干“专家 Agent”。调度 Agent 负责理解用户意图、拆解任务、分发给专家 Agent;专家 Agent 各自负责一个领域,比如数据分析 Agent、日程管理 Agent、文档处理 Agent。
这种架构的好处是每个专家 Agent 的系统提示词和工具集都可以高度定制,不用在一个提示词里塞所有规则。缺点是通信成本高,调度 Agent 和专家 Agent 之间的消息传递会消耗额外 token。我一般只在任务确实复杂、单 Agent 搞不定的时候才上多 Agent,简单场景单 Agent 足够了。
6.2 主动式助理:从“你问它答”到“它先想到”
现在的助理基本都是被动的,你问它才答。但真正的个人助理应该能主动提醒。实现主动式的关键是事件驱动:监听日历、邮件、任务系统的变化,当检测到需要关注的事件时,主动发起对话。
比如检测到一封客户邮件里提到了“合同到期”,助理可以主动提醒你:“张总的合同还有 5 天到期,需要我帮你准备续约材料吗?”这种主动式交互的体验提升非常明显,但要注意频率控制,太频繁会变成骚扰。我的做法是设置优先级阈值,只有高优先级事件才主动推送,低优先级的攒到每日摘要里一起发。
6.3 个性化微调:让助理越来越懂你
通用大模型对所有人都一样,但个人助理应该越来越懂你。实现个性化的路径有两条:一是记忆积累,把用户的偏好、习惯、历史决策都存下来,每次对话时检索注入;二是微调,用用户的历史对话数据对模型做轻量微调。
记忆积累的成本低、见效快,我建议先从这条路开始。微调的成本高、周期长,而且需要足够量的高质量数据,一般等产品跑通、积累了几个月数据之后再考虑。微调的时候也要注意,不要用包含敏感信息的原始对话直接训练,要先做脱敏和筛选。
6.4 我个人的体会
做个人助理型 AI 这一年多,我最大的体会是:技术选型不是最难的,边界定义才是。模型选哪个、框架用哪个,这些都有现成的方案可以抄。但“助理能做什么、不能做什么、什么情况下必须问人”这些边界问题,每个团队、每个场景的答案都不一样,只能自己摸索。
我的建议是,先从一个小场景切入,把“查询-规划-执行-确认”这个闭环跑通,然后再逐步扩展工具集和场景。不要一上来就追求大而全,那样大概率会卡在某个细节上出不来。先让它能帮你做一件小事,然后慢慢加,这个过程本身就是最好的学习。