Skip to content

LLM 处理模块

LLM 处理模块是 DocuSnap-Backend 系统的核心智能组件,负责文本分析和信息提取。该模块与智谱 AI 的大语言模型服务交互,通过精心设计的提示工程,实现对文档内容的深度理解和结构化处理。

模块职责

LLM 处理模块的主要职责包括:

  1. 提示构建:根据任务类型和 OCR 结果构建适当的提示(Prompt)
  2. LLM API 调用:与智谱 AI 的 LLM 服务交互,发送提示并接收响应
  3. 响应解析:解析 LLM 返回的响应,提取有用信息
  4. 结果结构化:将 LLM 分析结果转换为结构化数据格式
  5. 错误处理:处理 LLM 调用过程中的错误和异常情况

核心组件

1. 提示构建器

提示构建器负责根据任务类型和 OCR 结果构建适当的提示,引导 LLM 进行准确的文本分析和信息提取。系统为不同类型的任务(文档处理、表单处理、表单填充)设计了专门的提示模板。

代码示例

def build_document_prompt(ocr_text):
    """构建文档处理的提示"""
    # 从 prompts.py 获取文档处理提示模板
    prompt_template = DOCUMENT_PROMPT_TEMPLATE

    # 将 OCR 文本插入提示模板
    prompt = prompt_template.format(document_text='\n'.join(ocr_text))

    return prompt

def build_form_prompt(ocr_text):
    """构建表单处理的提示"""
    # 从 prompts.py 获取表单处理提示模板
    prompt_template = FORM_PROMPT_TEMPLATE

    # 将 OCR 文本插入提示模板
    prompt = prompt_template.format(form_text='\n'.join(ocr_text))

    return prompt

def build_form_filling_prompt(ocr_text, user_data):
    """构建表单填充的提示"""
    # 从 prompts.py 获取表单填充提示模板
    prompt_template = FORM_FILLING_PROMPT_TEMPLATE

    # 将 OCR 文本和用户数据插入提示模板
    prompt = prompt_template.format(
        form_text='\n'.join(ocr_text),
        user_data=json.dumps(user_data, ensure_ascii=False)
    )

    return prompt

2. LLM API 客户端

LLM API 客户端负责与智谱 AI 的 LLM 服务交互,发送提示并接收响应。系统使用 zhipuai 库调用智谱 AI 的 API。

代码示例

def call_llm_api(prompt, max_tokens=4096):
    """调用 LLM API 处理提示"""
    try:
        # 调用智谱 AI 的 API
        response = zhipuai.model_api.invoke(
            model="chatglm_pro",
            prompt=prompt,
            temperature=0.7,
            max_tokens=max_tokens
        )

        # 检查响应状态
        if response['code'] == 200:
            return response['data']['choices'][0]['content']
        else:
            raise Exception(f"LLM API 调用失败: {response['msg']}")
    except Exception as e:
        raise Exception(f"LLM API 调用异常: {str(e)}")

3. 响应解析器

响应解析器负责解析 LLM 返回的响应,提取有用信息,并处理可能的格式问题。

代码示例

def parse_document_result(llm_response):
    """解析文档处理的 LLM 响应"""
    try:
        # 尝试解析 JSON 格式的响应
        if llm_response.strip().startswith('{') and llm_response.strip().endswith('}'):
            return json.loads(llm_response)

        # 尝试提取 JSON 部分
        json_match = re.search(r'```json\s*([\s\S]*?)\s*```', llm_response)
        if json_match:
            json_str = json_match.group(1)
            return json.loads(json_str)

        # 如果无法解析为 JSON,返回原始文本
        return {"text": llm_response, "parsed": False}
    except Exception as e:
        # 解析失败,返回错误信息和原始响应
        return {
            "error": f"解析失败: {str(e)}",
            "raw_response": llm_response,
            "parsed": False
        }

def parse_form_result(llm_response):
    """解析表单处理的 LLM 响应"""
    # 类似于 parse_document_result,但针对表单结果
    # ...

def parse_form_filling_result(llm_response):
    """解析表单填充的 LLM 响应"""
    # 类似于 parse_document_result,但针对表单填充结果
    # ...

4. 结果格式化器

结果格式化器负责将解析后的 LLM 响应转换为系统需要的结构化数据格式,确保输出一致性。

代码示例

def format_document_result(parsed_result):
    """格式化文档处理结果"""
    # 确保结果包含必要的字段
    result = {
        "title": parsed_result.get("title", "未知标题"),
        "content": parsed_result.get("content", {}),
        "metadata": {
            "processed_at": int(time.time()),
            "source": "document_processing"
        }
    }

    return result

def format_form_result(parsed_result):
    """格式化表单处理结果"""
    # 类似于 format_document_result,但针对表单结果
    # ...

def format_form_filling_result(parsed_result):
    """格式化表单填充结果"""
    # 类似于 format_document_result,但针对表单填充结果
    # ...

提示工程

LLM 处理模块的核心是提示工程(Prompt Engineering),通过精心设计的提示模板引导 LLM 进行准确的文本分析和信息提取。系统为三种主要任务类型设计了专门的提示模板:

1. 文档处理提示

文档处理提示引导 LLM 分析文档内容,识别标题、段落、列表等结构,并提取关键信息。

提示模板示例

你是一个专业的文档分析助手。请分析以下文档内容,提取关键信息并按照指定格式输出。

文档内容:
{document_text}

请提供以下信息:
1. 文档标题
2. 文档类型(如:报告、合同、通知等)
3. 主要内容摘要
4. 关键日期和数字
5. 重要人名和机构

请以JSON格式输出结果,包含以下字段:
- title: 文档标题
- document_type: 文档类型
- summary: 内容摘要(100-200字)
- key_dates: 关键日期列表,每项包含date(日期)和context(上下文)
- key_figures: 关键数字列表,每项包含figure(数字)和context(上下文)
- key_entities: 重要人名和机构列表,每项包含name(名称)和role(角色)

2. 表单处理提示

表单处理提示引导 LLM 识别表单结构,提取字段名称和对应的值。

提示模板示例

你是一个专业的表单分析助手。请分析以下表单内容,提取所有字段及其值。

表单内容:
{form_text}

请执行以下任务:
1. 识别表单的类型和标题
2. 提取所有字段名称和对应的值
3. 对字段进行分类(个人信息、联系方式、其他信息等)

请以JSON格式输出结果,包含以下字段:
- form_title: 表单标题
- form_type: 表单类型
- fields: 字段列表,每个字段包含:
  - name: 字段名称
  - value: 字段值
  - category: 字段类别
- metadata: 表单元数据,包含表单ID、日期等信息(如果有)

3. 表单填充提示

表单填充提示引导 LLM 将用户提供的信息与表单字段匹配,生成填充后的表单数据。

提示模板示例

你是一个专业的表单填充助手。请根据用户提供的信息,填充以下表单。

表单内容:
{form_text}

用户信息:
{user_data}

请执行以下任务:
1. 分析表单结构,识别所有需要填写的字段
2. 将用户提供的信息与表单字段进行匹配
3. 对于缺失的必填字段,标记为"缺失"
4. 对于可以推断的字段,尝试合理推断

请以JSON格式输出结果,包含以下字段:
- form_title: 表单标题
- filled_fields: 已填充的字段列表,每个字段包含:
  - name: 字段名称
  - value: 填充的值
  - source: 值的来源("user_provided", "inferred", "default")
- missing_fields: 缺失的必填字段列表
- complete: 表单是否完整填写(布尔值)

工作流程

LLM 处理模块的工作流程如下:

  1. 接收输入
  2. 从任务处理模块接收 OCR 处理后的文本
  3. 根据任务类型确定处理策略

  4. 构建提示

  5. 选择适当的提示模板
  6. 将 OCR 文本插入提示模板
  7. 添加任务特定的指令和格式要求

  8. 调用 LLM API

  9. 发送提示到智谱 AI 的 LLM 服务
  10. 设置适当的参数(温度、最大令牌数等)
  11. 接收 LLM 的响应

  12. 解析响应

  13. 解析 LLM 返回的文本
  14. 提取 JSON 或其他结构化数据
  15. 处理可能的格式问题

  16. 格式化结果

  17. 将解析后的结果转换为标准格式
  18. 确保输出一致性
  19. 添加元数据和处理信息

  20. 返回结果

  21. 将格式化后的结果返回给任务处理模块
  22. 处理和报告任何错误

与 LLM 服务的集成

DocuSnap-Backend 使用智谱 AI 的 LLM 服务进行文本分析和信息提取。选择智谱 AI 的主要原因包括:

  1. 中文处理能力:智谱 AI 的模型对中文有较好的优化,适合处理中文文档和表单
  2. 结构化输出能力:支持生成结构化的 JSON 输出,适合提取表单字段和值
  3. API 接口和集成便利性:提供简洁易用的 API 接口和 Python SDK

集成方式是通过 zhipuai 库调用智谱 AI 的 API,发送提示并接收响应。

错误处理

LLM 处理模块实现了全面的错误处理机制:

  1. API 调用错误:处理 LLM 服务不可用或响应错误的情况
  2. 响应解析错误:处理 LLM 响应格式不符合预期的情况
  3. 超时处理:处理 LLM 服务响应超时的情况
  4. 结果验证:验证 LLM 结果是否符合预期格式和内容要求

模块接口

LLM 处理模块提供以下主要接口:

  1. 对外接口
  2. process_with_llm:使用 LLM 处理文本并返回结果

  3. 对内接口

  4. build_document_prompt:构建文档处理提示
  5. build_form_prompt:构建表单处理提示
  6. build_form_filling_prompt:构建表单填充提示
  7. call_llm_api:调用 LLM API
  8. parse_document_result:解析文档处理结果
  9. parse_form_result:解析表单处理结果
  10. parse_form_filling_result:解析表单填充结果

性能优化

LLM 处理模块的性能优化措施包括:

  1. 提示优化:精心设计提示模板,减少不必要的令牌消耗
  2. 参数调优:根据任务需求调整 LLM 调用参数(温度、最大令牌数等)
  3. 响应缓存:通过任务处理模块的缓存机制,避免重复调用 LLM API
  4. 错误重试:对临时性错误实现自动重试机制

扩展性

LLM 处理模块的扩展性体现在:

  1. 支持多种 LLM 服务:设计支持未来集成其他 LLM 服务
  2. 可扩展的提示模板:可以轻松添加和修改提示模板,支持新的任务类型
  3. 结果后处理扩展:可以添加更多结果验证和优化功能
  4. 提示策略优化:可以实现更复杂的提示策略,如多轮对话或链式思考

通过这些设计和实现,LLM 处理模块为 DocuSnap-Backend 系统提供了强大的文本分析和信息提取能力,是系统智能处理文档和表单的核心组件。