Langchain-Chatchat能否支持文档签章识别?

在企业智能化转型的浪潮中,合同、公文、法律文书等非结构化文档的自动化处理成为提升效率的关键环节。越来越多的团队开始尝试使用如 Langchain-Chatchat 这类基于大语言模型(LLM)的知识库系统,来实现私有文档的智能问答。然而,一个现实问题逐渐浮现:当用户问出“这份合同有没有盖章?”、“签名是否在第5页右下角?”时,这套系统还能应对吗?

这背后其实是一个更深层的技术命题——我们习以为常的文本问答系统,是否能跨越模态边界,理解文档中的视觉元素?尤其是像签章这样对业务合规性至关重要的信息。

文本问答 vs 视觉感知:两条不同的技术路径

Langchain-Chatchat 的核心能力非常明确:它是一个专注于文本语义理解的本地化知识库问答系统。它的设计初衷是将企业内部的 PDF、Word 等文档转化为可检索的向量数据库,再通过大语言模型生成自然语言回答。整个流程建立在一个关键前提之上:文档的价值在于其可读文本内容

以一份扫描版合同为例,系统会调用 PyPDF2pdfplumber 提取其中的文字。但如果公章是以图片形式嵌入的红章、手写签名区域,或者电子签章仅作为元数据存在而未渲染为可见图像——这些信息在标准解析流程中会被彻底忽略。

from langchain.document_loaders import PyPDFLoader

loader = PyPDFLoader("contract_with_seal.pdf")
pages = loader.load_and_split()
print(pages[0].page_content)

上述代码运行后输出的只是纯文本段落,哪怕原文件上有醒目的红色印章,在 page_content 中也不会留下任何痕迹。这不是 bug,而是 feature —— 因为这个模块的目标就是“读文字”,而不是“看图”。

这也意味着,对于以下问题:

  • “该文件是否已签署?”
  • “法人代表的签名位置在哪里?”
  • “是否有公司公章?出现在哪几页?”

Langchain-Chatchat 无法直接作答。不是因为它“不够聪明”,而是因为这些问题的答案根本不在文本流里,而在图像像素或文件元数据中。

签章识别的本质:一场计算机视觉的较量

与文本问答不同,签章识别本质上属于计算机视觉(CV)任务,依赖的是完全不同的技术栈。典型的签章检测流程需要经历以下几个阶段:

  1. 图像提取:将 PDF 每一页转换为高分辨率图像(如 PNG/JPEG),确保视觉细节保留;
  2. 颜色空间分析:利用 HSV 阈值分割,突出红色印章区域(中国公章多为红色);
  3. 形态学操作:去噪、闭合边缘、提取连通域;
  4. 目标检测:使用 OpenCV 轮廓检测或深度学习模型(如 YOLOv8、PP-YOLOE)定位签章区域;
  5. OCR 辅助识别:对签章内部文字进行 OCR,识别单位名称、编号等;
  6. 结构化输出:返回坐标、类型、置信度等结果。

下面是一段典型的签章检测代码示例:

import cv2
import numpy as np

def detect_red_seal(image_path):
    img = cv2.imread(image_path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 定义红色范围(HSV)
    lower_red1 = np.array([0, 120, 70])
    upper_red1 = np.array([10, 255, 255])
    lower_red2 = np.array([170, 120, 70])
    upper_red2 = np.array([180, 255, 255])

    mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
    mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
    mask = mask1 + mask2

    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    seals = []
    for cnt in contours:
        if cv2.contourArea(cnt) > 500:
            x, y, w, h = cv2.boundingRect(cnt)
            seals.append({"x": x, "y": y, "width": w, "height": h, "page": 1})

    return seals

这类方法适用于扫描件,但对原生 PDF(无图像层)或数字签名无效。更重要的是,这种处理方式和 Langchain-Chatchat 的工作流毫无交集——一个走图像通道,一个走文本通道,两者如同平行宇宙。

架构对比:它们真的在说同一种语言吗?

维度 Langchain-Chatchat 签章识别系统
输入数据 可编辑/可复制文本 图像像素或 PDF 图层
处理单元 字符、词、句子 像素、轮廓、颜色分布
特征表示 文本嵌入向量(e.g., BGE-zh) CNN 特征图 / 目标框
核心模型 LLM(如 Qwen、ChatGLM) CV 模型(如 YOLO、CRNN)
输出形式 自然语言回答 JSON 结构:位置、类别、文本
部署要求 支持全离线文本处理 需 GPU 加速图像推理

从这张表可以看出,两者的差异不仅是功能层面的,更是范式级的根本分歧。试图让 Langchain-Chatchat 直接“看见”签章,就像要求一位盲人画家描述夕阳的颜色——工具不对,努力白费。

如何破局?构建融合型文档智能平台

虽然 Langchain-Chatchat 本身不支持签章识别,但这并不意味着我们不能实现相关功能。关键在于转变思路:不要强求单一系统完成所有任务,而是构建分层协作的智能文档处理流水线

推荐方案一:前置视觉分析 + 元数据注入

最实用且工程可控的做法是,在文档进入 Langchain-Chatchat 之前,先经过一个独立的“视觉预处理模块”。该模块负责:

  • 将 PDF 转为图像;
  • 检测签章、签名区域;
  • 提取结构化元数据;
  • 将结果附加到文档描述中。

例如,可以生成如下元数据:

{
  "file": "contract_001.pdf",
  "metadata": {
    "has_seal": true,
    "seal_pages": [3],
    "has_handwritten_signature": true,
    "signatory_position": "last_page_bottom_right",
    "digital_signature_valid": false,
    "status": "pending_approval"
  }
}

然后将这些字段存入外部数据库(如 SQLite、PostgreSQL),或插入文档开头作为隐藏标记:

<!-- SEAL_PAGES: [3]; SIGNATURE_PRESENT: YES -->
甲方:XXX有限公司
...

这样一来,当用户提问“哪些合同已经盖章?”时,系统可以先查询元数据库筛选出符合条件的文件列表,再调用 Langchain-Chatchat 对这些文件的内容进行深入问答。既发挥了各自优势,又避免了系统耦合过重。

方案二:引入多模态大模型(进阶选择)

如果你追求端到端的“看图说话”能力,也可以考虑接入支持图文输入的多模态大模型,如 Qwen-VLPaddleOCR + ERNIE BotMiniGPT-4

这类模型可以直接接收图像和问题,输出自然语言答案。例如:

输入:一张合同截图 + “这里有没有法人签名?”
输出:“有,位于第5页右下角,手写体‘张三’。”

不过需要注意,这类方案通常需要较强的算力支持(至少 16GB GPU 显存),且难以完全本地化部署。此外,准确率高度依赖训练数据质量,对于特殊字体或模糊图像仍可能出现误判。

工程实践建议:解耦优于集成

在实际项目中,我倾向于推荐采用“分层解耦 + 元数据驱动”的设计哲学:

  1. 职责分离
    - 视觉模块专攻图像分析;
    - 文本模块专注语义理解;
    - 业务逻辑层负责协调调度。

  2. 异步处理管道
    文档上传后,启动两个并行任务:
    - 异步转文本 → 构建向量库;
    - 异步转图像 → 检测签章 → 更新元数据库。

  3. 可扩展接口设计
    定义统一的文档元数据 Schema,便于未来扩展人脸识别、表格检测、水印识别等功能。

  4. 监控与反馈机制
    记录签章识别的准确率、误检率,并定期人工复核,形成闭环优化。

总结:认清边界,才能走得更远

回到最初的问题:Langchain-Chatchat 能否支持文档签章识别?

答案很明确:不能原生支持。它不是一个文档视觉理解系统,而是一个文本语义问答引擎。强行改造其解析模块去“看图”,不仅违背设计原则,还会带来维护成本飙升、稳定性下降等问题。

但换个角度看,这恰恰体现了现代 AI 系统设计的智慧——不做全能选手,而是做好专业分工。Langchain-Chatchat 在文本问答领域表现出色,而签章识别应由专业的 CV 工具完成。两者的结合,不是替代,而是协同。

真正有价值的解决方案,不是期待某个开源项目“突然支持”新功能,而是学会如何将多个工具像积木一样组合起来,构建适应复杂业务场景的智能系统。在这个意义上,Langchain-Chatchat 不仅没有局限,反而因其良好的模块化设计,为我们提供了极佳的集成基础。

未来的智能文档处理平台,必然是文本、视觉、结构化数据三位一体的融合体。而今天的每一步探索,都是在为那个更完整的图景铺路。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐