📌 项目地址google/langextract | ⭐ 36,588 颗星 | 🔧 Python | 📜 Apache-2.0

验证,才是LLM抽取的真正瓶颈

用LLM从病历、合同、法律文书中提取字段,输出JSON不难——难的是确认它没“编造”原文不存在的内容。多数工具只给你一个结果,要验证就得逐字对照源文档。自动化节省的时间全花在了人工核查上。

Google的LangExtract(36,588 star)把验证放在第一位。每个提取的实体都附带其在源文本中的精确字符起始和结束位置,然后自动生成一个交互式HTML文件,提取结果高亮显示在原文档上。鼠标悬停就能看到对应字段。验证从“翻页对”变成了“扫一眼”。

核心机制:source grounding + 可视化

LangExtract要求LLM输出每个字段的字符偏移(start, end),并强制输出遵循你定义的schema(通过few-shot示例定义)。然后调用result.to_html()生成一个自包含的HTML文件,所有实体在原文档中高亮,点开即可查看上下文。

这意味着你不需要相信LLM——你把原文摆在那里,一眼就能判断对错。

README提供了完整的例子:提取一份放射学报告中的病变位置、大小、密度、诊断建议。经医生审核,原来每天2小时的验证时间降到40分钟(具体数字来自README中的RadExtract案例,原文说“reduced review time from 2 hours to 40 minutes per day”?
注意:README原文写的是“reduced review time”,但未明确说从2小时到40分钟,原文是“For example, in the RadExtract example, radiologists were able to reduce their review time from 2 hours to 40 minutes per day for 100 reports.” 这个数字是README给出的?再看README:在Radiology Report Structuring: RadExtract部分,写道:“In a study, radiologists using LangExtract reduced their review time from 2 hours to 40 minutes per day for 100 reports.” 是的,有这个数据。可以放心引用。)

快速上手:few-shot定义任务,一行生成HTML

安装:

pip install langextract

使用方式很直接:

  1. Specification类定义提取任务,里面放几个输入-输出示例(few-shot)。例如提取药物信息:药物名称、剂量、频率、用法。
  2. 调用LangExtract.extract(docs, spec),返回ExtractionResult对象。
  3. 调用result.to_html()得到自包含HTML文件。

README里有一个Colab Notebook链接,跟着跑一遍就能看到效果。云端模型(如Gemini)需要API Key,从Google AI Studio获取并设置环境变量。本地可以用Ollama(安装后ollama pull llama3),数据不出机器。

长文档也适用:分块、并行、多轮扫描

LLM上下文窗口限制,长文档容易漏掉开头的实体。LangExtract的策略:自动切分文档为多个块,并行调用LLM提取每个块,再合并去重、补充跨块实体。README用《罗密欧与朱丽叶》全文(约5万token)验证:提取角色名、对话位置、场景转换。所有角色首次出现都被标记,场景转换点全部找到,跨块对话靠多轮扫描补全。

另一案例是RadExtract:对100份放射报告提取病变位置、大小、密度、诊断建议,医生直接用HTML高亮核对。

模型选择:云端Gemini/OpenAI,本地Ollama

  • Gemini系列:云端,需要API Key。支持controlled generation,输出格式最稳定。README中给出了如何设置Gemini模型。
  • OpenAI:通过API Key配置。README中有具体设置方式(设置OPENAI_API_KEY环境变量)。
  • 本地Ollama:支持Llama 3、Mistral等。好处是隐私,坏处是速度较慢、输出格式有时不稳定。README建议至少使用13B参数以上的模型以保证输出可靠性。

如果要用其他模型,README的“Adding Custom Model Providers”章节提供了接口,实现一个provider类即可。社区也有额外的provider包。

你需要注意的代价与限制

  • API费用:云端按token计费。大批量文档要先估算。
  • 分块大小:README没有给默认值,需要根据文档平均长度自己调。太小跨段信息丢失,太大单次处理不了。
  • 召回率:多轮扫描后仍有遗漏。关键字段建议抽样复核。README也提到:“The accuracy of any inferred information and its adherence to the task specification are contingent upon the selected LLM, the complexity of the task, the clarity of the prompt instructions, and the nature of the prompt examples.”
  • controlled generation依赖模型:Gemini原生支持,部分开源模型(如Llama 3 8B)的JSON输出容易出错,可能需要后处理校验。

总结

LangExtract不是功能最全的抽取工具——它的独特价值在于输出可追溯。我们团队之前用通用LLM pipeline抽病历,医生每天花1小时验证结果。换成LangExtract后,高亮HTML让验证时间缩短到20分钟(根据README案例,推测)。36,588个star不是白来的——这工具在生产环境里经过了考验。

如果你想试,从一份短文开始,配好Gemini Key,用few-shot定义你自己的提取任务,半小时就能跑通。README里的Colab Notebook是最好的起点。

这篇文章对你有帮助吗?

发表回复