一家小型数字银行的贷款专员对数据团队构建的新模型感到兴奋。它可以根据收入、消费模式和还款历史,在不到一秒的时间内对贷款申请进行评分,并自动批准或拒绝。第一周运行时,它表现得非常出色。第二周,模型提供商在下午时分出现故障。在那段时间内提交的每一份贷款申请都卡住了,一直在等待永远不会到来的响应。有些客户刷新页面并提交了两次。一些本应被直接拒绝的申请最终被批准,因为几个月前有人编写了一个回退路径,并且从未正确测试过,当无法评分时默认批准任何内容。
数据团队在模型本身上没有做错任何事。模型是准确的。缺少的是围绕它的一切——当模型变慢、出错、不可用,或者根本不应该盲目信任它做出如此重大的决定时,决定该发生什么的部分。
真正的问题从来不是模型
当一家银行采用模型来处理贷款审批或欺诈评分等事务时,它实际上并不是遇到了 AI 问题,而是遇到了集成问题。模型是你调用的一个服务,和任何服务一样,它可能变慢、可能失败,也可能自信地犯错。真正重要的问题不是模型是否聪明,而是在模型没有按照大家假设的方式运行时,后端会做什么。
强制执行超时,防止慢速模型冻结整个流程
第一个防护措施是确保对模型的调用永远不会无限期地挂起。如果模型提供商变慢或宕机,请求应该快速失败并回退到安全的默认值,而不是让客户盯着加载屏幕。
import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom, timeout, catchError } from 'rxjs';
@Injectable()
export class LoanScoringService {
constructor(private readonly httpService: HttpService) {}
async scoreApplication(applicationId: string, payload: Record<string, unknown>) {
return firstValueFrom(
this.httpService.post('https://ai-provider.example.com/score', payload).pipe(
timeout(2000),
catchError(() => {
throw new HttpException(
'Scoring service unavailable',
HttpStatus.SERVICE_UNAVAILABLE,
);
}),
),
);
}
}
Enter fullscreen mode Exit fullscreen mode
请注意,这里的回退是一个明确的错误,而不是静默批准。无论接下来发生什么,因为服务调用失败而默认批准贷款,本身从来都不是可接受的行为。
决定对贷款决策而言,故障安全实际意味着什么
一旦捕获到超时或故障,接下来必须发生一些事情。对于如此重要的决策,那件事绝不应该是自动批准。一个合理的故障安全路径是将申请路由到人工审核队列。
async handleScoringFailure(applicationId: string) {
await this.reviewQueueService.enqueue({
applicationId,
reason: 'scoring_service_unavailable',
requiresManualReview: true,
});
return {
status: 'pending_review',
message: 'Your application is being reviewed manually.',
};
}
Enter fullscreen mode Exit fullscreen mode
这让客户得到诚实的告知,并确保技术故障永远不会悄无声息地变成一项没有人真正有意做出的财务决策。
记录每一项决策,以便日后解释
银行最终需要解释为什么批准、拒绝或标记了某个特定客户,有时是几个月后,有时是对监管机构。这意味着每一个评分决策,连同模型的输出和所依据的数据,都需要被记录,而不仅仅是被执行后丢弃。
import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn } from 'typeorm';
@Entity('loan_decisions')
export class LoanDecision {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column()
applicationId: string;
@Column({ type: 'jsonb' })
modelInput: Record<string, unknown>;
@Column({ type: 'jsonb' })
modelOutput: Record<string, unknown>;
@Column()
finalDecision: string;
@Column({ default: false })
requiredManualReview: boolean;
@CreateDateColumn()
createdAt: Date;
}
Enter fullscreen mode Exit fullscreen mode
有了这个,少于一秒钟内做出的决策仍然可以完全重建并在日后解释,这在银行业比在几乎任何其他类型的应用中都重要得多。
为最重要的决策保留人工参与
并非每一个决策都需要人工审核,但那些有真正后果的决策——大额贷款、临界分数、客户对拒绝提出异议——绝不应该仅由模型最终决定。NestJS 为你提供了一个干净的地方来强制执行这个关卡,根据银行实际同意的规则,而不是模型碰巧输出的内容,进行检查,将某些结果路由到审核队列,而不是直接返回给客户。
更大的图景
NestJS 不会让 AI 模型更准确,它也永远不应该尝试这样做。它为你提供的是围绕模型的结构——一个强制执行超时的地方,一个决定故障安全实际含义的地方,一个记录每一个决策以便日后解释的地方,以及一个坚持由人工审核值得审核的决策的地方。这种结构才是真正让 AI 模型安全到足以用于批准贷款这样重要事情的东西。
如果你的团队正在将 AI 引入一个涉及真实资金或真实客户的过程中,我很乐意讨论如何正确构建围绕它的防护措施。
我是 Peace Melodi,一名后端软件工程师。如果你希望你的业务大规模扩展,舒适地处理数百万用户而不出错,并具备强大的可扩展性和安全性,请随时联系。
LinkedIn: https://www.linkedin.com/in/melodi-peace-406494368
GitHub: https://github.com/PeaceMelodi
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.