企业在数字化转型中面临一个核心矛盾:组织内部积累了海量文档、FAQ、技术手册和项目复盘,但这些知识分散在文件服务器、Wiki、邮件和即时通讯中,难以被高效检索和复用。大语言模型(LLM)的兴起带来了新的可能,但通用模型缺乏企业内部知识,且数据安全不可控。
检索增强生成(RAG) 结合智能体(Agent) 架构,成为解决这一问题的黄金范式。本文将基于国产开源平台Dify与高性能模型DeepSeek,从零搭建一套生产级企业知识库系统,涵盖文档 ingestion、向量检索、Agent 工具调用、API 集成与性能调优,所有步骤均附带可执行代码与配置,助力企业快速落地 AI 助手。
组件 | 选型理由 |
|---|---|
DeepSeek | 国产 MoE 大模型,推理成本仅为 GPT-4 的 1/10,支持 128K 上下文,中英文能力突出,企业级数据隐私合规。 |
Dify | 开源 LLMOps 平台,内置 RAG 管道、Agent 编排、知识库管理、API 服务,支持多种向量数据库(Weaviate/Qdrant/PGVector),提供可视化工作流,极大降低开发门槛。 |
向量数据库 | 选用 Qdrant(Dify 默认),轻量且性能优异,支持过滤检索与多租户。 |
Embedding 模型 | 使用 DeepSeek 自带的 deepseek-embed(维度 1024)或 Dify 内置的 bge-large-zh,兼顾效果与速度。 |
Dify 官方提供了完整的 docker-compose 文件,包含 API、Web、Worker、PostgreSQL、Redis 和 Qdrant。克隆仓库并启动:
git clone https://github.com/langgenius/dify.git
cd dify/docker
cp .env.example .env
# 修改 .env 中的必要配置(见下文)
docker-compose -f docker-compose.yaml -f docker-compose.middleware.yaml up -d在 .env 中添加 DeepSeek 认证信息,并设置默认模型:
# DeepSeek 配置
DEEPSEEK_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxx
DEEPSEEK_API_BASE=https://api.deepseek.com/v1
DEFAULT_MODEL=deepseek-chat
EMBEDDING_MODEL=deepseek-embed随后启动 Dify,访问 http://localhost:3000 注册管理员账号,在「设置→模型供应商」中添加 DeepSeek:
llm,名称 deepseek-chatfunction calling(必须开启,用于 Agent 工具调用)deepseek-embed,维度 1024验证连接成功后,即可在应用中使用 DeepSeek 作为底层引擎。
Dify 支持批量上传 PDF、Word、TXT、Markdown、HTML 等格式。进入「知识库」模块,创建新知识库(例如 enterprise_docs),上传文件。
Dify 默认的切分策略为「段落 - 句子 - 字符」递归分割,但企业文档常含表格、代码块,需要自定义分段。我们通过 Dify 提供的 分段规则 调整:
\n\n、。、!、?等同时,Dify 允许为每个文档添加 元数据(如部门、版本、标签),用于后续过滤检索。
选择 DeepSeek-embed 模型(或其他,如 BAAI/bge-m3)。Dify 后台点击「运行」即可将切分好的段落向量化并存入 Qdrant 集合。
生产建议:对于超大规模文档集(>10万页),建议分批异步处理,使用 Dify 提供的 CLI 工具或 API 进行批量导入,避免 Web 超时。
Dify 内置三种检索模式:
对于企业知识库,推荐 混合检索 + 权重调整。在知识库设置中,可配置:
retrieval_mode: hybrid
vector_weight: 0.7
keyword_weight: 0.3
top_k: 10
score_threshold: 0.5此外,开启 重排序(Rerank) 模块(Dify 支持集成 Cohere/Jina 重排序器或使用 Cross-Encoder),将初筛的 10 条结果重排为最相关的 5 条,显著提升问答精度。
单纯的 RAG 只能回答固定问题,而真正的企业助手需要能 调用外部工具(如查询数据库、发送邮件、创建 Jira 工单)。Dify 的 Agent 基于 ReAct 框架,借助 DeepSeek 的 function calling 能力实现。
在 Dify 的「工具」模块中,我们可以创建两类工具:
示例:创建一个「查库存」工具,通过 HTTP 请求企业内部库存系统:
name: query_inventory
description: 根据产品编号查询当前库存数量
parameters:
- name: product_id
type: string
required: true
description: 产品唯一编号在 Dify 工作流中,添加 工具调用节点,配置 URL https://internal-api/inventory?product_id={{product_id}},并解析 JSON 响应。
进入「工作室」创建空白应用,选择「Agent」类型,并关联之前构建的知识库。Dify 提供可视化画布,可以设计如下流程:
在「提示词编排」中,我们加入系统级指令:
你是一个企业助手,拥有如下工具:
- query_inventory: 查库存
- search_docs: 搜索内部知识库
请严格遵循以下原则:
1. 优先从知识库检索相关信息,不要编造。
2. 如果问题涉及实时数据,必须调用相应工具。
3. 回答需附上引用来源(知识库文档名或工具返回时间)。Dify 自动维护对话上下文,默认使用 BufferMemory(保留最近 10 轮)。对于长对话,可开启 对话历史压缩(使用 DeepSeek 对历史进行摘要),避免超 token 限制。
Dify 应用发布后,自动生成 REST API 端点,支持同步、流式(SSE)和 WebSocket 模式。以下为 Java + Spring Boot 调用示例,实现企业微信机器人对接。
在 Dify 应用「访问控制」中生成 API Key,并记下 App ID。
@Service
public class DifyAgentClient {
private final WebClient webClient;
private final String apiKey = "app-xxxxxxxxxxxxx";
private final String baseUrl = "http://localhost:5001/v1";
public DifyAgentClient() {
this.webClient = WebClient.builder()
.baseUrl(baseUrl)
.defaultHeader("Authorization", "Bearer " + apiKey)
.build();
}
// 同步阻塞调用
public String chatSync(String query, String conversationId) {
Map<String, Object> payload = Map.of(
"inputs", Map.of(),
"query", query,
"response_mode", "blocking",
"conversation_id", conversationId,
"user", "enterprise_user"
);
return webClient.post()
.uri("/chat-messages")
.bodyValue(payload)
.retrieve()
.bodyToMono(String.class)
.block();
}
// 流式调用(SSE) - 适用于实时对话
public Flux<String> chatStream(String query, String conversationId) {
Map<String, Object> payload = Map.of(
"inputs", Map.of(),
"query", query,
"response_mode", "streaming",
"conversation_id", conversationId,
"user", "enterprise_user"
);
return webClient.post()
.uri("/chat-messages")
.bodyValue(payload)
.retrieve()
.bodyToFlux(String.class)
.map(chunk -> parseSSE(chunk)); // 解析 data: 格式
}
}使用企业微信机器人 Webhook,将 Dify 的回复推送到群聊,并支持 @ 提及触发。示例 Spring Controller:
@RestController
@RequestMapping("/wecom")
public class WeComController {
@PostMapping("/callback")
public ResponseEntity<String> handleMessage(@RequestBody String xml) {
// 解析企业微信 XML,提取用户问题
String query = extractQuery(xml);
// 调用 Dify Agent
String answer = difyClient.chatSync(query, null);
// 构造回复消息并发送
weComService.sendTextMessage(answer);
return ResponseEntity.ok("success");
}
}对于高频查询(如公司政策、假期安排),在 Dify 前增加 Redis 缓存(key = query + 用户角色),TTL 设置为 1 小时,减少重复检索与 LLM 调用。
当新文档上传后,通过 Dify API 触发异步 re-indexing,避免阻塞主流程。使用消息队列(RabbitMQ)解耦:
# 使用 Dify Python SDK
from dify_client import DifyClient
client = DifyClient(api_key='...')
client.create_document(dataset_id='...', file_path='new.docx')利用 Dify 的 工作区(Workspace) 机制,不同部门拥有独立的知识库和应用。API 调用时,通过 user 字段标识租户,并在知识库检索时添加过滤条件(如 metadata.department = user_dept)。
在 Dify 的「输入预处理」节点,可配置正则替换,如身份证号、手机号,确保不传入 LLM。
背景:该企业有 500+ 内部产品文档,每日客服工单 200+,其中 60% 为重复性咨询(如“如何重置密码”“VPN 配置”)。
实施:
效果:
问题 | 可能原因 | 解决方案 |
|---|---|---|
检索结果不相关 | 分段过大或 Embedding 质量低 | 调整分段大小;切换为 bge-m3 或 deepseek-embed |
Agent 不调用工具 | DeepSeek 未正确识别工具描述 | 优化工具 description,增加示例;检查 function calling 是否开启 |
响应慢 | 模型推理或向量检索延迟 | 启用流式输出;使用 GPU 加速 Qdrant;降级为较小模型(如 deepseek-chat 替代 deepseek-reasoner) |
内存溢出 | 文档量过大 | 增加 worker 数量;使用外部向量数据库(如 Milvus 集群) |
本文完整演示了基于 DeepSeek + Dify 的企业智能体知识库构建路径,从部署、知识 ingestion、检索优化、Agent 编排到 API 集成,全部采用开源和国产技术栈,成本可控且灵活可扩展。DeepSeek 的高性价比与 Dify 的可视化编排,使得非 AI 专业的开发团队也能在两周内上线 MVP。
下一步优化方向:
企业 AI 落地绝非一蹴而就,但有了 Dify 这样的平台和 DeepSeek 这样的引擎,工程化门槛已大幅降低。希望本文能成为您实践之路上的可靠参考。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。