简介:面向企业数字化人员、低代码开发者和CRM系统管理者的DeepSeek应用落地指南,聚焦如何基于简道云平台快速搭建CRM智能辅助系统。文档共30页,以单个PDF文件交付,压缩包约2.03MB,目录结构完整,文字与图表显示清晰。内容前半部分梳理DeepSeek接口的技术原理、功能模块与调用流程,并结合简道云的表单设计、流程编排、数据管理与报表能力;后半部分则围绕整体架构设计、接口集成步骤,以及客户信息智能管理、销售机会预测、智能客服支持、营销内容生成等核心模块展开,同时深入涵盖功能测试、性能优化、安全防护、部署监控与故障应急,最后给出企业案例与实施效果展示。目前已有97人学习下载,适合希望掌握低代码与大模型融合路径的开发者,作为从零构建CRM智能辅助系统的完整参考。
1. 低代码整合方案在解决什么问题:当简道云表单遇上DeepSeek API
销售每天把客户需求贴进简道云表单,跟进记录堆了一屏,却没人能快速回答“这个客户值不值得追”。这是中小团队用低代码平台管CRM最常见的尴尬:表单替了Excel,但判断客户意图、写跟进话术仍然靠拍脑袋。低代码整合方案就是把简道云的客户表当成数据底座,用DeepSeek API的文本能力去补上“理解客户”这一层——自动给线索评分、提炼需求、生成跟进建议,再回填到表单里,销售人员只负责看结果和点确认。适合谁?已经在用或准备用简道云,且不想因为加AI功能就重构一套CRM的团队。这篇内容会按一条能跑通的路径讲:数据怎么流、字段怎么设、参数怎么调,以及最容易翻车的几个地方。
2. 先拆清楚数据流:简道云、DeepSeek API 和你的中间脚本各管什么
2.1 简道云只做数据活:用开放接口把客户记录读出来、写回去
简道云本身是一个低代码表单和流程工具,适合记录客户信息、跟进历史、商机阶段。它自带的智能助手能做字段联动和提醒,但无法完成“读一大段中文需求然后给出评分”这种自然语言任务。所以要把数据喂给外部大模型,必须走开放接口。 简道云开放接口的作用就是让脚本可以按表单ID读取记录、按记录ID更新字段。不同版本的鉴权方式不太一样,老版本常见是请求头放一个Token,新版本可能要动态签名,具体字段名要以你简道云后台的“开放接口”或“API调试”页面为准。下面代码用环境变量保存地址和Token,方便部署时替换。
# jiandaoyun_client.py import os import requests JIANDAO_API_BASE = os.getenv("JIANDAO_API_BASE", "").rstrip("/") JIANDAO_TOKEN = os.getenv("JIANDAO_TOKEN", "") def _auth_headers(): return { # 如果你的后台是签名鉴权,把签名字段填进这里 "Authorization": f"Bearer {JIANDAO_TOKEN}", "Content-Type": "application/json", } def get_client_records(form_id: str, limit: int = 20): # 路径以你后台开放接口文档为准,我这里只写最常见的一种 path = "/app/entry/data/list" payload = {"formId": form_id, "limit": limit} resp = requests.post( JIANDAO_API_BASE + path, headers=_auth_headers(), json=payload, timeout=30, ) resp.raise_for_status() data = resp.json() return data["data"] if isinstance(data, dict) else data这段代码做了三件事:拼接API路径、带上认证头、发起POST请求并检查HTTP状态。timeout=30很重要,简道云接口偶发慢,不设超时会拖死整个脚本;raise_for_status()是让请求失败时立刻抛异常,避免后续拿到假数据继续跑。 需要注意,简道云不同数据中心的API地址不一样,建议把完整Base URL放到环境变量里,而不是写死在代码中。我一般会先在后台用它的调试工具发一次同样的请求,确认返回结构和字段名,再回来调参数。这一步能省掉后面大部分接口相关的玄学问题。
2.2 DeepSeek API 能读的是文本,不是表格:先拼提示词,再拿JSON
DeepSeek API 是一个与 OpenAI 协议兼容的对话式接口,把一段系统提示加上客户文本发过去,就能返回一段自然语言或JSON。 对CRM场景来说,不需要它记住任何历史状态,每次请求都把当前客户信息拼成一段有序文本,让它独立输出结论。 选择DeepSeek API而不是本地模型的原因,主要是中文意图理解效果足够好、调用成本低,而且接入方式是标准的HTTPS JSON请求,一个普通Python脚本就能跑起来。
实际调用时,建议把“输出格式”写死在系统提示里。因为后续要把结果自动回填到简道云,如果AI返回的是散文,脚本很难解析。一个最小调用函数如下。
import requests import os DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY") DEEPSEEK_URL = "https://api.deepseek.com/chat/completions" def ask_deepseek(user_text: str, system_prompt: str = "你是CRM销售助手,只输出JSON。") -> str: payload = { "model": "deepseek-chat", "temperature": 0.2, "max_tokens": 800, "messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_text}, ], } headers = { "Authorization": f"Bearer {DEEPSEEK_API_KEY}", "Content-Type": "application/json", } resp = requests.post(DEEPSEEK_URL, headers=headers, json=payload, timeout=30) resp.raise_for_status() content = resp.json()["choices"][0]["message"]["content"] return content参数里最值得关注的是temperature。放到0.2左右,输出会偏向固定和保守,适合评分、分类和话术生成;如果放到0.7,模型创造力上去了,但同一客户跑两次可能给出两种风格的建议,回填到CRM里会让销售困惑。max_tokens控制输出长度,CRM字段往往有长度限制,设800够写一段话术加JSON,如果不够再调。model用deepseek-chat即可覆盖常规文本分析;需要复杂推理的时候可以换更深度的模型,但延迟会变高。
这里还要提一下“不流式调用”。在服务端脚本里,没必要用流式,直接等完整结果。流式主要适合用户端打字机效果,在后台批处理场景只会增加代码复杂度。 另外,如果某条客户文本特别长,比如把几年跟进记录全塞进去,要主动截断。大部分大模型对超长输入虽然能接受,但响应时间和费用会线性上升,而且简道云表单里粘贴的那些聊天记录经常有换行和特殊符号,提前清洗能避免JSON转义出错。
2.3 二传手脚本:先读一张表,再写回一个字段
把前面两块串起来的核心逻辑是:从简道云读出客户记录,拼成文本,交给DeepSeek API,解析结果,再更新回简道云。虽然听起来像“搬数据”,但这里有两个关键设计:一是只处理需要分析的新记录,二是让AI结果落到约定字段里,而不是人再手工复制。
下面这一段是用函数表达完整数据流,简道云和DeepSeek的具体实现已经在前面定义。
def run_once(form_id: str): records = get_client_records(form_id, limit=20) for rec in records: if rec["data"].get("分析状态") == "已分析": continue # 避免重复调用,浪费token又污染数据 data_id = rec["data_id"] fields = rec["data"] user_text = build_crm_text(fields) # 拼人类可读的客户描述 ai_raw = ask_deepseek(user_text) # 调用DeepSeek API parsed = parse_json_fast(ai_raw) # 解析JSON或清错 update_record(data_id, parsed) # 回填到简道云这个模式的优点在于,AI侧的改动不影响简道云结构。要调提示词、换模型、加新输出字段,只需要改脚本里的build_crm_text和update_record两个函数。相比直接在简道云里做复杂联动,这种“低代码+脚本”的分工更容易维护,也更容易做日志和重跑。
分析状态字段是整个流程的守门员。跑过的记录置为“已分析”,下次脚本启动时直接跳过,既节省DeepSeek API配额,又防止某次AI返回错误结果被反复覆盖。如果当天新增了很多客户,可以按创建时间排序,优先处理最早未分析的一条,保证销售看到的永远是按顺序推进的分析结果。
这里还要说清楚什么时候需要“写回”,什么时候不需要。像“线索评分”“意向等级”“跟进建议”这类由AI产生的结论,必须写回。而“客户名称”“需求描述”等原始信息,在调用过程里只读不写。如果脚本不小心把AI生成的幻觉内容写进了原始字段,后面再想洗数据会非常头疼。我会在update_record函数里用一个白名单字段列表,只更新允许的字段,其它键一律忽略。
这样一来,第2章的核心思路完整了:简道云背书数据,DeepSeek API背书理解,脚本只当搬运工并加一道路障。
3. 把 CRM 字段设计好:决定AI是干活还是瞎猜
3.1 客户主表的字段:哪些该给AI,哪些该让AI回填
在动手写代码之前,先回简道云把表单字段理清楚。很多团队翻车在“提示词写得很好但字段里根本没有这些数据”。我的建议是,主表至少包含两组建模字段:一组是给AI作为输入的,一组是接收AI结果输出的。
可以按下面这样安排:
| 字段 | 类型 | 方向 |
|---|---|---|
| 客户名称 | 单行文本 | 输入 |
| 联系人 | 单行文本 | 输入 |
| 来源 | 单选(官网/转介绍/展会/广告) | 输入 |
| 需求描述 | 多行文本 | 输入 |
| 最近跟进记录 | 多行文本/子表单 | 输入 |
| 线索评分 | 数字 | 输出 |
| 意向等级 | 单选(高/中/低) | 输出 |
| AI跟进建议 | 多行文本 | 输出 |
| 下一步动作 | 多行文本 | 输出 |
| 分析状态 | 单选(待分析/已分析) | 脚本控制 |
输出字段建表时先留空,脚本跑完后回填。分析状态是脚本的安全阀,也放在表单里,方便你在简道云后台按“待分析”过滤出还没有被AI处理的客户。不要小看这个字段,它比脚本里存一个本地游标更直观,任何同事打开表单都能看到哪些客户还没分析。
字段类型的选择会影响回填成功率。数字字段必须让AI只输出数字;单选字段必须让AI从你给定的选项里选一个;多行文本虽然能容纳长话术,但不要让AI输出超过表单字段上限的内容。我见过有人把AI建议填进“单行文本”字段,结果系统直接截断,销售看到半句话比没看到还糟。所以输出字段尽量用多行文本或子表单。
3.2 用子表单记录跟进历史,让AI有上下文可看
CRM智能辅助和单纯调用大模型的差别,在于能不能结合历史。只看“客户要做一个订单管理系统”这句话,AI很容易给出“高意向”这种空泛判断;但如果看到前三次跟进记录里,客户已经在问价格、实施周期和私有化部署方式,AI才会给出“高意向、可推进”的结论。
在简道云里,跟进历史通常建子表单,每次拜访或通话后新增一条记录。主表和子表通过“客户ID”或“关联数据”关联。为了让AI能读到历史,脚本里需要把最近N条跟进记录拼进提示词。N不是越大越好,一般选最近3条以内,一方面控制token,另一方面避免很久之前的冷淡沟通干扰当前判断。拼接时每条记录截断到200字左右,只保留时间、跟进人、跟进内容三列。
给AI看的文本结构要保持固定。先主表摘要,再历史跟进,最后明确告诉它要输出什么。不要直接把简道云API返回的JSON丢给大模型,那种字段名是英文或乱码的东西,模型也能猜,但效果飘忽。低代码平台的字段名往往带中文,我们需要在脚本里把它们翻译成一句人话。
3.3 提示词模板的设计:把表字段翻译给DeepSeek API
下面这段函数假定了表单字段名是中文,取出后拼成一段适合给模型的文本。实际字段名要在简道云后台确认,但不影响这个结构本身。
def build_crm_text(fields: dict, history_records: list) -> str: lines = [] lines.append(f"客户名称:{fields.get('客户名称', '')}") lines.append(f"联系人:{fields.get('联系人', '')}") lines.append(f"来源:{fields.get('来源', '')}") lines.append(f"需求描述:{fields.get('需求描述', '')}") if history_records: lines.append("最近跟进记录:") for h in history_records[-3:]: time = h.get("时间", "") content = (h.get("内容", "") or "")[:200] lines.append(f" {time}:{content}") return "\n".join(lines)这段代码里有几个细节值得注意。第一,history_records[-3:]只取最近三条,避免超长;第二,每条内容截断到200字符,防止个别同事把整段聊天记录粘贴进来;第三,字段读取用.get(),缺字段时给空字符串,保证脚本不会因为某个字段没填而崩溃。 我一般还会在函数后面加一个调试开关,打印拼出来的文本前500字,确认模型看到的内容跟预期一致。这一步看起来很笨,但能查出很多“字段值没传上”的低级问题。
提示词侧的系统提示也要配套。比如:“你是销售总监助理。根据客户信息和最近跟进记录,对客户进行评分、判定意向等级、生成跟进建议。只输出JSON,包含score、level、suggestion、next_action四个字段。” 这样AI的输出字段就固定了,脚本解析省心。
在update_record中,建议这样限制:只更新“线索评分”“意向等级”“AI跟进建议”“下一步动作”“分析状态”这五个字段。其它字段一律不碰。这个白名单要从配置里读,不要散落在代码各处。 这样即使后续有人在简道云里加了新字段,脚本也不会误填。
4. 从零跑通:构建可回填的AI辅助全链路
4.1 在简道云后台拿到读写凭证,先跑通第一次查询
开始之前,建议先在简道云后台把表单发布到“正式环境”,因为开发环境表单的开放接口地址和正式环境可能不是同一个。接着找到“开放接口”或“API管理”,创建一个应用密钥,把它放到环境变量JIANDAO_TOKEN里。API地址同样通过环境变量传入。 然后跑一个最简单的查询脚本,不要直接上全流程。
export JIANDAO_API_BASE="https://你的简道云数据中心地址" export JIANDAO_TOKEN="你的Token" export DEEPSEEK_API_KEY="你的DeepSeek Key"# smoke_test.py from jiandaoyun_client import get_client_records form_id = "你的表单ID" records = get_client_records(form_id, limit=5) print(records[0]["data"])如果这一步能打印出第一条记录,说明鉴权和读取都通了。常见的失败点有两个:一是Token权限没开,返回403或401;二是API路径不对,返回404或unknown path。 这个冒烟测试只打印不写改,不用担心搞脏数据。可以把print换成json.dumps(..., ensure_ascii=False, indent=2),中文显示更整齐。
提示:冒烟测试这一步值得做两次。第一次查有限条数,第二次把返回的完整JSON存到文件里,后面解析字段名时直接对照,省去反复读文档的麻烦。
4.2 让DeepSeek API严格按JSON输出:提示词、温度一起约束
在简道云侧拿到数据后,下一步是确保AI输出可以直接被解析。提示词里要把输出结构写清楚,并给出示例。常见的做法是给出一个“客户输入样例”和一个“期望输出样例”,模型在少量示例下会更不容易跑偏。
SYSTEM_PROMPT = """ 你是CRM销售数据分析助手。你的任务是根据客户信息和最近跟进记录,输出一份简洁的销售辅助判断。 只输出JSON,不要输出其它任何解释。格式如下: { "score": 0, "level": "高", "suggestion": "一句话跟进建议", "next_action": "下一步具体动作" } score 在 0 到 100 之间,level 只能从 ["高", "中", "低"] 中选择。 """调用时把temperature保持在0.2,max_tokens给400就够。如果DeepSeek API版本支持response_format,可以追加"response_format": {"type": "json_object"};不支持时也不用慌,后面解析函数要能容忍JSON外壳带说明和换行。 我通常会在脚本里测试三次,输入同一个客户文本,看score是否剧烈波动。如果波动幅度超过20分,说明提示词里信息不足,而不是模型抽风。这时候回去补历史跟进记录,比再调温度有用。
4.3 编写回填逻辑:白名单更新,重复处理跳过
回填到简道云时,注意字段名和API要求的字段编码。简道云开放接口返回的字段名可能是表单控件名,也可能是内部字段标识,要在调试时确认。下面的更新函数只更新白名单字段,并且记录处理日志。
def update_record(data_id: str, parsed: dict): whitelist = ["线索评分", "意向等级", "AI跟进建议", "下一步动作", "分析状态"] payload = {"dataId": data_id, "data": {}} for key in whitelist: if key in parsed: payload["data"][key] = parsed[key] payload["data"]["分析状态"] = "已分析" path = "/app/entry/data/update" resp = requests.post( JIANDAO_API_BASE + path, headers=_auth_headers(), json=payload, timeout=30, ) resp.raise_for_status() return resp.json()这个函数有两个关键设计。一是“白名单更新”,即使DeepSeek API返回了额外字段,也一个都不落回简道云,防止污染数据。二是“状态置为已分析”,即使某个客户不评分或不需要回填,只要跑过了就标记,避免每次都重复消费。 如果某次AI解析失败导致parse_json抛异常,脚本应该捕获异常并把分析状态置为“异常”,而不是停在“待分析”让它无限重试。这样你可以定期在简道云里筛“异常”记录,人工检查是提示词问题还是个别数据太脏。
4.4 用定时任务触发整条流水线
整条链路跑通后,不需要一个常驻服务,一个cron定时任务就够了。建议在工作时段每30分钟跑一次,频率不要太高,避免超出简道云API和DeepSeek API的配额。
*/30 9-19 * * 1-6 cd /opt/crm-assist && /usr/bin/python3 run.py >> run.log 2>&1这个cron的含义是:周一到周六的9点到19点之间,每30分钟执行一次。run.py内部会先查还未分析的记录,最多处理50条,防止一次批量太大。 日志要按天滚动,run.log会持续变大,建议加一行logrotate或脚本内logging.handlers.RotatingFileHandler。否则半年后日志文件几个GB,排查问题反而更慢。
那什么时候可以用简道云自带的智能助手,什么时候必须脚本?智能助手处理“当AI评分大于80,通知销售经理”这类简单条件,完全可以胜任;但“调用DeepSeek API解析结果并回填”这件事,简道云自己做不了。所以最省心的分工是:脚本负责所有跟大模型相关的计算,简道云负责计算完成后的动作触发。这样把低代码平台的易用性和大模型API的灵活性都留住了。
5. 排查手册:在简道云和DeepSeek API之间跑AI的五个常见坑
这套系统横跨低代码平台、大模型API、传统脚本三个领域,每一层都有自己的边界。简道云擅长表单和流程,但API数据格式和字段约束经常让人抓狂;DeepSeek API能理解自然语言,但对输出格式的承诺不是绝对的;脚本本身则要处理超时、重试和日志。下面五个坑按出现频率排,你看完至少能少填一半的坑。
5.1 鉴权失败:接口总是返回“401 Unauthorized”
现象:冒烟测试阶段,get_client_records抛HTTP 401,或者后台日志显示“登录过期”。
原因:简道云Token填错、Token有效期过短、签名时间戳和服务器时间不一致。
解决:到简道云后台重新复制Token,注意有没有复制出多余空格;确认脚本容器时间和真实时间不超过5分钟;临时在请求头里打印Token前几位和后几位,确认环境变量已经加载。如果接口是签名鉴权,优先检查请求里的时间戳是否用了UTC,简道云服务端大多数按UTC时间做校验。
5.2 脚本卡住:超时时间设太短或输入文本太长
现象:跑到某条客户记录时,脚本一直停在“正在调用DeepSeek API”,最后整个任务超时。
原因:单条提示词超过模型上下文窗口,或者网络响应变慢,而requests默认不设超时会一直等。
解决:给ask_deepseek的timeout设为30秒;在build_crm_text里对每个字段统一截断,总文本控制在1500字以内;加一个重试逻辑,第一次超时后等2秒再试一次,最多3次。 不要盲目把超时调成120秒,那样只会让排队记录越积越多,销售等不到结果。
5.3 输出解析失败:AI在JSON旁边写了闲聊
现象:parse_json_fast报json.decoder.JSONDecodeError,打印AI返回内容发现前面有“好的”或者“根据您提供的信息”。
原因:system prompt对格式约束不够,或者模型版本对response_format支持不严格。
解决:解析前先用正则截取第一个{到最后一个}之间的内容;如果截取后仍失败,把该条记录标记为“异常”留待人工处理。另外在系统提示里强化“禁止输出任何非JSON文本”这句。 不要指望所有调用都100%标准,解析函数要写“宁可返回空,也不要让脚本崩溃”。
注意:解析函数建议统一收口成单独模块,不要在每个业务函数里各自写一遍。这样出问题时只需改一个地方。
5.4 回填更新不到数据:简道云的文本字段有长度上限
现象:脚本没有报错,但打开表单发现“AI跟进建议”是空的,或者内容被截断。
原因:简道云多行文本控件在不同版本下可能有长度上限,AI生成的suggestion超过这个长度后,更新接口返回成功但实际写入被静默截断,或直接写入失败。
解决:回填前统一suggestion[:200],next_action[:100],数字字段强转int(round(float(score)));把字段类型从多行文本改成子表单也能容纳更长内容,但需要同步改提示词要求。 我建议无论如何都要截断,AI续写话术的能力再强,也不要挑战表单字段边界。
5.5 漏跑记录:只查了第一页就以为处理完了
现象:脚本每天只处理前20条,新客户排在后面,连续三天都没被分析。
原因:简道云分页接口一次性返回固定条数,你的脚本没有翻页或增量标记。
解决:在查询条件里加上filter只拉“分析状态不等于已分析”的记录;如果必须翻页,每次按更新时间排序,记住最后一条ID,下次从它开始。 更省事的做法是在简道云里建一个“待分析”视图,脚本每次只读取该视图的未处理记录,处理完状态变掉,它自然离开视图。
6. 让这套AI辅助系统真正有用:回测历史和两个进阶玩法
6.1 先用历史客户做一次回测
把最近已经成交或已经流失的20个客户重新跑一遍,对比AI给出的评分和销售当初的实际判断。验证指标很简单:高分客户里成交占比是否明显高于低分客户。不需要用复杂指标,只要把结果按0-100分排序,看前5名的成交率是不是比后5名高。如果分不出差距,说明提示词里缺少关键字段,回去补“预算”“决策人”“时间计划”等信息。
def backtest(records): scored = [(r["score"], r["deal"]) for r in records if r.get("score") is not None] scored.sort(key=lambda x: x[0], reverse=True) top = scored[:5] bottom = scored[-5:] print("top deal rate:", sum(1 for _, deal in top if deal) / len(top)) print("bottom deal rate:", sum(1 for _, deal in bottom if deal) / len(bottom))这段代码用列表推导取出分数和成交标记,排序后分别算前五名和后五名的成交率。回测脚本里要注意r["deal"]是从简道云导出时人工标记的成交状态,不要用AI自己生成的分数来推断成交,否则就循环论证了。
6.2 进阶玩法一:从“评分”到“催办”,按阈值触发简道云智能助手
AI回填的score字段可以直接作为简道云智能助手的触发条件。比如在简道云里配置新增或修改表单数据时,如果“线索评分”大于80,就自动通知销售经理。这样就形成了一条“AI分析结果 → 低代码自动动作”的闭环。不需要额外写代码,销售经理每天只看到AI认为最该跟进的客户,而不是被所有新线索淹没。
6.3 进阶玩法二:让AI生成“下一步动作”并写入时间线
更进一步,AI输出的next_action可以回填到简道云的时间线字段或子表单,比如“明天上午给客户发方案,重点确认私有化部署需求”。销售打开客户详情就能看到这句具体动作。相比漫无目的的评分,这句“下一步”才是真正能让CRM系统产生价值的点。 回填后还可以配合简道云的提醒功能,按next_action里的日期字段自动生成待办,让销售不只看到建议,还能被系统追着往前走。
我在实际维护这套系统时,养成了一个习惯:每次改完提示词,都用同一条真实客户记录连续跑三次,看输出结果是否飘;如果三次给的建议都不一样,我宁愿改提示词也不盲目上线。这种玄学问题在低代码+API的组合里几乎天天见,但多数时候是数据字段没喂够,不是模型不够聪明。希望这套路径和避坑清单能真的帮到你跑通第一个智能辅助。
本文还有配套的精品资源,点击获取