观澜:一个 AI 驱动的不良资产尽职调查系统实践
文章目录一、背景一个被低估的 AI 落地场景二、技术架构不追新只求稳容器化部署三、核心流程两阶段流水线数据采集优雅降级策略AI 分析三条并行的 LLM 推理线四、几个值得一说的技术细节4.1 后端异步任务的双模式调度4.2 Token 黑名单的自动过期4.3 GSXT 反爬对策4.4 LLM 输出的鲁棒性处理五、为什么选 DeepSeek-V3 而不是 GPT-4六、教训与反思6.1 过早抽象 过度设计6.2 WeasyPrint 的 Windows 兼容性6.3 Redis 多 DB 的隔离策略6.4 对国内网络环境的适应七、写在最后一、背景一个被低估的 AI 落地场景不良资产处置是一个万亿级的市场。这个行业的起点和核心是尽职调查——你需要搞清楚每个债务人是否还有偿还能力、有没有隐匿资产、实际控制人是谁、有没有关联企业转移资产。传统的尽调流程是这样的手工打开 GSXT国家企业信用信息公示系统逐个搜索债务人名称逐页截图、记录股东、对外投资、行政处罚等信息打开裁判文书网查询涉诉记录把以上信息粘贴到 Word 里人工写分析结论一个批次的 30-50 个债务人一个项目经理要干 2-3 周这个流程有两个核心痛点信息搜集极其繁琐每个债务人有 5-10 个数据维度每个维度都需要在不同网站上查询、记录分析依赖经验判断关联关系、识别风险信号、评估回收价值高度依赖资深项目经理的个人经验观澜这个项目的目标很明确用 AI 自动化掉这个流程。二、技术架构不追新只求稳![系统架构]┌─────────────────────────────────────────────────────────────┐ │ Vue 3 TypeScript SPA │ │ Element Plus ECharts │ └──────────────────────┬──────────────────────────────────────┘ │ REST API ┌──────────────────────▼──────────────────────────────────────┐ │ FastAPI (Python) │ │ JWT Auth / SQLAlchemy / Pydantic v2 │ └──────┬───────────────────────────────────┬──────────────────┘ │ │ ┌──────▼──────┐ ┌───────▼──────────────────┐ │ MySQL 8 │ │ Celery Worker │ │ (业务数据) │ │ (异步任务流水线) │ └─────────────┘ └───────┬──────────────────┘ │ ┌──────────────┐ ┌───────▼──────────────────┐ │ Redis 7 │◄─────────────────┤ Dify LLM Orchestration │ │ (缓存/MQ) │ │ DeepSeek-V3 / Qwen-Max │ └──────────────┘ └──────────────────────────┘技术上我没有选择最时髦的方案而是做了务实的权衡层选型为什么前端Vue 3 Element Plus团队最熟表单/表格/对话框开箱即用后端FastAPIPython 异步生态最成熟的选择自动生成 OpenAPI 文档数据库MySQL 8.0业务数据 ACID 要求关系复杂没必要上 PG缓存/MQRedis 7同时做缓存和 Celery Broker减少运维组件异步任务Celery尽调是长时间运行的批处理任务必须异步LLM 编排Dify可视化编排 3 个并行的 LLM 节点降低 prompt 维护成本LLMDeepSeek-V3中文语义理解强性价比极高容器化部署全项目用 Docker Compose 编排了 6 个服务services:mysql# 业务数据库redis# 缓存 Celery Broker Session 存储backend# FastAPI 应用服务器backend-worker# Celery 异步工作节点frontend# Nginx 托管 Vue SPA没有上 k8s——项目初期一台机器 Docker Compose 足够。Elasticsearch 和 MinIO 排在了 P1等用户量上来再加。三、核心流程两阶段流水线整个尽调流程分为两个阶段由 Celery 编排上传债务人列表 (Excel/CSV) │ ▼ ┌───────────────────┐ │ 第一阶段数据采集 │ ← 串行执行带限速和反爬 │ GSXT 公开数据 │ │ Mock 降级 │ └─────────┬─────────┘ ▼ ┌───────────────────┐ │ 第二阶段AI 分析 │ ← Dify 工作流3 个 LLM 并 │ 关联关系穿透 │ 行执行 │ 风险识别与打标 │ │ 还款能力评估 │ └─────────┬─────────┘ ▼ ┌───────────────────┐ │ 报告生成 │ │ PDF (WeasyPrint) │ │ ZIP 批量打包 │ └───────────────────┘数据采集优雅降级策略GSXT 是核心数据源但它有严格的反爬机制。我们的策略不是死磕而是优雅降级流程 1. 查 Redis 缓存 (24h 过期) 2. 未命中 → 请求 GSXT 3. 请求成功 → 解析 HTML (三层降级解析) 4. 请求失败 (验证码/403/超时) → Mock 数据生成Mock 数据生成是一个有意思的设计——它不是随机造假而是确定性生成importhashlibdefgenerate_mock_data(company_name:str):seedhashlib.md5(company_name.encode()).hexdigest()random.seed(seed)# ... 用种子生成注册资本、涉诉数量、股东结构等# 同样的公司名始终得到同样的 Mock 数据这样保证了AI 分析管道永远有输入数据不会因为数据源不可用而中断测试时可复现按公司名就能得到确定的结果每个债权人都看起来像个真实企业AI 分析三条并行的 LLM 推理线在 Dify 工作流中三个 LLM 节点并行执行┌──────────────────────────┐ │ Hidden Relation │ │ Penetration │ │ DeepSeek-V3 temp0.3 │ │ 隐藏关联关系穿透 │ └──────────┬───────────────┘ │ 输入数据 ────────────────────┼─────────┬─────────┐ │ │ │ ┌──────────▼──┐ ┌──▼────────┐ │ │ Risk Tagging │ │ Repayment │ │ │ DeepSeek-V3 │ │ Capacity │ │ │ temp0.2 │ │ DeepSeek │ │ │ 风险标签 │ │ 还款能力 │ │ └──────────┬──┘ └──┬────────┘ │ │ │ │ └─────────┴─────────┘ │ ▼ ┌──────────────────┐ │ Jinja2 Merger │ │ 统一报告格式 │ └──────────────────┘1. 关联关系穿透温度 0.3分析股东树、人员交叉任职、投资链条识别隐形控制人、代持、循环担保。这是法律尽调中最耗脑力的部分。2. 风险语义理解与打标温度 0.2将企业经营状态、司法涉诉等数据转化为标准化的风险标签三级风险等级红/黄/绿覆盖 16 种风险类型。3. 还款能力评估温度 0.2多维度评估——经营状况、资产质量、负债水平、现金流、关联方支持、逃废债倾向输出回收等级高/中/低和预估回收金额区间。四、几个值得一说的技术细节4.1 后端异步任务的双模式调度Celery 在 Windows 开发环境下有个老问题——和 FastAPI 的事件循环冲突。我采取的策略是一个核心函数两种调度方式# 核心业务逻辑纯异步asyncdefrun_due_diligence_task(...):# ... 与事件循环无关的业务代码# Celery 包装生产环境celery_app.task(bindTrue,max_retries3)defprocess_due_diligence_task(self,...):asyncio.run(run_due_diligence_task(...))# 开发环境直接调用ifconfig.CELERY_TASK_ALWAYS_EAGER:asyncio.create_task(run_due_diligence_task(...))else:process_due_diligence_task.delay(...)通过CELERY_TASK_ALWAYS_EAGER这个开关开发时直接用create_task生产用 Celery 调度一套代码两套部署模式。4.2 Token 黑名单的自动过期JWT 登出后 token 仍然有效直到过期这是 JWT 的固有问题。通用的做法是维护一个黑名单但需要定时清理。用 Redis 的 TTL 特性这个问题的解法变得很优雅asyncdeflogout(token:str):# 解析 token 获取 jti 和剩余过期时间payloaddecode_token(token)jtipayload.get(jti)exppayload.get(exp)remainingexp-time.time()# 写入黑名单自动过期awaitredis.setex(ftoken_blacklist:{jti},remaining,1)不需要定时任务不需要手动清理Redis 在 TTL 归零后自动删 key。这个模式的寓意是——让基础设施为你做运维。4.3 GSXT 反爬对策如果说整个系统中有什么地方最像工程实践而非业务开发就是这个 GSXT 客户端的实现了8 个 User-Agent 轮换覆盖 Chrome/Firefox/Edge/SafariWindows/macOS 全平台请求抖动每次请求间隔0.8s ± 40%随机化Token 桶限速每分钟最多 20 次请求验证码检测响应体中关键词匹配命中则立即切换策略三层 HTML 解析回退dl/dt/dd结构 → 表格行解析 → 正则提取4.4 LLM 输出的鲁棒性处理LLM 的输出天然不稳定。我必须在生产环境中处理这些情况defsanitize_llm_output(raw_text:str)-dict:# 1. 替换 Python 布尔值textre.sub(r\bTrue\b,true,raw_text)textre.sub(r\bFalse\b,false,text)textre.sub(r\bNone\b,null,text)# 2. 剥离 Markdown 代码块标记textre.sub(r(?:json)?,,text)# 3. 尝试 JSON 解析try:returnjson.loads(text)exceptjson.JSONDecodeError:# 4. 实在解析失败返回原始文本return{raw_output:raw_text}核心原则LLM 会犯错pipeline 不能崩溃。无论 LLM 输出的质量如何管道都要能走完。质量问题是 AI 调优的事情系统可用性是工程的事情。五、为什么选 DeepSeek-V3 而不是 GPT-4这是一个经常被问到的问题。理由很简单中文语义理解在处理企业名称、法律文书、经营异常信息时DeepSeek 的中文语料覆盖远好于 GPT-4性价比价格大约是 GPT-4 的 1/20一次尽调任务可能要调用 50-100 次 LLM成本差距是数量级的数据合规金融行业的数据合规要求严格通过 Dify 可以灵活切换模型未来可以无缝迁移到私有化部署的 Qwen-Max效果足够在结构化分析和文本分类场景上DeepSeek-V3 与 GPT-4 的差距微乎其微六、教训与反思6.1 过早抽象 过度设计最初的 collector 模块我设计了一个完整的策略模式Strategy Pattern每种数据源一个实现类。最后发现——GSXT 占了 95% 的数据采集量其他数据源只有 5%。抽象了 6 个接口实际只用到 1 个。教训等你有第二个实现的时候再抽象。6.2 WeasyPrint 的 Windows 兼容性WeasyPrint 在 Linux 上运行良好但在 Windows 上需要 GTK3 运行时。这个坑在开发初期就发现了解决方式是惰性加载# 不在导入时加载在调用时加载defgenerate_pdf(...):fromweasyprintimportHTML# 延迟导入HTML(stringhtml).write_pdf(target)这样即使开发机上没有 GTK3FastAPI 也能正常启动不影响其他功能开发。6.3 Redis 多 DB 的隔离策略一个 Redis 实例承担了三个职责通过 DB 编号隔离DB用途策略0Celery Broker无需持久化1业务缓存 (GSXT 数据)24h TTL LRU2Token 黑名单按 TTL 自动过期没有引入额外的消息队列减少了运维复杂度。Redis 7 的单实例性能在这个量级上完全够用。6.4 对国内网络环境的适应Dify Plugin Daemon 的 Docker 镜像在 Docker Hub 上国内拉取经常超时。解决方案——注释掉用 Dify Cloud API 替代。这个决定是在第一次docker-compose up失败后 10 分钟做出的。在国内做开源基础设施开发先确认所有依赖能不能拉下来。七、写在最后“观澜这个项目目前还处于 MVP 阶段的尾声。从我的角度看这个项目的价值不在于技术有多新”而在于把一个非常传统的业务场景用 AI 重新做了一遍。不良资产行业的信息化程度整体偏低很多项目经理还在用 Excel 微信来管理尽调流程。AI 的落地机会不在于取代人而在于把专业人员的精力从信息搬运工中解放出来让他们专注于真正需要判断力的事情——比如怎么设计处置方案、怎么和债务人谈判。如果你对这个项目感兴趣或者你在做类似的 AI 传统行业落地的尝试欢迎交流。项目上线http://118.178.232.83

相关新闻

STM32与TC78H651AFNG直流电机驱动方案设计与优化

STM32与TC78H651AFNG直流电机驱动方案设计与优化

1. 项目背景与核心器件选型在工业自动化和消费电子领域,直流有刷电机因其结构简单、控制方便、成本低廉等优势,仍然是许多应用场景的首选驱动方案。然而,传统驱动方案在效率、集成度和智能化方面存在明显短板。这正是我们选择TC78H651AFNG与S…

2026/7/7 18:09:54阅读更多 →
企业微信API二次开发:百万级私域客户同步,你的架构扛得住吗?

企业微信API二次开发:百万级私域客户同步,你的架构扛得住吗?

在企业数字化转型的浪潮中,企业微信早已从单纯的内部协同OA工具,进化为连接亿万消费者的超级SCRM(社会化客户关系管理)平台。许多开发者在完成了内部通讯录同步和简单的消息推送后,往往会带着一种“我已经精通企业微信…

2026/7/7 18:09:54阅读更多 →
Hermes0.17与DeepSeek集成实战:AI智能体开发避坑指南

Hermes0.17与DeepSeek集成实战:AI智能体开发避坑指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 Hermes0.17与DeepSeek集成实战:为什么我不推荐DeepSeek作为主脑 最近在AI智能体开发领域,Hermes0.17与DeepSe…

2026/7/7 18:09:54阅读更多 →
DeepEval实战指南:3步构建AI文本一致性检测系统

DeepEval实战指南:3步构建AI文本一致性检测系统

DeepEval实战指南:3步构建AI文本一致性检测系统 【免费下载链接】deepeval The LLM Evaluation Framework 项目地址: https://gitcode.com/GitHub_Trending/de/deepeval 当你的AI助手自信满满地告诉你"Python 3.8于2020年发布",而实际发…

2026/7/7 19:04:59阅读更多 →
AutoMem:把 Agent Memory 变成可训练的记忆管理技能

AutoMem:把 Agent Memory 变成可训练的记忆管理技能

很多 Agent 该配的都配了:RAG、向量库、summary buffer,甚至把中间结果写进文件。可任务一长,还是会跑偏。问题大概率不出在“有没有地方存东西”,而是这些信息根本没被管理好。长任务会不断冒出新线索、新状态、新经验&#xff0…

2026/7/7 19:04:59阅读更多 →
kml_adapter:华为鲲鹏数学库适配器完全指南,解锁高性能计算新境界 [特殊字符]

kml_adapter:华为鲲鹏数学库适配器完全指南,解锁高性能计算新境界 [特殊字符]

kml_adapter:华为鲲鹏数学库适配器完全指南,解锁高性能计算新境界 🚀 【免费下载链接】kml_adapter Adapter for Kunpeng Math Library 项目地址: https://gitcode.com/openeuler/kml_adapter 前往项目官网免费下载:https:…

2026/7/7 19:04:59阅读更多 →
安全工程师必备:集成OA解密、内存马检测与AI分析的应急响应工具箱

安全工程师必备:集成OA解密、内存马检测与AI分析的应急响应工具箱

1. 项目概述:一个安全从业者的“瑞士军刀”最近在整理自己的工具箱,发现很多工具都是零散的,处理一个复杂的攻击事件,经常要在十几个窗口和命令行之间来回切换,效率低下不说,还容易遗漏关键信息。相信很多一…

2026/7/7 19:04:59阅读更多 →
kbox新手入门:3分钟学会收集openEuler系统崩溃日志

kbox新手入门:3分钟学会收集openEuler系统崩溃日志

kbox新手入门:3分钟学会收集openEuler系统崩溃日志 【免费下载链接】kbox the crash message collector for openEuler 项目地址: https://gitcode.com/openeuler/kbox 前往项目官网免费下载:https://ar.openeuler.org/ar/ kbox是openEuler系统的…

2026/7/7 19:04:58阅读更多 →
小龙虾技能-13-multimedia-03_PodcastSummarizer_播客总结

小龙虾技能-13-multimedia-03_PodcastSummarizer_播客总结

多媒体娱乐 | Podcast-summarizer 播客智能总结 Skill 完全指南 Skill 名称:Podcast-summarizer 核心定位:播客音频智能转录与结构化总结 下载量:5.4K 适用场景:播客内容整理、会议录音回顾、多语言字幕翻译、知识笔记沉淀 文章标签:小龙虾智能体、小龙虾技能、智能工具、…

2026/7/7 18:59:58阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/7 4:43:43阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/7 2:56:31阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/7 1:03:28阅读更多 →
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8…

2026/7/7 0:02:41阅读更多 →
国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot) 🌐 演示地址:http://ruoyioffice.com | 📦 源码1GitHub:ruoyi-office | 📦 源码2GitCode:ruoyi-o…

2026/7/7 0:02:41阅读更多 →
CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS SSH连接故障排查:从基础检查到深度修复的完整指南引言当你尝试通过Xshell或其他SSH客户端连接CentOS服务器时,突然遭遇"Connection refused"或"Connection timed out"的错误提示,这种经历对任何运维人员或开发者来…

2026/7/7 0:02:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/7 5:11:21阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/7 5:11:21阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/7 5:11:21阅读更多 →