shcherbak-ai/contextgem

Extract structured data and insights from documents using LLMs and decision models

ContextGem – 使用 LLM 和决策模型从文档中进行结构化提取

它是什么 – 一个开源的 Python 库,让您可以从任何文本(或包含图像的)文档中提取结构化事实。您用自然语言描述想要什么(方面和概念),ContextGem 会构建提示词、调用适当的模型、验证类型化输出,并返回每个事实及其来源的确切段落或句子,以及可选的论证。

为什么重要 – 传统的 LLM 管道要求您手工制作提示词、编写验证代码,并手动将答案映射回其来源。ContextGem 将所有这些打包成一个声明式管道,您可以重用和序列化。它还支持决策模型 – 快速、低成本的分类器,回答封闭式问题类型(是/否、标签、评分)并返回概率,让您将推理密集型的 LLM 调用与廉价、高吞吐量的模型混合使用。

主要特性

  • 无需编写提示词 – 编写方面或概念的描述;ContextGem 会生成提示词。
  • 类型化、验证过的输出 – 支持字符串、数字、日期、布尔值、标签、评分和 JSON 对象。
  • 来源追踪 – 每个提取项都包含其来源的段落/句子,并可应要求提供简短论证。
  • 嵌套上下文 – 定义方面(大段)和子方面,然后附加专注于这些部分的概念。
  • 模型路由 – 将开放式提取发送到 LLM(通过 LiteLLM),将封闭式问题提取发送到决策模型(例如,TypeSafe Jev、OpenAI Decisions API)。
  • 概率答案 – 决策模型为每个可能的答案返回概率分布,让您设置阈值。
  • 批量处理 – 读取文档的每个段落(无需检索步骤),可选地使用用户定义的批量大小。

工作原理(高级)

  1. 将您的内容包装在 Document 对象中(纯文本、图像或两者)。
  2. 声明要提取的内容:
    • 方面提取匹配主题的整个段落/句子。
    • 概念从整个文档或特定方面提取类型化值(字符串、数字、布尔值、标签等)。
  3. 运行模型:
    • DocumentLLM 用于基于 LLM 的提取。
    • DocumentDecisionModel 用于决策模型提取。
    • 或者一个模型组,将每个方面/概念路由到适当的模型。
  4. 获取结果 – 返回的 Document 包含 extracted_items,带有值、来源引用、论证,以及(对于决策模型)概率分数。

快速示例(LLM)

from contextgem import Document, Aspect, StringConcept, DocumentLLM

doc = Document(raw_text="...contract text...")

doc.add_aspects([Aspect(name="Payment terms", description="Clauses on payments")])

doc.add_concepts([
    StringConcept(
        name="Anomalies",
        description="Anomalous statements",
        add_references=True,
        reference_depth="sentences",
        add_justifications=True,
        justification_depth="brief",
    )
])

llm = DocumentLLM(model="openai/gpt-6-luna", api_key="…")
result = llm.extract_all(doc)
print(result.get_aspect_by_name("Payment terms").extracted_items)
print(result.get_concept_by_name("Anomalies").extracted_items)

方面返回确切的付款条款段落;概念返回每个异常及其来源句子和简短论证。

快速示例(决策模型)

from contextgem import Document, Aspect, BooleanConcept, LabelConcept, DocumentDecisionModel

doc = Document(raw_text="...service agreement...")

doc.add_aspects([Aspect(name="Termination", description="Clauses on termination")])

doc.add_concepts([
    BooleanConcept(name="Termination for convenience", description="Can it be ended without cause?"),
    LabelConcept(
        name="Notice form",
        description="Form of termination notice",
        labels=["Written", "Email", "Any form", "Not specified"],
        classification_type="multi_class",
    ),
])

model = DocumentDecisionModel(model="typesafe/jev-latest", api_key="…")
result = model.extract_all(doc)
print(result.get_aspect_by_name("Termination").extracted_items)
print(result.get_concept_by_name("Termination for convenience").extracted_items)
print(result.get_concept_by_name("Notice form").extracted_items)

每个段落都会获得方面的是/否概率,概念返回所选标签的概率。

安装 – pip install -U contextgem(或 uv add contextgem)。

文档与资源 – 完整文档位于 https://contextgem.shcherbak.ai,快速入门指南、v1.0 迁移指南,以及广泛的测试(单元测试、基于属性的测试,以及针对参考提取的评估)。


ContextGem 是一个真正以 AI 为重点的项目,结合了 LLM 和专门的决策模型,以自动化可靠、可追踪的文档数据提取。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目