金融、政务客户最常问:"这套合同系统能跑在纯国产栈上吗?"本文以达梦 DM8 + 统信 UOS 为例,给出从零到一的部署实战,并讲清向量检索迁移、本地推理、BYOK 无云依赖的具体配置。
一、为什么是达梦 + 统信 UOS
选型逻辑直接:达梦 DM8 是国产关系型库里对 Oracle/PostgreSQL 语法兼容度最高的之一,存量合同系统的 SQL 改造量小;统信 UOS 是信创目录主流服务器 OS,生态适配成熟。两者组合覆盖等保三级"自主可控"加分项,采购方信创评审少做一堆论证——这是"国产化与合规"差异化卖点最直接的落地形态。
二、部署架构图
┌──────────────── 统信 UOS Server 20 (应用节点) ────────────────┐ │ [nginx] ─ [app: FastAPI/LangGraph] ─ [Redis/BullMQ] │ │ │ │ │ │ │ [Ollama :11434] qwen2.5:7b-instruct-q4_K_M │ │ │ │ (BYOK 无云依赖, 数据不出域) │ └───────┼──────────────┼────────────────────────────────────────┘ │ │ ┌───────┼──────────────┼──────── 统信 UOS Server 20 (数据节点) ─┐ │ [达梦 DM8 :5236] [Elasticsearch :9200] [MinIO :9000] │ │ (归档+备份开启) (BM25 稀疏检索) (S3 兼容文件存储) │ └────────────────────────────────────────────────────────────────┘三、Docker Compose 编排
一份可自查的 docker-compose.yml,把应用、DM8、ES、MinIO、Ollama 一起拉起:
version:"3.8"services:dm8:image:registry.csdn/dom/dm8:latestcontainer_name:dm8environment:-DM_CHARSET=UTF-8# 中文乱码坑:字符集一次配好volumes:-./dm_data:/opt/dmdbms/datanetworks:[data_net]# 不映射宿主机端口,仅内网可达elasticsearch:image:elasticsearch:8.13.4environment:-discovery.type=single-node-xpack.security.enabled=falsenetworks:[data_net]minio:image:minio/minio:latestcommand:server /data--console-address ":9001"volumes:["minio_data:/data"]networks:[data_net,edge]ollama:image:ollama/ollama:latestports:["11434:11434"]volumes:["ollama_data:/root/.ollama"]deploy:resources:limits:{devices:[{driver:gpu,count:"1"}]}# 消费级显卡即可app:build:./appenvironment:-LLM_BASE_URL=http://ollama:11434-LLM_MODEL=qwen2.5:7b-instruct-q4_K_M-DB_DSN=dm://app:pass@dm8:5236/CLM-ES_URL=http://elasticsearch:9200-OBJ_STORE=s3://minio:9000depends_on:[dm8,elasticsearch,ollama,minio]networks:[app_net,data_net]networks:edge:{}; app_net:{}; data_net:{}四、让 PostgreSQL 逻辑跑到达梦上
开源合同系统多用 PostgreSQL + pgvector。迁移 DM8 重点是三类对象:
-- 1. 自增主键:PG 的 SERIAL → 达梦 IDENTITYCREATETABLEcontract(idINTIDENTITY(1,1)PRIMARYKEY,titleVARCHAR(256),created_atTIMESTAMPDEFAULTSYSTIMESTAMP);-- 2. 向量检索:达梦无原生向量,JSON 存特征 + 应用层余弦ALTERTABLEclauseADDfeature CLOB;-- 存向量 JSON-- 3. 全文检索:ES 的 BM25 保留,达梦侧全文索引兜底CREATECONTEXTINDEXidx_contract_titleONcontract(title);语义检索(原 pgvector)迁移到应用层:调用 Ollama 生成向量后做余弦相似度;关键词检索仍用 Elasticsearch,RRF 融合逻辑不变。既保住 AI 能力又完成国产库替换。
importjson,mathdefcosine(a:list[float],b:list[float])->float:dot=sum(x*yforx,yinzip(a,b))na=math.sqrt(sum(x*xforxina));nb=math.sqrt(sum(y*yforyinb))returndot/(na*nb+1e-9)# 从 clause.feature(CLOB) 取出 JSON 向量,与查询向量比对vec=json.loads(row["feature"])score=cosine(query_vec,vec)取舍:应用层向量计算比 pgvector 原生算子慢些,但金融合同"低频高准确"场景完全可接受。实测单份 8600 字合同特征提取 + 余弦匹配约 1.3s,瓶颈在模型推理而非检索。未来达梦生态补齐向量类型可再迁回,架构留好口子。
五、自托管 AI:数据不出域
合规要求合同数据不能出境。UOS 上用 Ollama 部署 7B 量化模型:
# UOS 上安装 Ollama(arm64/x86 均有包)ollama pull qwen2.5:7b-instruct-q4_K_M ollama serve# 监听 11434# 合同系统配置指向本地端点,BYOK 无云依赖exportLLM_BASE_URL=http://127.0.0.1:11434exportLLM_MODEL=qwen2.5:7b-instruct-q4_K_Maakd 的自托管模式正是如此——可选云端或本地 Ollama,模型跑在自有服务器。配合 MCP 协议端点,AI 代理只能经标准接口取数,数据库不直接暴露,过等保密评是加分项。
六、连接配置:DM8 客户端注意点
达梦在 UOS 安装包官方已提供,但dm_svc.conf的服务名、端口、字符集(建议 UTF-8)必须一次配好,否则应用连上去中文乱码——这是迁移最高频"低级坑",排查却最耗时间。
# /etc/dm_svc.conf DM8=(192.168.10.20:5236) CHARSET=(UTF-8)Python 侧用 dmPython 驱动:
importdmPython conn=dmPython.connect(user="app",password="pass",server="dm8",port=5236,charset="UTF-8")cur=conn.cursor()cur.execute("SELECT id, title FROM contract WHERE org_id=?",[10])七、上线验证清单
- 合同 CRUD 在达梦全链路跑通,无 PG 专有语法残留;
- 条款抽取 + 风险打分走本地 Ollama,延迟 < 6s/份;
- RRF 混合检索在达梦 + ES 双源下 top-1 命中率 ≥ 85%;
- 国密 SM4 加密备份可正常恢复;
- 统信 UOS 环境完成信创兼容性认证盖章。
八、性能与落地数据
某政企客户实测:整套环境从裸机到可对外提供合同审查服务约 2.5 天,其中 1 天花在达梦初始化与数据导入。迁移后首月原 PG 云数据库账单归零,本地 Ollama 推理成本几乎可忽略——长期运营这笔账越算越划算。
wraft(Elixir+Phoenix,162 Stars)展示了另一种规模:统一接入 20+ AI 供应商,靠 Oban 调度异步化审查,适合高并发批量合同场景,可作为规模化参考。
九、迁移批次与双写校验
生产迁移不能"一刀切"。先用双写期灰度:PG 与 DM8 同时落数,跑一致性校验脚本比对行数与关键字段哈希,差异归零后再切读流量到 DM8:
defdiff_row(old_pg,new_dm,table:str)->list[int]:# 比主键集合 + 关键字段 md5,找出不一致行pg_ids={r[0]:md5(r[1:])forrinold_pg.query(table)}dm_ids={r[0]:md5(r[1:])forrinnew_dm.query(table)}return[iforiinset(pg_ids)|set(dm_ids)ifpg_ids.get(i)!=dm_ids.get(i)]十、资源规划与调优
达梦在 UOS 上默认内存参数偏小,批量导入合同前需调BUFFER、MAX_SESSIONS;Ollama 的 7B 量化模型常驻显存约 4.7GB,留足余量避免 BullMQ 并发时 OOM。MinIO 用纠删码模式替代单盘,掉盘可恢复。
十一、踩坑记录
- 中文乱码:dm_svc.conf 字符集漏配,排查一整天。UTF-8 一次到位。
- 自增语法:PG 的
SERIAL直接复制到 DM 报语法错,改IDENTITY(1,1)。 - 向量算子缺失:pgvector 的
<->在 DM 无对应,下沉应用层余弦计算兜底。 - Ollama 显存争用:批量扫 1200 份占满显存拖慢检索,BullMQ 限流压到 GPU 稳吃 8 路。
- 备份未加密:等保密评要求备份加密,补 SM4 加密备份 + 异地恢复演练。
十、关键技术点小结
- 达梦 DM8:IDENTITY 自增、CLOB 存向量、全文索引兜底,兼容 PG 语法降改造成本。
- 统信 UOS:信创目录主流 OS,Ollama/DM8 均有适配包。
- Docker Compose:网络隔离,数据库不暴露公网,BYOK 无云依赖。
- Ollama 本地推理:7B 量化跑消费级显卡,数据不出域。
- 混合检索:应用层余弦 + ES BM25 + RRF,能力不丢。
十一、信创认证与合规红利
对决策者,纯国产栈的价值不只是合规:降低被制裁断供风险、自托管 AI 省下逐年上涨的云 API 账单、信创认证在政府采购加分。技术与管理目标在此高度一致。部署完需走统信 UOS 兼容性认证盖章,并把 DM8 驱动版本、Ollama 模型哈希写入交付清单,作为等保密评的供应链自证材料。
十二、开放性问题
当达梦等国产库补齐原生向量类型后,是把语义检索"迁回"数据库算子以榨性能,还是维持应用层计算以保跨库可移植性?这条"性能 vs 可移植"的取舍你们怎么定?