OpenShift AI + DeepSeek+IBM CP4BA:实现AI业务自动化中台
一、OpenShift AI + DeepSeek
1、什么是 OpenShift AI?
OpenShift AI(前身为 Red Hat Open Data Hub)是 Red Hat OpenShift 平台上的一套 AI/ML 工具集,基于 Kubernetes,为企业提供可扩展的机器学习平台,可用于模型的训练、部署、监控和生命周期管理。
核心能力包括:
-
GPU 加速支持
-
JupyterHub / Notebook 集成
-
Pipelines 支持自动化训练流程
-
多用户和权限管理
-
与 Ceph、S3 等存储系统兼容
-
与 GitOps、MLOps 工具链集成
2、什么是 DeepSeek 大模型?
DeepSeek 是一个开源大语言模型(LLM)系列,类似于 LLaMA、ChatGLM、Baichuan 等。其特点是:
-
模型规模从 7B 到 67B 不等
-
预训练 + 指令微调(Instruction Tuning)
-
开放源码,适合私有化部署
-
支持中英文、代码理解等任务
-
可在本地服务器/GPU 集群上运行
DeepSeek 适合搭建企业级 私有 GPT、知识问答、代码助手、客服 AI 等场景。
3、OpenShift AI + DeepSeek 私有部署组合架构
部署架构大致如下:
|----------------------------|
| Red Hat OpenShift |
|----------------------------|
| OpenShift AI (KubeFlow, |
| JupyterHub, ML Pipelines) |
|----------------------------|
| GPU Nodes (NVIDIA A100) |
| Model Serving (KServe) |
|----------------------------|
| DeepSeek LLM 模型 |
| (通过 vLLM / TGI 部署) |
|----------------------------|
| 企业私有数据集成 |
| (向量数据库+RAG) |
|----------------------------|
关键组件说明:
-
模型加载:通过 vLLM 或 TGI(Text Generation Inference)高性能加载 DeepSeek 模型
-
服务化部署:用 KServe 或 Triton 做模型服务
-
向量数据库:如 Milvus, Weaviate, Qdrant 实现知识增强(RAG)
-
私有数据对接:可以集成企业文档、数据库、搜索系统
4、优势与特点
优势 | 说明 |
---|---|
💼 私有化部署 | 数据不出本地,符合企业安全合规要求 |
⚙️ 企业级支持 | OpenShift 提供运维、权限、扩展能力 |
🚀 高性能推理 | DeepSeek + vLLM 提供高并发/低延迟响应 |
🔗 可扩展 | 可接入多种数据源、第三方系统 |
🛠 可控性强 | 模型版本、资源使用、权限等高度可控 |
5、典型应用场景
-
企业内部知识问答系统(RAG)
-
专属代码助手 / IDE Copilot
-
客户服务自动化(ChatBot)
-
智能文档生成 / 摘要提取
-
制造/金融/能源行业的 NLP 任务
二、实现对IBM CP4BA的智能化业务中台可行性分析
1、目标场景
通过部署 OpenShift AI + DeepSeek,让用户以 自然语言(聊天)交互的方式 实现对 IBM CP4BA 的以下功能:
-
🔍 基于文档的问答和分析(ECM 如 FileNet)
-
🔄 对业务流程的理解与执行(BPM,如 BAW/BA Studio 流程)
-
✅ 完成流程任务(例如审批、数据录入)
-
📊 对 ECM 文档或业务流程的数据进行分析、汇总、总结
本质上,是将 CP4BA 的“流程 + 内容”能力,通过 AI 对话接口做智能化封装。
2、技术实现路径
下面是一个较为成熟的技术组合(可私有部署):
1. 打通数据接口(对接 CP4BA)
需要做两类对接:
-
ECM 内容:通过 FileNet Content API 获取文档内容、元数据(可转向文本做 RAG 问答)
-
BPM 任务/流程数据:调用 CP4BA REST API(包括任务列表、表单数据、流程状态等)
2. 搭建大模型问答能力(用 DeepSeek + RAG)
-
将 ECM 文档做向量化(用 LangChain + FAISS 或 Milvus)
-
通过大模型(DeepSeek)实现 RAG 问答:将用户自然语言转成结合知识的 Prompt
-
可加上 prompt 模板,支持指令式操作如“帮我审批一下XXX流程”
3. 搭建聊天交互系统
前端可使用:
-
基于 ChatUI / Vue / React 的聊天界面
-
嵌入在 CP4BA Portal、BPM Task UI 或独立 Web App
后端:
-
Chat Controller:解析用户意图
-
动作执行器:根据模型返回意图执行 API 调用,如:
-
查询某流程状态
-
审批某任务
-
下载某文档内容
-
汇总某个客户对应的所有业务记录
-
4. 模型服务部署(OpenShift AI + DeepSeek)
-
使用 OpenShift AI 提供的 GPU 支持,部署 DeepSeek 模型服务(推荐用 vLLM + Triton)
-
部署 LLM 服务组件 + 向量搜索引擎 + 控制服务
3、参考架构图(简略)
[用户聊天界面]│▼
[聊天解析层 - 意图识别 / RAG]│┌───────────────┐│DeepSeek 模型服务│ ← OpenShift AI 上运行└───────────────┘│┌──────────────┐ ┌──────────────┐│ECM 适配器 │←REST→│ FileNet 系统 │└──────────────┘ └──────────────┘│┌──────────────┐ ┌──────────────┐│BPM 适配器 │←REST→│ CP4BA 流程引擎 │└──────────────┘ └──────────────┘
4、示例对话能力
用户问题 | AI 能力 |
---|---|
“请帮我查一下张三的贷款流程审批状态” | 解析“张三+贷款流程”,调用 BPM 查询 API |
“我能看看他提交的资料吗?” | 通过关联流程和 FileNet ECM,提取文档内容 |
“帮我把这个流程提交给上级” | 模型返回意图 → 执行流程任务 API 提交 |
“总结一下我们这个月处理的所有投诉流程” | 汇总 BPM 流程 + 结合模型生成报告 |
5、关键组件/技术推荐
模块 | 技术栈推荐 |
---|---|
模型服务 | DeepSeek-7B/67B + vLLM/TGI |
模型部署平台 | OpenShift AI(支持 GPU & Operator 管理) |
向量数据库 | Milvus / Weaviate / Qdrant |
文档解析 | Apache Tika / pdfminer / OCR |
对话管理 | LangChain / Semantic Router |
API 对接 | FileNet/BAW REST API |
安全认证 | OAuth2 / CP4BA SSO 接入 |
6、可落地性评估
需求是完全可落地的,并且 IBM 自家的 CP4BA 本身就是云原生,和 OpenShift 配合度非常高。DeepSeek 模型也支持私有部署,非常适合放在本地 GPU 集群中与 OpenShift AI 集成使用。
三、 POC 实施方案:智能 AI 聊天访问 CP4BA(ECM + BPM)
做 POC(概念验证)是推动这类项目落地的最佳方式。
1、POC目标
通过部署 OpenShift AI + DeepSeek 模型,构建一个原型系统,实现以下 AI 能力:
-
✅ 实现对 ECM 文档的自然语言问答与总结(RAG 模式)
-
✅ 实现对 BPM 流程的查询、控制、任务处理(自然语言转接口调用)
-
✅ 构建端到端聊天系统,打通用户 → 模型 → CP4BA 的操作链路
-
✅ 在 OpenShift AI 上私有化部署大语言模型 DeepSeek
2、POC 架构总览
┌──────────────────────────────────────┐
│ Chat Web 前端 │
│ (React/Vue + ChatUI) │
└────────────▲─────────────────────────┘│▼
┌──────────────────────────────────────┐
│ 对话控制器(LangChain, FastAPI) │
│ - 用户意图识别 │
│ - Prompt 构建 / 模型调用 │
│ - 动作指令转 REST API │
└────▲─────────────▲───────────────┘│ ││ │▼ ▼
┌────────────┐ ┌────────────────────┐
│ DeepSeek LLM │ │ 向量数据库(RAG) │
│(vLLM部署) │ │ FAISS / Milvus │
└────▲───────┘ └────▲─────────────────┘│ │▼ ▼
┌────────────┐ ┌────────────┐
│ ECM Adapter │ │ BPM Adapter │
│ (FileNet API)│ │ (BAW REST API)│
└────▲───────┘ └────▲───────┘│ │▼ ▼
┌────────────┐ ┌────────────┐
│ FileNet 文档库 │ │ BAW 流程引擎 │
└────────────┘ └────────────┘
3、核心组件及技术选型建议
模块 | 技术选型 |
---|---|
模型服务 | DeepSeek-7B Chat + vLLM |
向量数据库 | FAISS 或 Milvus |
模型部署平台 | Red Hat OpenShift AI(GPU Operator 支持) |
对话框架 | LangChain(Python) |
前端聊天界面 | ChatUI + Vue/React |
数据源适配 | FileNet Content API / BAW REST API |
权限认证 | 内网部署,集成企业 OAuth2 / CP4BA 登录体系 |
4、POC范围定义
1. 文档问答功能(RAG)
-
文档嵌入:选取典型 FileNet 文档 → 提取文本 → 向量化入库
-
用户提问:如“张三贷款文档中,担保人是谁?” → 模型结合上下文回答
文档向量化脚本(PDF / Word / TXT)
from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
import os# 文档路径,可循环多个文档
doc_dir = "docs/"
all_chunks = []# 遍历并加载文件
for file_name in os.listdir(doc_dir):loader = UnstructuredFileLoader(os.path.join(doc_dir, file_name))docs = loader.load()splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)chunks = splitter.split_documents(docs)all_chunks.extend(chunks)# 构建向量数据库
embedding = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vector_db = FAISS.from_documents(all_chunks, embedding)# 保存索引
vector_db.save_local("vector_index/")
2. 流程查询与控制
-
查询任务状态:“张三的贷款流程到哪一步了?”
-
任务处理:“帮我审批这个流程” → 模型识别意图 → 执行 BPM API 提交任务
FileNet + BAW 的 API 适配器代码
import requestsclass BAWAdapter:def __init__(self, base_url, username, password):self.base_url = base_url.rstrip('/')self.session = requests.Session()self.session.auth = (username, password)def get_user_tasks(self, user_id):url = f"{self.base_url}/rest/bpm/wle/v1/tasks?assignedTo={user_id}"resp = self.session.get(url)return resp.json()def complete_task(self, task_id, params=None):url = f"{self.base_url}/rest/bpm/wle/v1/task/{task_id}?action=finish"resp = self.session.put(url, data=params or {})return resp.json()
示例调用:
baw = BAWAdapter("http://baw-server:9080", "admin", "passw0rd")
tasks = baw.get_user_tasks("zhangsan")
print(tasks)
3. 数据分析 / 总结能力
-
“总结下本月处理的投诉流程” → 查询 + 汇总 + AI 生成总结文本
实现:
-
AI 自动从 FileNet / BAW 获取结构化数据
-
汇总/分析后生成图表(柱状图、折线图、饼图)
-
结果以图 + 文总结形式返回前端聊天界面
LangChain 调用“数据分析工具”
使用 Tool
或 Agent
机制,注册一个 DataQueryTool
:
from langchain.agents import Tooldef query_complaint_summary(time_range: str):# 调用 BAW 查询 API,获取流程实例列表,按类别统计return {"投诉类别A": 12,"类别B": 9,"类别C": 5}tools = [Tool(name="ComplaintSummaryTool",func=query_complaint_summary,description="查询指定时间段的客户投诉流程统计")
]
服务端生成图表(可选用 Matplotlib / Plotly)
import matplotlib.pyplot as pltdef generate_bar_chart(data: dict, title: str = ""):fig, ax = plt.subplots()ax.bar(data.keys(), data.values(), color='skyblue')ax.set_title(title)ax.set_ylabel("数量")ax.set_xlabel("类别")fig.tight_layout()# 保存图片filename = "chart.png"fig.savefig(filename)return filename
聊天接口中返回图表
FastAPI 后端返回格式:
{"type": "chart","image_url": "/static/chart.png","caption": "2025年4月客户投诉流程统计图"
}
前端渲染图表消息(React 示例)
{message.type === "chart" && (<div className="chat-message bot"><img src={message.image_url} alt="分析图表" className="rounded-lg w-80" /><p className="text-sm text-gray-500 mt-1">{message.caption}</p></div>
)}
支持的图表类型建议
类型 | 场景 |
---|---|
柱状图 | 各类流程数量 / 文档量 |
折线图 | 时间趋势分析 |
饼图 | 占比统计(例如投诉类别) |
表格 | 多字段对比 |
4. 聊天交互界面
-
搭建对话 Web UI,支持输入、对话记录、上下文保持、错误提示等
示例前端代码(React + Tailwind)
import React, { useState } from 'react';export default function ChatInterface() {const [messages, setMessages] = useState([]);const [input, setInput] = useState('');const sendMessage = async () => {const userMessage = { role: 'user', content: input };setMessages([...messages, userMessage]);setInput('');const res = await fetch('/api/chat', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ message: input })});const data = await res.json();const botMessage = { role: 'assistant', content: data.reply };setMessages((prev) => [...prev, botMessage]);};return (<div className="w-full h-screen p-4 bg-gray-50 flex flex-col"><div className="flex-1 overflow-y-auto mb-4">{messages.map((m, i) => (<div key={i} className={`my-2 p-2 rounded-lg ${m.role === 'user' ? 'bg-blue-100 text-right' : 'bg-gray-200 text-left'}`}>{m.content}</div>))}</div><div className="flex gap-2"><inputtype="text"className="flex-1 p-2 rounded border"value={input}onChange={(e) => setInput(e.target.value)}onKeyDown={(e) => e.key === 'Enter' && sendMessage()}/><button className="px-4 py-2 bg-blue-500 text-white rounded" onClick={sendMessage}>发送</button></div></div>);
}
示例后端代码(FastAPI + LangChain)
from fastapi import FastAPI, Request
from pydantic import BaseModel
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddingsapp = FastAPI()# 加载向量数据库
db = FAISS.load_local("vector_index/", HuggingFaceEmbeddings())
qa_chain = RetrievalQA.from_chain_type(llm=OpenAI(base_url="http://deepseek-service:8000/v1"), retriever=db.as_retriever())class ChatRequest(BaseModel):message: str@app.post("/api/chat")
def chat(req: ChatRequest):response = qa_chain.run(req.message)return {"reply": response}
5. OAuth2 + CP4BA 登录整合方案
企业用户通过浏览器访问聊天系统前端时,将自动跳转至企业统一身份认证平台(如 Keycloak / SSO 网关)进行登录,登录成功后携带 JWT Token 请求后端服务。
后端统一身份认证机制可支持以下两种方式:
✅ 模式 A:OAuth2 JWT 校验(推荐)
适用于前端获取 JWT Token 后传入后端,后端进行解码与验证。
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from jose import jwt, JWTErroroauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")SECRET_KEY = "your-oauth2-jwt-secret"
ALGORITHM = "HS256" # 或 RS256 视实际情况而定async def get_current_user(token: str = Depends(oauth2_scheme)):try:payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])return payload # 包含用户名、角色等except JWTError:raise HTTPException(status_code=401, detail="Invalid token")
✅ 模式 B:CP4BA 内置 LTPA Token(适用于旧系统)
如系统已启用 WebSphere LTPA 登录机制,可从 Cookie 中解析用户身份。
5、所需资源(基础配置)
1. 软件环境
-
OpenShift AI 已部署集群
-
DeepSeek 模型本地文件(7B)
-
CP4BA 环境(含 FileNet 和 BAW)
-
向量数据库服务(容器化部署)
2. 硬件资源(推荐最小配置)
-
GPU:A10×2 或 A100×1
-
CPU:16 Core+
-
RAM:64GB+
-
存储:500GB+
6、DeepSeek 模型部署示例(vLLM + OpenShift AI)
# openshift-deepseek-llm.yaml(部署 vLLM 作为服务)
apiVersion: serving.knative.dev/v1
kind: Service
metadata:name: deepseek-7bnamespace: ai-models
spec:template:spec:containers:- name: vllm-deepseekimage: vllm/vllm-openai:latestcommand: ["python3", "-m", "vllm.entrypoints.openai.api_server"]args:- "--model"- "/models/deepseek-chat-7b"- "--tokenizer"- "deepseek-ai/deepseek-7b"- "--dtype"- "bfloat16"- "--port"- "8000"resources:limits:nvidia.com/gpu: 1memory: "48Gi"cpu: "8"volumeMounts:- name: model-volumemountPath: /modelsvolumes:- name: model-volumepersistentVolumeClaim:claimName: deepseek-model-pvc
配合
vLLM
,将模型以 OpenAI-compatible API 暴露出来,供 LangChain 调用。
7、文档向量化 + RAG 入库脚本(Python 示例)
import requestsdef get_filenet_doc(doc_id, access_token):url = f"https://filenet.company.com/api/documents/{doc_id}/content"headers = {"Authorization": f"Bearer {access_token}"}response = requests.get(url, headers=headers)if response.ok:with open(f"{doc_id}.pdf", "wb") as f:f.write(response.content)else:print("Failed:", response.status_code)# 示例
get_filenet_doc("ecm-12345", "your-access-token")
📌 可用于向量化 ECM 文档(建议抽取 FileNet 文档内容后保存为 PDF/HTML 处理)。
8、可选:调用 BAW 查询流程状态
def get_baw_process(process_id, token):url = f"https://baw.company.com/rest/bpm/wle/v1/process/{process_id}"headers = {"Authorization": f"Bearer {token}"}res = requests.get(url, headers=headers)return res.json()
这些代码示例可以直接嵌入到 LangChain 或 Flask/FastAPI 对话服务中。如果使用的是企业 VPN、SSO 环境,也可添加 CP4BA 用户凭据校验逻辑。
四、聊天式数据分析与图表展示模块
1、模块结构(模块名:data_analysis_toolkit
)
data_analysis_toolkit/
├── __init__.py
├── tools.py # LangChain Tool 注册
├── charting.py # 图表绘制模块(柱状图/饼图/折线图)
├── data_fetcher.py # FileNet / BAW 数据抓取逻辑
├── prompts.py # 分析提示词模板(可选)
├── ecm_fetcher.py # 新增:封装 FileNet 文档查询逻辑
├── tools.py # 扩展:新增 ECM 文档图表工具
2、ecm_fetcher.py
示例(模拟 FileNet 查询)
可以用真实 API 替换这个模拟逻辑:
from datetime import datetime, timedeltadef fetch_ecm_docs_by_day(days=7) -> dict:# 模拟:最近 N 天每天的文档数量today = datetime.today()return {(today - timedelta(days=i)).strftime("%m-%d"): (10 + i*3) % 20for i in reversed(range(days))}def fetch_ecm_docs_by_type() -> dict:return {"合同": 42,"发票": 33,"报告": 27,"其他": 14}def fetch_user_docs_trend(user: str, days=7) -> dict:return {f"{i+1}天前": (5 + i * 2) % 10for i in reversed(range(days))}
3、tools.py
– LangChain Tool 封装
from langchain.agents import Tool
from .data_fetcher import fetch_complaint_data
from .charting import generate_bar_chartdef complaint_summary_tool(time_range: str):data = fetch_complaint_data(time_range)img_path = generate_bar_chart(data, title="投诉流程统计")return {"caption": f"{time_range} 客户投诉流程数量统计","image_url": f"/static/{img_path}"}tools = [Tool(name="ComplaintSummary",func=complaint_summary_tool,description="获取指定时间段内的投诉流程数量并绘图")
]
注册 LangChain 工具
from .ecm_fetcher import fetch_ecm_docs_by_day, fetch_ecm_docs_by_type, fetch_user_docs_trend
from .charting import generate_bar_chart, generate_pie_chartdef ecm_trend_tool(_):data = fetch_ecm_docs_by_day()path = generate_bar_chart(data, "近7天新增文档数量趋势")return {"caption": "近7天新增文档趋势图","image_url": f"/static/{path}"}def ecm_type_dist_tool(_):data = fetch_ecm_docs_by_type()path = generate_pie_chart(data, "文档类型分布")return {"caption": "当前文档类型分布图","image_url": f"/static/{path}"}def user_upload_trend(user: str):data = fetch_user_docs_trend(user)path = generate_bar_chart(data, f"{user} 上传文档趋势")return {"caption": f"{user} 最近上传文档趋势图","image_url": f"/static/{path}"}tools.extend([Tool(name="ECMTrend", func=ecm_trend_tool, description="查看文档上传趋势图"),Tool(name="ECMTypeDist", func=ecm_type_dist_tool, description="查看文档类型分布图"),Tool(name="UserECMTrend", func=user_upload_trend, description="查看用户上传趋势")
])
4、charting.py
– 图表绘制模块
import matplotlib.pyplot as plt
import uuid
import osdef generate_bar_chart(data: dict, title: str):fig, ax = plt.subplots()ax.bar(data.keys(), data.values(), color='skyblue')ax.set_title(title)ax.set_ylabel("数量")ax.set_xlabel("分类")filename = f"chart_{uuid.uuid4().hex[:6]}.png"path = os.path.join("static", filename)fig.tight_layout()fig.savefig(path)plt.close(fig)return filename
5、 图表函数补充(generate_pie_chart
)
def generate_pie_chart(data: dict, title: str):fig, ax = plt.subplots()ax.pie(data.values(), labels=data.keys(), autopct='%1.1f%%', startangle=90)ax.axis('equal')plt.title(title)filename = f"chart_{uuid.uuid4().hex[:6]}.png"path = os.path.join("static", filename)plt.savefig(path)plt.close(fig)return filename
6、data_fetcher.py
– 数据源接入(BAW 示例)
import requestsdef fetch_complaint_data(time_range: str) -> dict:# 示例逻辑:实际应根据 time_range 查询 BAW 流程# 假设返回模拟数据return {"产品质量": 14,"服务态度": 6,"物流问题": 4,"其他": 2}# 可扩展:支持 FileNet 文档统计 / 其他类型流程分析
7、对接聊天接口(FastAPI)
from data_analysis_toolkit.tools import tools
from langchain.agents import initialize_agent
from langchain.chat_models import ChatOpenAIllm = ChatOpenAI(base_url="http://localhost:8000/v1", model="deepseek")
agent = initialize_agent(tools, llm, agent_type="zero-shot-react-description")@app.post("/api/chat")
def chat_with_ai(user_input: str):result = agent.run(user_input)if isinstance(result, dict) and "image_url" in result:return {"type": "chart","image_url": result["image_url"],"caption": result["caption"]}else:return {"type": "text", "content": result}
8、效果展示(聊天界面)
用户输入:
“展示一下3月份各类客户投诉流程数量的分布图”
响应:
-
图表(柱状图或饼图)
-
标题:“3月份客户投诉流程统计图”
-
简要文字总结:“投诉主要集中在产品质量类,共14件,占比60%。”
🧑💼 用户:展示一下这周新增了多少文档?
🤖 AI:这是最近7天的文档上传数量趋势👇
[📊 图表展示]
共上传文档 86 份,其中周三最多,达到了 19 份。
五、FileNet REST API 查询文档列表(Python 示例)
IBM FileNet Content Platform Engine (CPE) 的文档数据分析接口封装代码支持通过 REST API 获取文档信息,并用于图表分析与聊天问答中。
1、接口方案说明
你可以选择使用:
-
CMIS 接口(标准,适配多系统,但能力有限)
-
✅ FileNet REST API(推荐):灵活,可直接查询文档类、自定义属性、时间过滤等。
2、示例:获取某类文档过去 7 天每天上传的数量
import requests
from datetime import datetime, timedelta
from collections import defaultdictFILENET_API_BASE = "https://your-cp4ba-host.com/ibm/content-services/api"
AUTH_HEADER = {"Authorization": "Bearer <your_token>","Accept": "application/json"
}def get_docs_by_day(class_name="Document", days=7):counts = defaultdict(int)for i in range(days):start = (datetime.now() - timedelta(days=i+1)).strftime("%Y-%m-%dT00:00:00Z")end = (datetime.now() - timedelta(days=i)).strftime("%Y-%m-%dT00:00:00Z")url = f"{FILENET_API_BASE}/v1/objects?objectType={class_name}&query=SELECT * FROM {class_name} WHERE DateCreated BETWEEN TIMESTAMP '{start}' AND TIMESTAMP '{end}'"res = requests.get(url, headers=AUTH_HEADER)if res.ok:date_key = (datetime.now() - timedelta(days=i)).strftime("%m-%d")counts[date_key] = len(res.json().get("documents", []))else:print("❌ Error:", res.status_code, res.text)return dict(sorted(counts.items()))# 示例:
# {'04-06': 12, '04-07': 9, '04-08': 5, ...}
3、示例:按文档类型统计数量
def get_doc_count_by_type():type_map = {"合同类": "ContractDoc","发票类": "InvoiceDoc","报告类": "ReportDoc"}result = {}for label, class_name in type_map.items():url = f"{FILENET_API_BASE}/v1/objects?objectType={class_name}&query=SELECT Id FROM {class_name}"res = requests.get(url, headers=AUTH_HEADER)result[label] = len(res.json().get("documents", [])) if res.ok else 0return result
4、示例:指定用户上传文档趋势(按 Creator)
def get_user_docs_trend(username, days=7):counts = defaultdict(int)for i in range(days):start = (datetime.now() - timedelta(days=i+1)).strftime("%Y-%m-%dT00:00:00Z")end = (datetime.now() - timedelta(days=i)).strftime("%Y-%m-%dT00:00:00Z")query = (f"SELECT Id FROM Document WHERE Creator = '{username}' AND "f"DateCreated BETWEEN TIMESTAMP '{start}' AND TIMESTAMP '{end}'")url = f"{FILENET_API_BASE}/v1/objects?objectType=Document&query={query}"res = requests.get(url, headers=AUTH_HEADER)key = (datetime.now() - timedelta(days=i)).strftime("%m-%d")counts[key] = len(res.json().get("documents", [])) if res.ok else 0return dict(sorted(counts.items()))
5、认证方式说明
-
推荐:使用 CP4BA 的 OAuth Token(通过 SSO 或 API Gateway 获取)
-
也支持 Basic Auth(开发环境)
AUTH_HEADER = {"Authorization": f"Basic base64(username:password)"
}
6、集成图表模块
可以将以上函数分别接入:
图表 | 函数 |
---|---|
柱状图 - 文档日趋势 | get_docs_by_day() |
饼图 - 文档类型占比 | get_doc_count_by_type() |
折线图 - 用户上传趋势 | get_user_docs_trend(username) |
返回的数据结构可以直接喂给之前构建的 generate_bar_chart()
或 generate_pie_chart()
。
7、示例图表效果(文本描述)
📊 图表:近7天合同类文档上传数量日期 数量
04-05 3
04-06 5
04-07 8
04-08 6
04-09 9
04-10 10
04-11 4 文档数量整体呈上升趋势,上传高峰集中在 4月9~10日。
相关文章:
OpenShift AI + DeepSeek+IBM CP4BA:实现AI业务自动化中台
一、OpenShift AI DeepSeek 1、什么是 OpenShift AI? OpenShift AI(前身为 Red Hat Open Data Hub)是 Red Hat OpenShift 平台上的一套 AI/ML 工具集,基于 Kubernetes,为企业提供可扩展的机器学习平台,可…...
游戏引擎学习第229天
仓库:https://gitee.com/mrxiao_com/2d_game_5 回顾上次内容并介绍今天的主题 上次留下的是一个非常简单的任务,至少第一步是非常简单的。我们需要在渲染器中加入排序功能,这样我们的精灵(sprites)才能以正确的顺序显示。为此我…...
genhtml 工具使用说明
genhtml 工具使用说明 简介 genhtml 是一个用于生成 HTML 格式代码覆盖率报告的工具,基于 lcov 生成的覆盖数据文件(如 lcov.info)生成交互式 HTML 报告。它支持多种自定义选项,可控制报告内容、样式、输出格式等。 基本用法 ge…...
C++11_2
文章目录 前言一、新的类功能——新的默认成员函数1. 编译器默认生成的移动构造与移动赋值2. 手动提供移动构造或移动赋值的影响 二、可变参数模板1. 多参数1. 可变参数模板的基础 2. 可变参数模板的展开(1)递归展开参数包(2)使用…...
HTML语义化与无障碍设计
HTML 语义化与无障碍设计:构建包容且高效的网页体验 引言 在我的前端开发学习旅程中,起初将 HTML 仅视为页面布局的工具,大量使用无语义的 <div> 和 <span>。直到在一篇技术博客当中了解到,作者在一次团队项目中&am…...
Ubuntu多用户VNC远程桌面环境搭建:从零开始的完整指南
引言: 在当今远程工作盛行的时代,搭建一个安全、高效的多用户远程桌面环境变得越来越重要。本文将为您提供一个从零开始的完整指南,教您如何在Ubuntu系统上搭建多用户VNC远程桌面环境。无论您是系统管理员、开发团队负责人,还是想要为家庭成员提供远程访问的技术爱好者,这…...
Electron 中引入MessageChannel 大大缩短不同渲染进程和 Webview 各组件 1o1的通信链路
背景 在 electron 开发中,也不可避免地遇到端到端的通信问题,Electron 已经内置一些通信 API,但是实际用下来会发现,在引入 Webview 之后,通信链路会很长,参考 利用本地 Express Web 服务解决复杂的 Elec…...
Vscode开发Vue项目NodeJs启动报错处理
文章目录 背景一、npm启动报错报错信息定位原因处理方案第一步、下载安装高版本 二、node 无法识别报错信息处理方案定位原因第一步、检测环境变量第二步、重新开启界面 背景 使用Vscode开发Vue项目,使用到NodeJs,记录出现的问题及处理方案,…...
AI agents系列之AI工作流和AI智能体对比
在人工智能(AI)快速发展的今天,理解AI工作流和AI智能体之间的区别对于有效利用这些技术至关重要。本文将深入探讨AI工作流的类型,解析AI智能体的概念,并重点比较二者的关键差异。 1. 智能体 vs 工作流 关于“智能体”的定义众说纷纭。有些客户将其视为完全自主的系统,能…...
如何恢复极狐GitLab?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 恢复极狐GitLab (BASIC SELF) 极狐GitLab 提供了一个命令行界面来恢复整个安装,足够灵活以满足您的需求。 恢复…...
基于X86/Nvidia+FPGA大模型具身智能机器人控制器解决方案,同时拥有算力与实时的便利
2025年成为人形机器人产业化元年,行业已突破早期实验室研发阶段,进入"场景验证量产爬坡"新周期,预计2031年具身智能市场规模有望突破万亿元。这一进程的背后,是硬件算力、实时控制、环境适应等底层技术的系统性突破——…...
MATLAB项目实战(一)
题目: 某公司有6个建筑工地要开工,每个工地的位置(用平面坐标系a,b表示,距离单位:km)及水泥日用量d(t)由下表给出.目前有两个临时料场位于A(5,1),B(2,7),日储…...
PyCharm Flask 使用 Tailwind CSS 配置
使用 Tailwind CSS 步骤 1:初始化项目 在 PyCharm 终端运行:npm init -y安装 Tailwind CSS:npm install -D tailwindcss postcss autoprefixer初始化 Tailwind 配置文件:npx tailwindcss init这会生成 tailwind.config.js。 步…...
Mybtis和Mybatis-Plus区别
MyBatis 和 MyBatis-Plus 是 Java 中常用的持久层框架,MyBatis-Plus 是在 MyBatis 基础上增强的工具包,让开发更便捷、高效。下面是两者主要的区别: ✅ 核心区别总结: 特性MyBatisMyBatis-Plus配置复杂度需要手写大量 XML 或注解…...
《Learning Langchain》阅读笔记2-基于 Gemini 的 Langchain PromptTemplate 实现方式
本文将使用Gemini实现《Learning Langchain》中的PromptTemplate 实现方式,替代书中的调用openai API,白嫖太香了! 调试步骤 我们首先还是先在本地调试是否可以调用Gemini API: import getpass import osif "GOOGLE_API_K…...
LVS+keepalived搭建高可用架构
背景:最近在搭建LVSkeepalived的高可用架构,中间遇到了一些坑比较让人头疼,此处重要就安装部署的步骤进行记录,特别是遇到坑进行说明,希望能对有需要的同学提供给帮助! 坑点1: 在部署LVSkeepalived并且使用…...
【天梯赛练习】L2-035 完全二叉树的层序遍历
后序遍历转层序遍历 后序遍历:左——右——根层序遍历:数组形式存储的完全二叉树的顺序遍历序列其实就正好是其层序遍历序列。 子树根若是 i d id id,左子树 i d ∗ 2 id*2 id∗2,右子树 2 ∗ i d 1 2*id1 2∗id1 所以就是dfs递…...
2025.4.20机器学习笔记:文献阅读
2025.4.20周报 题目信息摘要创新点网络架构实验生成性能对比预测性能对比 结论不足以及展望 题目信息 题目: A novel flood forecasting model based on TimeGAN for data-sparse basins期刊: Stochastic Environmental Research and Risk Assessment作…...
Leetcode 3359. 查找最大元素不超过 K 的有序子矩阵【Plus题】
1.题目基本信息 1.1.题目描述 给定一个大小为 m x n 的二维矩阵 grid。同时给定一个 非负整数 k。 返回满足下列条件的 grid 的子矩阵数量: 子矩阵中最大的元素 小于等于 k。 子矩阵的每一行都以 非递增 顺序排序。 矩阵的子矩阵 (x1, y1, x2, y2) 是通过选择…...
Redis面试——事务
一、Redis原子性是什么? (1)单个命令的原子性 原子性是指一组操作,要么全部执行成功,要么全部失败。Redis 中的单个命令是天然原子性的,因为 Redis 的命令执行采用单线程模型,同一时间只会执行…...
【远程管理绿联NAS】家庭云存储无公网IP解决方案:绿联NAS安装内网穿透
文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 大家好,今天要带给大家一个超级酷炫的技能——如何让绿联NAS秒变‘千里眼’,通过简单的几步操作就能轻松实现内网穿透。想象一下,无论你身处何地&a…...
AI写程序:用 AI 实现一个递归批量转化 GBK/GB2312 转 UTF-8 工具:轻松解决文本编码转换难题
用 AI 实现一个递归批量转化 GBK/GB2312 转 UTF-8 工具 在处理历史文件或与不同系统交互时,我们经常会遇到 GBK 或 GB2312 编码的文本文件。虽然现在 UTF-8 是主流,但手动转换这些旧编码文件既繁琐又容易出错。为了解决这个问题,我开发了一个…...
首席人工智能官(Chief Artificial Intelligence Officer,CAIO)的详细解析
以下是**首席人工智能官(Chief Artificial Intelligence Officer,CAIO)**的详细解析: 1. 职责与核心职能 制定AI战略 制定公司AI技术的长期战略,明确AI在业务中的应用场景和优先级,推动AI与核心业务的深度…...
uview1.0 tabs组件放到u-popup中在微信小程序中滑块样式错乱
解决思路 重新计算布局信息:在弹窗显示后重新调用 init 方法来计算组件的布局信息。使用 nextTick:保证在视图更新之后再进行布局信息的计算。 <u-tabs ref"tabsRef" ></u-tabs> makeClick(){this.makeShowtruethis.$nextTick…...
私人笔记:动手学大模型应用开发llm-universe项目环境创建
项目代码:datawhalechina/llm-universe: 本项目是一个面向小白开发者的大模型应用开发教程,在线阅读地址:https://datawhalechina.github.io/llm-universe/ 项目书:动手学大模型应用开发 一、初始化项目 uv init llm-universe-te…...
基于Django框架的图书索引智能排序系统设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,图书管理系统当然不能排除在外。图书索引智能排序系统是在实际应用和软件工程的开发原理之上,运用Python语言以及Django框架进…...
网络类型学习
网络类型的分类依据-----基于二层(数据链路层)使用的协议不同而导致数据包的封装方式不同,工作方式也不同。 OSPF协议根据链路层协议类型将网络分为四种类型:广播型网络(BMA)、非广播多路访问(…...
ubuntu24.04离线安装deb格式的mysql-community-8.4.4
1,下载解压 参考: https://blog.csdn.net/2202_76101487/article/details/145967039 下载: wget https://cdn.mysql.com//Downloads/MySQL-8.4/mysql-server_8.4.4-1ubuntu24.04_amd64.deb-bundle.tar 建议个目录mysql8然后把安装包移过去&…...
电控---printf重定向输出
在嵌入式系统开发中,printf 重定向输出是将标准输出(stdout)从默认设备(如主机终端)重新映射到嵌入式设备的特定硬件接口(如串口、LCD、USB等)的过程。 一、核心原理:标准IO库的底层…...
uniapp使用createSelectorQuery,boundingClientRect获取宽度和高度不准确的可用的解决方案
场景展示: uniapp使用createSelectorQuery,boundingClientRect获取宽度和高度不准确的可用的解决方案,正常来说,使用下面的代码是可以正确获得宽高的,但是里面含有图片,在图片没有加载完的情况下,我们可以…...
DSO:牛津大学推出的物理一致性3D模型优化框架
在数字内容创作和制造领域,将2D图像转换为高质量、物理上稳定的3D模型一直是一个挑战。传统的3D建模方法往往需要大量的手动调整以确保生成的物体不仅美观而且符合物理定律,能够在现实世界中稳定存在。牛津大学近期推出了一款名为DSO(Direct Sparse Odometry)的项目,它不仅…...
Delphi Ini文件对UTF8支持不爽的极简替代方案
如题,没太多废话,直接复制走即可。 unit uConfig;interfaceuses classes, Sysutils;typeTConfig class privateFFileName: String;FConfig:TStringList; protectedpublicconstructor Create(ConfigFile:String);destructor Destroy;property FileName…...
Windows平台使用Docker部署Neo4j
✅ Docker 安装 Neo4j 前提条件:安装docker 打开docker desktop docker run \--name neo4j \-p7474:7474 -p7687:7687 \-d \-e NEO4J_AUTHneo4j/password123 \neo4j:5默认用户名是 neo4j,密码是你设置的,比如上面是 password123 ✅用 Pyt…...
FreeRTOS二值信号量详解与实战教程
FreeRTOS二值信号量详解与实战教程 📚 作者推荐:想系统学习FreeRTOS嵌入式开发?请访问我的FreeRTOS开源学习库,内含从入门到精通的完整教程和实例代码! 1. 二值信号量核心概念解析 二值信号量(Binary Semaphore)是Fre…...
数据结构与算法[零基础]---6.算法概况
六、算法概述 (一)算法的概述 任何解决问题的过程都是由一定的步骤组成的,把解决问题的方法和有限的步骤称作算法 (二)算法的基本特征 1.有穷性 算法必须在执行有限个操作之后终止,且每一步都可在有限时间内完成。 2.确定性 算…...
STL简介(了解)
1.什么是STL STL(standard template libaray)是标准模板库,它是C标准库的一部分。C标准库中还有一些其它东西,比如之前用的IO流。它主要是数据结构和算法的库。 2.STL的版本 C3.0出来后就有了模板,此时大家已经深受没有数据结构算法库的痛苦…...
使用 Oh My Posh 自定义 PowerShell 提示符
使用 Oh My Posh 自定义 PowerShell 提示符 由于ai生图,ai视频这方面mac太差了,买N卡,转windows了,这里也记录一下 PowerShell 配置Oh My Posh 先上效果图 一、下载 PowerShell7 默认的 PowerShell5 太差了,下载地…...
4月17号
//1.编码 String str "ai你哟"; byte[] bytes1 str.getBytes(); System.out.println(Arrays.toString(bytes1)); byte[] bytes2 str.getBytes(charsetName: "GBK"); System.out.println(Arrays.toString(bytes2));//2.解码 String str2 new String(byt…...
react-native搭建开发环境过程记录
主要参考:官网的教程 https://reactnative.cn/docs/environment-setup 环境介绍:macos ios npm - 已装node18 - 已装,通过nvm进行版本控制Homebrew- 已装yarn - 已装ruby - macos系统自带的2.2版本。watchman - 正常安装Xcode - 正常安装和…...
自然语言处理(NLP)技术。
自然语言处理(NLP)技术可以应用于多个领域,以下是一些示例: 情感分析:NLP可以用来分析文本中包含的情感,帮助企业了解用户对他们产品或服务的感受。例如,社交媒体平台可以利用情感分析技术来监测…...
Ubuntu 安装WPS Office
文章目录 Ubuntu 安装WPS Office下载安装文件安装WPS问题1.下载缺失字体文件2.安装缺失字体 Ubuntu 安装WPS Office 下载安装文件 需要到 WPS官网 下载最新软件,比如wps-office_12.1.0.17900_amd64.deb 安装WPS 执行命令进行安装 sudo dpkg -i wps-office_12.1…...
【WPF】 自定义控件的自定义属性
文章目录 前言一、自定义控件部分二、在页面中使用总结 前言 在一个页面,重复用到同一个自定义控件时,该如何对控件分别进行数据绑定呢?这时候可以赋予控件一个自定义的属性,来完成此操作。 一、自定义控件部分 为自定以控件设置…...
Unity URP Moblie AR示例工程,真机打包出来,没阴影
效果: unity ar示例演示 现象: 真机打包测试私活没有阴影 Unity版本:2022.3.4f1c1 分析原因: Prefab :ARFeatheredPlane中也有材质,一个用于环境遮挡,一个用于阴影接受。 按理说有啊。 urp …...
如何删除word中的长横线(由三个减号---自动生成/由三个等号===自动生成/由三个###自动生成)_word三个减号回车的横线怎么删除-CSDN博客
方法1、选中前后行ctrlX剪切掉 方法2:如果文件中没有表格就非常简单,直接CtrlA全选整个文档,然后在表格边框里面选择“无框线”OK,如果有表格的话,就从横线的下行开始向上随意选取一部分,同样在表格边框中选…...
函数返回const引用,使用const修饰变量接收
函数返回const引用,使用const修饰变量接收 1、背景 想获取红绿灯时长数组并添加新的值。有个函数是返回红绿灯时长数组的。函数返回类型为const引用,我使用无修饰的变量接收。但是感觉有些问题,并且之前看到const变量变成非const还需要使用…...
在激烈竞争下B端HMI设计怎样打造独特用户体验?
在当今数字化高度发展的时代,B 端市场竞争愈发激烈。对于 B 端 HMI(人机界面)设计而言,打造独特的用户体验已成为在竞争中脱颖而出的关键因素。B 端用户在复杂的工作场景中,对 HMI 设计有着独特的需求和期望࿰…...
数理逻辑(Mathematical Logic)综论与跨学科应用
李升伟 整理 数理逻辑(Mathematical Logic)是现代逻辑学与数学交叉的核心学科,以严格的数学方法研究逻辑推理的形式与规律。其发展深刻影响了数学基础、计算机科学、语言哲学等领域。以下从多个维度综论数理逻辑: 1. 核心分支 命…...
4.17---实现商铺和缓存与数据库双写一致以及宕机处理
实现商铺和缓存与数据库双写一致(以及强双写一致策略) redis点评项目采用的是延时双删策略 双删: 我们更新完数据库之后删除缓存,这样即使有线程并发进来查询,会发现缓存中没有数据,从而会去mysql中查找…...
qt与html通信
**Cef视图(CefView)**是指在使用Chromium Embedded Framework(CEF)时,嵌入到应用程序中的浏览器视图。CEF是一个开源项目,它基于Google的Chromium浏览器,允许开发者将Web浏览器功能嵌入到自己的…...
【从零实现高并发内存池】thread cache、central cache 和 page cache 回收策略详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...