deepseek 模型需通过 langchain 兼容接口接入 crewai,ollama 模型名须严格匹配(含 tag),agent 必须显式指定 llm,expected_output 要明确格式且避免弱约束词,推荐 sequential 执行模式,tool 需设 return_direct=true 防止解码错误。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

DeepSeek 模型不能直接嵌入 CrewAI 的 Agent 构造中——它必须通过 LangChain 兼容的 LLM 接口接入,否则会报 TypeError: 'DeepSeek' object is not callable 或 AttributeError: 'DeepSeek' has no attribute 'invoke'。
用 Ollama 加载 DeepSeek-R1 时,model 名称必须严格匹配
很多人卡在第一步:Ollama 中模型名和 CrewAI 初始化时传入的 model 参数不一致。例如你在终端运行 ollama run deepseek-r1:14b 成功,但在代码里写 Ollama(model="deepseek-r1") 就会失败。
- Ollama 模型名区分 tag,
deepseek-r1:14b和deepseek-r1:7b是两个不同模型,不能混用 - CrewAI 的
Agent初始化必须显式指定llm=Ollama(...),不能依赖默认 LLM - 若使用本地 API(如
http://localhost:11434),需确认 Ollama 服务正在运行:ollama serve不是后台常驻服务,关闭终端后会退出
Task.expected_output 不只是提示词,它直接影响 DeepSeek 的输出结构
DeepSeek 对任务约束敏感,尤其在生成代码、JSON 或带格式文本时。expected_output 写得模糊(比如只写“生成测试脚本”),会导致输出冗长、含解释性文字、甚至拒绝执行;写得太死(比如硬要求“必须用 pytest.fixture”),又可能因模型知识边界触发 fallback。
统一LLM网关 - 一个API对接70+AI模型,使用单一API密钥即可调用GPT、Claude、Gemini、Qwen、Deepseek、Grok等主流模型。
- 推荐写法:
expected_output="一个可直接运行的 Python 脚本,包含 import、test_ 开头的函数、无注释、无额外说明" - 避免用“请”“应该”“尽量”等弱约束词,DeepSeek 会按字面忽略
- 若需 JSON 输出,务必加一句:“只返回纯 JSON,不带任何 Markdown 或前导说明”
Crew 执行模式选 Process.sequential 还是 Process.hierarchical?
对 DeepSeek 来说,hierarchical 模式风险更高:它依赖一个“manager”智能体调用其他智能体,而 DeepSeek-R1 在长上下文推理中容易丢失子任务状态,导致 manager 返回空或重复分派任务。
- 默认用
Process.sequential更稳,尤其当所有 Agent 共享同一个 DeepSeek 实例时 - 若坚持用
hierarchical,必须给 manager Agent 单独配更强模型(如 GPT-4)或更高temperature=0.1降低发散 - 所有 Agent 共享同一
Ollama实例时,注意并发请求可能触发 Ollama 内存溢出(R1-14b 占约 8GB VRAM),建议加max_concurrent=1限流
自定义 Tool 调用失败,90% 是因为没设 func.return_direct = True
当你封装一个保存文件的 Tool(比如写 save_script.py),CrewAI 默认会把 Tool 返回值再喂给 LLM 做总结。但 DeepSeek 对二进制/路径类返回极不友好,常直接报 UnicodeDecodeError 或静默跳过。
- 必须显式设置:
save_tool = Tool(name="save_script", func=save_script, return_direct=True) -
return_direct=True表示该 Tool 结果不经过 LLM,直接作为 Task 输出终止流程 - 若 Tool 需要被多个 Agent 复用,别用闭包捕获变量,改用
functools.partial绑定参数,否则 DeepSeek 可能读到未初始化的self
最易被忽略的是 DeepSeek 的 token 截断行为:它对超长 backstory 或嵌套 Task.description 会主动截断中间内容,而不是报错。检查日志时重点看 verbose=True 下实际送入模型的 prompt 长度,别只信你写的字符串长度。









