如果你以为 AI 数字员工只是“套了一层大模型外壳的聊天机器人”,那今天这篇文章可能会颠覆你的认知。
过去半年,AI 自动化领域的最大变化不是模型能力又提升了多少,而是“从回答问题到接管流程”的跨越。现在的 Agent 智能体已经可以把一套完整的业务链路——从获取线索、筛选客户、写营销文案、跟进意向,到生成报表——全部串起来执行。市面上把这些系统叫做“AI 超级员工”“AI 数字员工”,名字很热闹,但真正值得开发者关注的是:它背后的源码架构怎么设计,工作流怎么编排,Agent 之间怎么协作,以及部署一套属于自己的系统到底要跨过哪些坎。
这篇文章我不想只复述概念,而是直接进入实战视角:拆解一个 AI 数字员工系统的源码结构,讲清楚从零搭建 Agent 工作流的核心思路,并用实际可运行的代码演示“线索获取 → 智能筛选 → 个性化触达”这条自动化链路。读完你不仅知道 Agent 智能体怎么搭,还能明白为什么市面上的 AI 获客系统价格差异那么大,以及在自己的业务里应该从哪里下手。
1. 定义问题:AI 数字员工到底解决了什么痛点
很多人一听到“数字员工”,第一反应是“是不是做个数字人直播或虚拟客服”。这是目前最大的理解误区。
AI 数字员工(Digital Employee)真正的核心不是“数字形象”,而是“员工化”——它能像一个真实员工那样,根据目标自主完成一系列跨系统操作和决策。它和你之间不是一问一答的关系,而是“你给它目标和权限,它给你可交付的结果”。
举例来说,传统 AI 客服的工作方式是:
- 用户发来问题
- 系统检索知识库
- 返回一个回答
而 AI 数字员工的工作方式是:
- 你告诉它:“帮我筛选出本周高意向客户,并生成个性化的跟进话术”
- 它调用客户数据库读取数据
- 调用大模型逐一评估客户意向
- 根据评估结果生成跟进策略
- 调用消息推送接口把内容发送给对应负责人
- 生成一份 Excel 报表反馈执行情况
对比之下你会发现,AI 数字员工本质上是一条“感知 → 决策 → 行动 → 反馈”的闭环链路,而不是单点功能。它解决的是三个层面的痛点:
- 人力成本:批量筛选线索、批量写文案、批量跟进,人工完成需要一小时,Agent 可能只需几分钟。
- 响应速度:人工处理的瓶颈是注意力和体力,Agent 可以在任何时间持续运行。
- 决策依据:过去靠个人经验判断客户意向,现在可以让模型综合多维特征给出结构化建议。
这也是为什么 Agent 智能体开发工程师成为热门方向的原因——企业需要的不是“会调用 API 的码农”,而是能把这些流程拆解成可自动化任务的系统设计者。
从技术选型上,一个 AI 数字员工系统通常会涉及这些组件:
| 技术环节 | 常用方案 | 解决的问题 |
|---|---|---|
| 大模型底座 | OpenAI 兼容 API、DeepSeek、Qwen | 理解任务并生成内容 |
| Agent 框架 | LangChain、Dify、自研 Pipeline | 管理工具调用和任务流转 |
| 自动化工具 | Playwright、HTTP API、数据库脚本 | 连接前端操作与后端系统 |
| 任务调度 | Celery、APScheduler、定时触发 | 让工作流按计划运行 |
| 人机审核 | FastAPI + 管理后台 | 在自动执行与人工确认之间做缓冲 |
这套组合听起来不复杂,但实际搭建时,任务拆解和行为编排才是真正的难点,后面我们会逐一展开。
2. Agent 智能体、数字员工、自动化工作流:概念边界与关系
进入实操前,先花点时间把几个高频词的关系理清楚,因为我在阅读源码和项目文档时发现,很多资料把这些概念混着用,导致开发者学习时非常困惑。
2.1 Agent 智能体是什么
Agent(智能体)是一个可以自主调用工具、分析结果、做出决策并执行下一步操作的 AI 程序单元。它和普通大模型应用的差异在于:
- 普通应用:用户提问 → 模型回答 → 结束
- Agent:用户给目标 → 模型规划 → 调用工具 → 观察结果 → 调整方案 → 继续执行 → 输出最终结果
Agent 的“智能”并不全来自大模型本身,而是来自“工具 + 记忆 + 规划”的组合。模型负责判断该走哪条路,工具负责实际执行动作。
2.2 AI 数字员工是什么
AI 数字员工是“Agent 的系统化产物”。它不是一个独立 Agent,而是多个 Agent 按照业务规则组合起来,配合数据库、消息渠道、权限体系形成的完整业务角色。
一个完整的 AI 数字员工系统源码里,通常包含多个角色型 Agent:
- 获客 Agent:负责从公域或私域获取线索
- 筛选 Agent:负责评估线索质量,识别意向度
- 内容 Agent:负责生成个性化触达文案
- 外呼 Agent:负责语音触达与意向确认
- 数据分析 Agent:负责汇总执行效果并生成报表
你也可以理解为:Agent 是“单兵”,数字员工系统是“班组”。单兵的能力再强,没有指挥体系和后勤支持,也很难独立完成复杂任务。
2.3 自动化工作流是什么
自动化工作流是让 Agent 按预设路径协作的编排层。它解决了“谁先执行、下一步去哪、失败怎么处理”的问题。
工作流有两种常见设计模式:
| 模式 | 适用场景 | 特点 |
|---|---|---|
| 有向无环图(DAG) | 流程固定,步骤明确 | 稳定、易追踪、便于人工介入 |
| 循环决策图 | 任务路径不固定 | 灵活,但容易失控,需要限制迭代次数 |
从源码设计角度,我强烈建议刚起步的开发者先把 DAG 模式跑通,等熟悉之后再引入更复杂的决策逻辑。一来便于调试,二来容易定位故障,三来能明确边界——这也是国内很多成熟开源 Agent 系统默认采用的方式。
2.4 概念关系总结
用一句话总结四者关系:AI 自动化工作流是骨架,Agent 智能体是节点,工具调用是手脚,AI 数字员工系统则是完整的人形。
由于标题和搜索热词里反复出现“源码”“免费 Python 源码”“Agent 智能体搭建教程”,本文接下来的实践部分会以 Python 为技术栈,用一份可扩展的源码结构演示如何从零搭建数字员工系统的最小闭环。不需要特定框架,直接用 OpenAI 兼容接口做抽象层,这样无论你后续接 DeepSeek、Qwen 还是其他模型,都只需要改动配置。
3. 系统源码的整体架构设计
从源码工程的角度看,一个可维护的 AI 数字员工系统,至少要划分出以下模块。我在阅读多个开源项目和商业源码后,发现优秀项目的共同点是:模块边界清晰,每一层只干一件事。
3.1 完整目录结构
digital_employee/ ├── app/ │ ├── api/ # HTTP 服务入口,FastAPI 路由 │ ├── agents/ # Agent 角色定义 │ │ ├── base.py # Agent 抽象基类 │ │ ├── lead_acquirer.py # 获客 Agent │ │ ├── lead_scorer.py # 线索筛选 Agent │ │ └── content_writer.py # 内容生成 Agent │ ├── workflows/ # 工作流编排 │ │ ├── base.py # 流程基类 │ │ └── lead_pipeline.py # 获客-筛选-触达主流程 │ ├── tools/ # Agent 可调用的工具 │ │ ├── crm_api.py # CRM 系统对接 │ │ ├── message_sender.py # 消息发送 │ │ └── data_reader.py # 数据读取 │ ├── core/ # 配置、模型客户端、日志 │ │ ├── config.py │ │ ├── llm.py │ │ └── logger.py │ └── models/ # 数据模型 ├── data/ # 数据文件 ├── scripts/ # 脚本 ├── tests/ # 测试 ├── requirements.txt └── README.md3.2 各模块职责说明
agents 层是整个系统的“大脑”,每个 Agent 包含三部分核心信息:
- system prompt:定义专业角色和行为边界
- 可用工具列表:Agent 可以调用哪些外部能力
- 执行逻辑:如何根据模型输出决定下一步动作
tools 层是“手脚”,让 Agent 不只是对话,而是能操作真实系统。每个工具必须包含名字、描述、输入参数结构、执行函数。描述写得好不好,直接影响大模型能否准确调用工具。
workflows 层是“剧本”,决定 Agent 的出场顺序和协作方式。工作流应该设计成可暂停、可跳步、可人工介入的状态机,而不是一个从上往下执行的死脚本。
core 层是“基础设施”,统一管理模型客户端、日志、配置。一个容易忽略但非常重要的点是:日志系统必须记录每一次工具调用和模型输出,否则后来排查问题时会非常痛苦。
这套结构的核心价值在于:当你需要增加一个新业务场景时,不需要重写框架,只需要增加一个 Agent、若干工具和一条新工作流即可。这也是“AI 数字员工系统源码”和普通 Python 脚本项目的本质区别。
4. 环境准备与前置条件
开始写代码前,先明确环境要求。由于不同项目的依赖版本可能不同,这里不锁死具体版本号,而是结合材料给出建议范围,实际安装时以项目文档为准。
4.1 基础环境清单
| 依赖 | 版本建议 | 说明 |
|---|---|---|
| Python | 3.10+ | 新版本对类型注解和异步支持更好 |
| OpenAI SDK | 最新稳定版 | 用于调用 OpenAI 兼容接口 |
| DeepSeek SDK | 最新稳定版 | 若使用 DeepSeek 作为底座 |
| FastAPI | 最新稳定版 | 提供对外 API 和管理接口 |
| requests | 最新稳定版 | 调用外部 HTTP 服务 |
| pandas | 最新稳定版 | 处理线索数据表 |
| openpyxl | 最新稳定版 | 生成 Excel 报表 |
| APScheduler | 最新稳定版 | 定时触发工作流 |
4.2 安装命令
# 创建虚拟环境 python -m venv .venv source .venv/bin/activate # Windows 使用 .venv\Scripts\activate # 安装核心依赖 pip install openai fastapi uvicorn requests pandas openpyxl apscheduler # 将依赖写入 requirements.txt pip freeze > requirements.txt4.3 模型配置说明
由于项目标题和搜索材料中多次出现 DeepSeek 相关词条,这里以 DeepSeek 为例说明配置方式。
# app/core/config.py import os from dataclasses import dataclass @dataclass class Settings: # 模型配置,通过环境变量注入,不要硬编码进源码 llm_api_key: str = os.getenv("LLM_API_KEY", "") llm_base_url: str = os.getenv("LLM_BASE_URL", "https://api.deepseek.com/v1") llm_model: str = os.getenv("LLM_MODEL", "deepseek-chat") # 系统关键词 project_name: str = "digital-employee" version: str = "0.1.0" settings = Settings()这里有一个容易被忽略的工程细节:API Key 绝对不能写进源码。无论是商业项目还是开源项目,都应该通过环境变量或密钥管理服务注入。项目源码如果发布到公开平台,一旦密钥泄露,可能造成直接经济损失。
4.4 环境验证
安装完成后,运行一个简单测试,确认模型接口可用:
python -c "from openai import OpenAI; client = OpenAI(); print(client.models.list())"如果这个命令正常返回模型列表,说明 SDK 和认证配置没有问题,可以继续后续开发。
5. 核心代码实现:从 Agent 到工作流
这个章节是全文重点。我会按照“定义工具 → 定义 Agent → 定义工作流”的顺序,逐步实现一个最小可用的 AI 获客自动化系统。
5.1 实现 Agent 抽象基类
首先定义一个通用的 Agent 基类,所有业务 Agent 都继承它。
# app/agents/base.py from abc import ABC, abstractmethod from typing import Any, Dict, List, Optional from app.core.llm import LLMClient class BaseAgent(ABC): """Agent 抽象基类,所有业务 Agent 必须实现 execute 方法""" def __init__(self, llm_client: LLMClient): self.llm = llm_client self.system_prompt = self._build_system_prompt() self.tools: List[Dict[str, Any]] = [] self.tool_map: Dict[str, Any] = {} self._register_tools() @abstractmethod def _build_system_prompt(self) -> str: """构建系统提示词,定义 AI 的角色、目标和边界""" pass def _register_tools(self) -> None: """注册当前 Agent 可以调用的工具""" pass def add_tool(self, name: str, description: str, parameters: Dict[str, Any], func: Any) -> None: tool = { "type": "function", "function": { "name": name, "description": description, "parameters": parameters, }, } self.tools.append(tool) self.tool_map[name] = func def call_llm(self, user_message: str) -> str: """调用大模型,支持 function calling""" response = self.llm.chat( system=self.system_prompt, user=user_message, tools=self.tools, ) # 如果模型决定调用工具,则执行工具并返回结果 if response.get("tool_calls"): results = [] for call in response["tool_calls"]: func_name = call.function.name args = json.loads(call.function.arguments) if func_name in self.tool_map: result = self.tool_map[func_name](**args) results.append({"tool": func_name, "result": result}) # 将工具结果返回给模型,让模型总结 final_response = self.llm.chat( system=self.system_prompt, user=user_message, tool_results=results, ) return final_response["content"] return response.get("content", "") @abstractmethod def execute(self, input_data: Dict[str, Any]) -> Dict[str, Any]: """Agent 的整体执行入口""" pass这段代码的关键设计在于:
system_prompt由每个 Agent 自己构建,确保角色定位清晰tools列表使用 OpenAI function calling 标准结构,这是大模型能理解工具的唯一契约execute是每个 Agent 的独立入口,方便被工作流统一调度
5.2 实现获客 Agent
获客 Agent 的主要职责是读取原始线索数据,筛选出符合条件的目标客户。
# app/agents/lead_acquirer.py from typing import Any, Dict, List from app.agents.base import BaseAgent from app.tools.data_reader import read_csv_leads from app.tools.crm_api import query_company_info class LeadAcquirerAgent(BaseAgent): """获客 Agent:从数据源读取线索并做初步清洗""" def _build_system_prompt(self) -> str: return """ 你是一名专业的销售线索挖掘专家。你的任务是从给定线索列表中识别出符合目标画像的潜在客户。 判断标准: 1. 公司名称完整,不包含明显乱码 2. 所属行业在以下目标行业中:企业服务、互联网、电子商务、人工智能 3. 线索中留有可用的联系方式(手机号、邮箱或公司座机) 4. 公司规模在 20 人以上 只输出 JSON 数组,每个元素包含 company_name、industry、contact、reason 字段。 """ def _register_tools(self) -> None: self.add_tool( name="read_csv_leads", description="读取 CSV 文件中的原始线索数据", parameters={ "type": "object", "properties": { "file_path": {"type": "string", "description": "CSV 文件路径"} }, "required": ["file_path"], }, func=read_csv_leads, ) self.add_tool( name="query_company_info", description="根据公司名称查询工商信息,确认行业和规模", parameters={ "type": "object", "properties": { "company_name": {"type": "string", "description": "公司名称"} }, "required": ["company_name"], }, func=query_company_info, ) def execute(self, input_data: Dict[str, Any]) -> Dict[str, Any]: file_path = input_data.get("file_path", "data/leads.csv") # 读取线索 leads = self.call_llm(f"请读取文件 {file_path} 中的线索数据,并进行初步筛选") # 解析模型返回的 JSON 数组 import json qualified_leads = json.loads(leads) if leads else [] return {"qualified_leads": qualified_leads}5.3 实现线索评分 Agent
评分 Agent 是 AI 获客链路中最有技术含量的环节。它不只是判断“行或不行”,而是给每条线索打一个 0-100 的意向度分数,方便后续排序触达。
# app/agents/lead_scorer.py from typing import Any, Dict import json from app.agents.base import BaseAgent class LeadScorerAgent(BaseAgent): """线索评分 Agent:评估每条线索的成交意向""" def _build_system_prompt(self) -> str: return """ 你是一名资深的 B2B 销售顾问,擅长评估销售线索的质量和成交概率。 请基于以下评分维度对每条线索打分: 1. 行业匹配度(0-30 分):是否属于目标行业,是否近期有采购需求信号 2. 触点深度(0-20 分):联系方式是否完整,是否有决策人信息 3. 需求信号(0-30 分):从公司动态、招聘信息、融资事件中判断是否有扩张迹象 4. 竞争强度(0-10 分):该领域的竞争供应商数量 5. 时间窗口(0-10 分):预计成交周期 只输出 JSON 数组,每个元素包含 company_name、total_score、level(A/B/C/D)、suggestion、reason。 """ def _register_tools(self) -> None: self.add_tool( name="query_company_info", description="查询公司最新动态、招聘、融资等业务信号", parameters={ "type": "object", "properties": { "company_name": {"type": "string", "description": "公司名称"} }, "required": ["company_name"], }, func=lambda company_name: {"signal": "该公司发布多个技术岗位,有软件采购需求迹象"}, ) def execute(self, input_data: Dict[str, Any]) -> Dict[str, Any]: qualified_leads = input_data.get("qualified_leads", []) user_msg = f"请对以下线索进行评分:{json.dumps(qualified_leads, ensure_ascii=False)}" scored_result = self.call_llm(user_msg) try: scored_leads = json.loads(scored_result) except json.JSONDecodeError: scored_leads = [] return {"scored_leads": scored_leads}评分 Agent 的表现在很大程度上决定了整个系统的获客质量。从实践来看,最影响评分准确性的不是模型参数,而是评分维度的设计。维度定义得越具体、商业逻辑越清晰,模型给出的分数就越有参考价值。
5.4 实现内容生成 Agent
内容生成 Agent 根据评分结果,为 A、B 级线索生成个性化触达文案。这里的关键是“个性化”三个字,而不是模板化群发。
# app/agents/content_writer.py from typing import Any, Dict import json from app.agents.base import BaseAgent class ContentWriterAgent(BaseAgent): """内容生成 Agent:为高意向线索生成个性化触达文案""" def _build_system_prompt(self) -> str: return """ 你是一名出色的 B2B 内容营销专家。请根据每条线索的行业特点、公司规模和意向分数, 生成一封不超过 150 字的微信/邮件触达文案。 要求: 1. 前 20 个字必须能引起对方继续阅读的兴趣 2. 必须提及对方公司或行业的 1 个具体特征,体现做了功课 3. 明确说明产品能解决的一个核心痛点 4. 结尾留下一个低成本的动作选项,例如回复了解详情、约 15 分钟电话 5. 语气自然,不要使用“尊敬的客户”“您好打扰了”等模板化开头 6. 如果意向分数低于 C,不生成文案,返回 null 只输出 JSON 数组,每个元素包含 company_name、content、channel(wechat/email/phone)。 """ def execute(self, input_data: Dict[str, Any]) -> Dict[str, Any]: scored_leads = input_data.get("scored_leads", []) user_msg = f"请为以下高意向线索生成触达文案:{json.dumps(scored_leads, ensure_ascii=False)}" content_result = self.call_llm(user_msg) try: contents = json.loads(content_result) except json.JSONDecodeError: contents = [] return {"contents": contents}这里特别提醒一个合规问题:AI 获客的内容生成再高效,也不能触碰“垃圾营销”的红线。生成内容时应该加入明确的范围限制,只对 B 级以上线索触达,且必须在人类审核后发送。合规不仅是法律要求,也决定了你后续的业务能否做得长久。
5.5 实现 Lead Pipeline 工作流
工作流是连接所有 Agent 的“指挥中心”。我用一个顺序执行的 DAG 模式来实现主流程,并留出人工审核节点。
# app/workflows/lead_pipeline.py import json import traceback from typing import Any, Dict from app.agents.lead_acquirer import LeadAcquirerAgent from app.agents.lead_scorer import LeadScorerAgent from app.agents.content_writer import ContentWriterAgent from app.core.logger import logger from app.tools.message_sender import send_message from app.tools.data_reader import save_to_excel class LeadPipeline: """获客-评分-触达主流程""" def __init__(self, acquirer: LeadAcquirerAgent, scorer: LeadScorerAgent, writer: ContentWriterAgent): self.acquirer = acquirer self.scorer = scorer self.writer = writer def run(self, input_data: Dict[str, Any]) -> Dict[str, Any]: """执行完整工作流,返回执行结果""" result = {"status": "success", "steps": {}, "error": ""} try: # Step 1: 获取线索 logger.info("开始执行获客 Agent") acquire_result = self.acquirer.execute(input_data) result["steps"]["acquire"] = { "status": "success", "qualified_count": len(acquire_result.get("qualified_leads", [])), } logger.info(f"获客完成,筛出 {result['steps']['acquire']['qualified_count']} 条合格线索") # Step 2: 线索评分 logger.info("开始执行线索评分 Agent") score_result = self.scorer.execute(acquire_result) result["steps"]["score"] = { "status": "success", "scored_count": len(score_result.get("scored_leads", [])), } logger.info(f"评分完成,共处理 {result['steps']['score']['scored_count']} 条线索") # Step 3: 人工审核节点 # 在实际业务中,这里可以通过管理后台由人工确认后继续执行 # 为了演示自动化,这里默认 A/B 级线索继续 ab_leads = [lead for lead in score_result.get("scored_leads", []) if lead.get("level") in ("A", "B")] # Step 4: 内容生成 logger.info("开始执行内容生成 Agent") content_result = self.writer.execute({"scored_leads": ab_leads}) result["steps"]["content"] = { "status": "success", "generated_count": len(content_result.get("contents", [])), } logger.info(f"内容生成完成,共生成 {result['steps']['content']['generated_count']} 条文案") # Step 5: 人工审核与发送 # 强烈建议:正式发送前由人工在管理后台勾选确认,不要自动发送 contents = content_result.get("contents", []) for item in contents: send_message( channel=item.get("channel", "wechat"), target=item.get("contact", ""), content=item.get("content", ""), ) # Step 6: 保存报表 report_path = save_to_excel(contents, "data/output/report.xlsx") result["steps"]["report"] = {"status": "success", "path": report_path} logger.info(f"报表已保存至 {report_path}") except Exception as e: result["status"] = "error" result["error"] = str(e) logger.error(f"工作流执行失败: {traceback.format_exc()}") return result这段代码完整展示了一个可运行的 AI 自动化工作流。注意两个设计细节:
- 人工审核节点:在 Step 3 和 Step 5 之间存在人工审核缓冲带,这是生产环境必须保留的。完全无人值守的自动触达系统,从合规和体验两个角度看都有巨大风险。
- 日志记录:每一步都记录状态和数量,方便事后排查。真实项目中日志还要记录每次 LLM 调用的 prompt 和 response,方便做效果分析和成本核算。
5.6 模型客户端封装
最后,封装一个统一的模型客户端。为什么不能直接在 Agent 里调用 OpenAI SDK?因为直接调用会让每个 Agent 依赖具体的模型实现,后续如果想换模型或者加限流、加缓存,会非常痛苦。
# app/core/llm.py import json from typing import Any, Dict, List, Optional from openai import OpenAI from app.core.config import settings class LLMClient: """统一的模型客户端,支持 OpenAI 兼容接口""" def __init__(self): self.client = OpenAI( api_key=settings.llm_api_key, base_url=settings.llm_base_url, ) self.model = settings.llm_model def chat( self, system: str, user: str, tools: Optional[List[Dict[str, Any]]] = None, tool_results: Optional[List[Dict[str, Any]]] = None, ) -> Dict[str, Any]: messages = [{"role": "system", "content": system}] # 如果存在工具调用结果,先追加工具消息 if tool_results: messages.append( {"role": "system", "content": f"工具执行结果:{json.dumps(tool_results, ensure_ascii=False)}"} ) messages.append({"role": "user", "content": user}) kwargs = {"model": self.model, "messages": messages} if tools: kwargs["tools"] = tools if tools: kwargs["tool_choice"] = "auto" response = self.client.chat.completions.create(**kwargs) message = response.choices[0].message result: Dict[str, Any] = {} if message.content: result["content"] = message.content if getattr(message, "tool_calls", None): result["tool_calls"] = message.tool_calls return result注意,上面的 tool_results 处理方式是一种简化写法,实际项目中应优先使用 OpenAI 标准的多轮 tool message 机制,让模型看到完整的 function calling 上下文。这里为了演示可读性做了一点折中,生产环境需要进一步补齐。
6. 运行与效果验证
代码写完之后,不能只是“看一眼没报错”就算完成,必须设计可验证的验收路径。
6.1 准备测试数据
在data/leads.csv中放入测试线索:
company_name,industry,contact,source 星河科技有限公司,企业服务,hr@xinghe.com,行业展会 蓝海网络科技有限公司,互联网,sales@lanhai.com,官网表单 某餐饮管理公司,餐饮,contact@restaurant.com,广告投放 峰云数据服务有限公司,人工智能,li@fengyun.ai,老客户转介绍 快乐电商有限公司,电子商务,ops@happy-ec.com,线上活动6.2 执行工作流
在项目根目录创建入口脚本:
python run_pipeline.py# run_pipeline.py from app.workflows.lead_pipeline import LeadPipeline from app.agents.lead_acquirer import LeadAcquirerAgent from app.agents.lead_scorer import LeadScorerAgent from app.agents.content_writer import ContentWriterAgent from app.core.llm import LLMClient llm = LLMClient() pipeline = LeadPipeline( acquirer=LeadAcquirerAgent(llm), scorer=LeadScorerAgent(llm), writer=ContentWriterAgent(llm), ) result = pipeline.run({"file_path": "data/leads.csv"}) print(f"工作流状态: {result['status']}") for step_name, step_info in result.get("steps", {}).items(): print(f" {step_name}: {step_info}")6.3 预期输出
正常运行时会看到类似下面的输出:
工作流状态: success acquire: {'status': 'success', 'qualified_count': 4} score: {'status': 'success', 'scored_count': 4} content: {'status': 'success', 'generated_count': 3} report: {'status': 'success', 'path': 'data/output/report.xlsx'}判断条件:
- 四条线索中餐饮公司因行业不匹配,预期被剔除
- 至少 2 条线索被评定为 A 或 B 级
- 最终生成的 Excel 报表包含可读的触达文案和评分摘要
6.4 失败排查
如果运行报错,按照以下顺序检查:
- 检查 LLM_API_KEY 和 LLM_BASE_URL 是否正确
- 查看日志文件
logs/app.log中最后一次 LLM 调用记录 - 确认 CSV 文件路径是否正确,列名是否匹配
- 如果提示
json.JSONDecodeError,大概率是模型输出的 JSON 格式有误,需要在system_prompt中加强格式约束,或增加输出修正逻辑
7. 常见问题与排查思路
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 模型不调用工具,只返回文本 | Tool schema 格式不正确,或 system prompt 未强调必须调用工具 | 检查 tools 参数是否符合 function calling 结构;查看模型完整响应 | 在 system_prompt 中加入“如果需要查询数据,请调用工具”的指令;使用 tool_choice=required 强制调用 |
| 获取线索时返回非法 JSON | 模型生成的 JSON 包含注释或尾逗号,或内容被截断 | 打印模型的原始输出;记录完整 token 用量 | 增加输出长度限制;使用 JSON Schema 约束;增加 json.loads 的容错函数,如去掉代码块标记 |
| 工作流中途失败,前序步骤白跑 | 没有状态持久化机制 | 检查每一步日志,确认失败节点 | 引入状态存储,将每步结果写入数据库或文件;失败后支持断点续跑 |
| 触达内容过于模板化 | system_prompt 没有提供足够的行业上下文 | 检查 prompt 中是否传入线索的行业和规模 | 在 prompt 中明确要求引用具体信息;在评分阶段把公司动态作为上下文传给内容 Agent |
| 系统运行时间太长,响应慢 | 串行调用多个 Agent,每个 Agent 都需要一次或多次模型调用 | 观察每一步耗时 | 将独立任务并行执行;对非关键 Agent 使用更小的模型;增加缓存机制 |
| 成本超出预算 | 每次工具调用都重新发送完整上下文,token 消耗高 | 查看模型调用的 token 统计 | 精简 system prompt;对历史对话做摘要;按日设置调用上限 |
这六类问题中,前两类是初学者高频踩坑点,后四类是系统上线后才会暴露的问题。我的建议是,在开发阶段就把日志和状态持久化做进去,越早越好,不要等功能上线再补。
8. 最佳实践与工程建议
8.1 从“最小闭环”开始,不要一上来就设计大而全的系统
AI 数字员工系统的架构复杂度是指数级上升的。建议第一版只实现单条业务路径,比如只做“获客 → 筛选 → 生成文案 → 人工发送”,不要一开始就接外呼、接 CRM、接多模态。最小闭环跑通的作用是验证模型效果和业务流程的正确性,而不是验证你写了多少代码。
8.2 Prompt 工程是 Agent 效果的核心杠杆
源码层面大家写的代码都差不多,真正拉开差距的是 Prompt。好的 Prompt 有几个特征:
- 角色明确:告诉模型你是什么角色,为谁服务
- 目标清晰:告诉模型输入是什么,输出是什么格式
- 有否定边界:告诉模型“不做什么”往往比“做什么”更重要
- 提供示例:在 prompt 中给出 1-2 个输入输出示例,格式准确率会大幅提升
8.3 始终保留人工审核节点
不管技术多成熟,自动化触达这条链路必须保留人工审核。尤其在前三个月冷启动阶段,模型输出的质量需要持续校准。人工审核还有一个好处:被否决的样本可以沉淀成标注数据,用来优化后续 Prompt。
8.4 权限与合规边界
AI 获客系统的高效,本质上来源于把原本需要多个系统手工操作的动作变成了自动化执行。这意味着系统能触达的数据范围更大、影响面更广。因此:
- 严格限制 Agent 的工具权限,只用最小权限集
- 所有发送动作必须走统一的发送服务,不能绕过接口直连渠道
- 涉及用户个人信息处理时,遵循最小必要原则
- 私域触达和公域外呼的合规要求不同,生产环境务必咨询法律意见
8.5 成本控制
模型调用成本是 AI 数字员工系统最大的可变成本。建议采用分级模型策略:简单任务(线索清洗)用便宜的小模型,复杂任务(内容生成、客户评分)用大模型。同时,为每类任务设置单次调用 token 上限,超限自动截断。
8.6 日志与链路追踪
推荐每个 Agent 执行时记录如下信息:
- 输入数据的摘要(不要记录完整敏感信息)
- 调用了哪些工具,参数是什么
- 模型输出结果
- 耗时和 token 消耗
- 下一步操作依据
一份结构化的日志不仅帮助排查问题,也是以后做效果归因分析的原始依据。
9. 总结与进阶方向
回到文章开头的问题:AI 数字员工系统到底改变了什么?
它真正降低的是“从线索到结果”的执行成本。过去跑通一条获客链路需要销售、运营、文案、数据四个人协作,现在可以沉淀成一套由 Agent 智能体组成的自动化工作流,源码结构上只需要维护好 Agent 定义、工具注册和流程编排三个核心层次。
这篇文章从概念辨析讲到源码拆解,再到可运行的 Python 实现,希望帮你建立了一个完整的认知框架:Agent 是单个能力单元,工具是系统的手脚,工作流是协作剧本,AI 数字员工是业务场景中的完整角色。
如果下一步想继续进阶,建议按这个顺序深入:
- 把示例中的工作流改造成带有数据库持久化的状态机,学习如何支持断点续跑
- 尝试引入异步并发,让多个 Agent 并行处理独立任务,提升吞吐
- 研究 Function Calling 的高级用法,比如嵌套工具调用、多轮工具协同
- 接一个真实业务系统(例如企业微信机器人、CRM API),让 Agent 操作真实环境
- 深入学习 Agent 评测:搭建一套包含准确率、耗时、成本、人工通过率的评测体系,用数据驱动 Prompt 迭代
需要说明的是,由于无法访问你本地的真实模型 Key 和业务系统,本文代码更适合作为源码级教学模板而非直接生产部署的成品。最稳妥的做法是下载代码后,先用测试数据和模拟工具跑通流程,再逐步替换成真实工具和真实模型。毕竟,AI 数字员工的工程化路径没有捷径,只有一层层把系统做扎实,才能真正实现“解放双手”的目标。