我们的开发团队常收到两类需求:

内部:快速了解合作方的行政处罚、司法诉讼、经营异常等风险

    外部:给客户演示企业数据 API 的价值,不能只丢一堆 JSON

    传统做法是手工把 JSON 整理成 Word/Excel 报告,重复枯燥还容易漏重点。
    大模型擅长文本生成,我们想用它来撰写报告初稿,但必须保证事实准确、可追溯、不编造。

    经过几轮迭代,我们总结出一套“结构化 API + 模板约束 + 事实核验”的可靠方案,分享给大家:调用企业风险数据 API,再让大模型将结构化数据辅助生成自然语言版的尽调报告草稿。代码量不大,但如果能避开几个常见的坑,效果会安全且实用。

    一、背景与核心风险

    如果直接用 LLM 自动写报告,会遇到两个问题:

    数据隐私/合规:企业行政处罚、被执行人信息等敏感数据,不能明文发给公有云大模型(违反《数据安全法》及 API 使用条款)。

      模型幻觉:LLM 会编造不存在的日期、金额。例如输入只有“立案金额 120 万,法院杭州西湖”,模型可能自行加上“2024 年立案”——这在风控中是不可接受的。

      所以,我们的方案必须:脱敏或本地化部署 + 强制可追溯 + 事后校验。

      二、安全合规的整体思路

      流程依然是三步,但每步都加了安全护栏:

      1.调用企业风险 API 获取原始数据(行政处罚、司法信息、经营异常等)。

        2.对敏感数据脱敏或采用本地模型(绝不能将原始企业风险数据直接发送给公有云大模型,除非已获授权且数据不包含个人信息/商业秘密)。

          让 LLM 按固定模板填充内容,并要求每个结论附带原始数据路径,最后用代码比对关键数值(如金额、日期)是否被篡改。

          重要合规提醒:企业行政处罚、被执行人信息等属于敏感数据。如果使用云端 LLM(DeepSeek/GPT/Claude),请务必:

          • 得数据所有方(或 API 供应商)的明确书面许可
          • 对数据进行脱敏(例如金额取整、日期模糊、公司名替换)
          • 或者改用本地部署的开源模型(如 Llama 3、Qwen)

            本文示例仅用于技术演示,实际生产环境请先咨询法务。

            三、核心代码(精简版)

            python
            import os, json, requests, re
            from openai import OpenAI
            
            # 1. 获取并脱敏数据
            risk_data = fetch_risk_data(COMPANY_ID)   # 省略具体 API 调用
            def anonymize(data):
                # 金额抹去精确值,法院只留前两个字
                ...
            risk_data = anonymize(risk_data)
            
            # 2. 构造 Prompt(强制带路径)
            system_prompt = """你是一个报告助理。根据给定数据,按以下模板输出:
            ## 风险事实(仅罗列,不做评级)
            - {风险类型}:原始路径 `$.xxx`,关键信息 [[原样数值]]
            ## 分析(每点必须带路径)
            ## 建议
            禁止编造任何数据中没有的内容。金额、日期必须用 [[ ]] 标记。
            """
            
            # 3. 调用 LLM(建议用本地模型)
            client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
            response = client.chat.completions.create(
                model="llama3",
                messages=[{"role": "user", "content": user_prompt}],
                temperature=0.1
            )
            report_draft = response.choices[0].message.content
            
            # 4. 事实核验:提取所有 [[...]] 并与原始数据比对
            claims = re.findall(r'\[\[(.*?)\]\]', report_draft)
            if not all(str(value) in json.dumps(risk_data) for value in claims):
                print("❌ 发现幻觉,请人工复核")

            四、安全输出示例

            输入数据(简化):
            
            json
            
            {"被执行人": [{"立案金额": 1200000, "法院": "杭州市西湖区人民法院"}], "经营异常": []}
            
            
            
            模型输出(合规版):
            
            text
            
            ## 风险事实
            
            - 被执行人:原始路径 `$.executed[0]`,立案金额 [[1200000]],法院 [[杭州市西湖区人民法院]]。
            
            - 经营异常:未发现。
            
            
            
            ## 分析
            
            被执行人金额较大(路径 `$.executed[0].立案金额`),需关注。
            
            
            
            ## 建议
            
            要求提供该案件的履行证明。

            对比修改前:模型不再编造“2024年立案”,金额、日期均原样引用,并提供了可追溯的 JSONPath。风险评级被移除,改由人工或专业规则判断。

            如果想彻底杜绝 LLM 篡改关键字段,还可以采用 模板填空 + 仅让 LLM 做分类/总结的方式。

            六、总结

            总结一下这套方法的关键要点:

            关键点

            说明

            数据合规优先

            敏感数据绝不裸传给云端 LLM,优先私有化或脱敏

            强制可追溯

            每个结论都要带原始数据路径,方便人工复核

            拒绝直接评级

            风险评级涉及业务逻辑,不要让 LLM 主观判断

            事后核验

            用正则或代码比对模型输出的数值是否与原始一致

            低 temperature

            设为 0.1~0.2,减少创造性

            实际落地时,我们对一批企业批量生成草稿报告,再由风控人员快速确认关键数据路径。效率提升约 3 倍,且没有出现一例事实错误(因为模型不允许自由编造)。

            如果你也在尝试类似应用,强烈建议先从模板填空开始,而不是直接让 LLM 写自由文本。信任,但验证,在企业风控领域尤其重要。

            最后再强调一下,实际使用的时候,要遵守数据保护法规,并加入人工复核环节。

            Logo

            脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

            更多推荐