LangExtract 的 Gemini 模型怎么选:兼顾质量、成本与复杂推理任务
【免费下载链接】langextractA Python library for extracting structured information from unstructured text using LLMs with precise source grounding and interactive visualization.项目地址: https://gitcode.com/GitHub_Trending/la/langextract
用 LangExtract 配合 Gemini 做结构化抽取时,每一次lx.extract()调用都要通过model_id参数指定模型。实际使用中有三个选择要回答:日常抽取任务用哪个模型、量大且在意成本时换哪个、任务需要复杂推理时该切到哪个。项目文档对这三种情况都给出了明确的选择口径,本文按配置密钥、运行抽取、切换模型、核对结果的操作顺序把这条路走一遍。
准备环境与 API 密钥
安装:
pip install langextractREADME 建议隔离环境下使用虚拟环境。Gemini 属于云端模型,需要 API 密钥。按 Provider 参考 的说明,Gemini provider 先读取GEMINI_API_KEY,再回退到LANGEXTRACT_API_KEY:
export GEMINI_API_KEY="your_key" # README 中记录的是通用变量写法,两者任选其一即可: # export LANGEXTRACT_API_KEY="your_key"README 推荐把密钥写入.env文件并把.env加入.gitignore。在代码里直接传api_key=...是文档给出的测试/开发便利方式,README 明确不推荐生产环境使用。如果后面要走 Vertex AI Batch 路径,认证改用 Vertex AI 服务账号,通过language_model_params传入vertexai=True、project、location。
三种情况的选择口径
把文档里的选型依据按情况整理如下:
| 情况 | 文档给出的模型选择 |
|---|---|
| 默认、多数任务 | gemini-3.5-flash(README 的推荐默认值,称其在 LangExtract 的 schema 约束工作流中提供强抽取质量);SKILL.md 与 Provider 参考 写的是gemini-2.5-flash |
| 高量、成本敏感 | gemini-3.1-flash-lite(README:当前的稳定 Flash-Lite 模型) |
| 复杂推理 | README:按官方模型文档评估当前的 Gemini Pro 模型;SKILL.md、Provider 参考明确写gemini-2.5-pro,用药抽取示例 两个场景也都用gemini-2.5-pro |
| 大规模/生产 | README:建议使用付费 Gemini 档位以提升吞吐、避免限流 |
注意两套文档给出的模型名不一致:README 用gemini-3.5-flash/gemini-3.1-flash-lite,skills 文档用gemini-2.5-flash/gemini-2.5-pro。两套文档一致的是选型逻辑——Flash 作默认、Flash-Lite 对应高量低成本、Pro 对应复杂推理。README 同时说明 Gemini 模型有生命周期和明确的退役日期,并建议查阅官方模型版本文档了解最新的稳定版与 legacy 版本,所以运行前应以官方模型版本文档核对当前可用的模型名。
还有两条与成本直接相关的文档事实:
extraction_passes大于 1 会成倍增加处理时间和成本,SKILL.md 的建议是从 1 开始,召回不足时再加大。- 长文档示例 处理约 44,000 tokens 的文本,文档明确警告会产生费用,并建议大规模使用时采用 Tier 2 的 Gemini 配额以避免限流。
运行默认模型并核对结果
直接使用 README Quick Start 的示例,模型取推荐默认值:
import langextract as lx import textwrap prompt = textwrap.dedent("""\ Extract characters, emotions, and relationships in order of appearance. Use exact text for extractions. Do not paraphrase or overlap entities. Provide meaningful attributes for each entity to add context.""") examples = [ lx.data.ExampleData( text="ROMEO. But soft! What light through yonder window breaks? It is the east, and Juliet is the sun.", extractions=[ lx.data.Extraction( extraction_class="character", extraction_text="ROMEO", attributes={"emotional_state": "wonder"} ), lx.data.Extraction( extraction_class="emotion", extraction_text="But soft!", attributes={"feeling": "gentle awe"} ), ] ) ] input_text = "Lady Juliet gazed longingly at the stars, her heart aching for Romeo" result = lx.extract( text_or_documents=input_text, prompt_description=prompt, examples=examples, model_id="gemini-3.5-flash", )核对结果分两步。第一步,打印每个实体的类别、文本和位置:
for e in result.extractions: print(e.extraction_class, e.extraction_text) print(f" char_interval: {e.char_interval}")文档说明 LLM 偶尔会产出无法在源文本中定位的内容,这类抽取的char_interval = None;用[e for e in result.extractions if e.char_interval]过滤后只剩落在源文本中的结果。第二步,存成 JSONL 并生成交互式 HTML,在原文语境中逐条查看实体:
lx.io.save_annotated_documents([result], output_name="extraction_results.jsonl", output_dir=".") html_content = lx.visualize("extraction_results.jsonl") with open("visualization.html", "w") as f: if hasattr(html_content, "data"): f.write(html_content.data) # For Jupyter/Colab else: f.write(html_content)如果默认模型的结果满足你对质量的要求,就把它固定为工作流默认值;不满足时再按下一节的思路换模型。
复杂推理任务切到 Pro 模型
用药抽取示例 的 NER 和关系抽取两个场景都使用gemini-2.5-pro。其中关系抽取要求模型用medication_group属性把剂量、频次、症状等多个实体归到同一种药物下,文档称之为"more complex extractions",是比单实体识别更重的推理要求。核心调用:
result = lx.extract( text_or_documents=input_text, prompt_description=prompt_description, examples=examples, model_id="gemini-2.5-pro", )文档示例输出(标注为 "will produce output similar to")显示 Lisinopril、Metformin 各自带上了自己的 dosage、frequency、condition,且每个实体都带源文本位置。对照该结构即可判断推理是否成立:每个实体都归入了正确的组,且char_interval非空;示例代码对缺少medication_group的实体会打印Warning: Missing medication_group ...。
属性级约束方面,Gemini 支持output_schema(Ollama 目前不支持用户提供的输出 schema),可以把某个属性限制为枚举值,见 output schema 示例。README 对gemini-3.5-flash的质量评价正是针对这类 schema 约束工作流给出的。
成本侧:换 Flash-Lite 或走 Vertex AI Batch
省成本有两条互不依赖的路径,按任务是否有时效要求二选一。
高量且无时效要求:模型换成 Flash-Lite
一行改动:
result = lx.extract( text_or_documents=input_text, prompt_description=prompt, examples=examples, model_id="gemini-3.1-flash-lite", # README 建议的高量/成本敏感选项 )大批量、非即时任务:Vertex AI Batch API
Batch 示例文档 说明 Vertex AI Batch 预测通常比在线预测便宜约 50%,langextract在其上做了自动路由、缓存与容错。text_subset为待处理文本(示例文档中是从 Project Gutenberg 拉取Romeo and Juliet后取前约 60,000 字符):
batch_config = { "enabled": True, "threshold": 10, # chunk 数:低于阈值走实时 API,达到阈值走 Batch API "poll_interval": 30, "timeout": 3600, "enable_caching": True, # 结果缓存到 GCS "retention_days": 30, # GCS 数据保留天数 } results = lx.extract( text_or_documents=text_subset, prompt_description=prompt, examples=examples, model_id="gemini-3.5-flash", max_char_buffer=500, batch_length=1000, language_model_params={ "vertexai": True, "project": "your-gcp-project", # TODO: Replace with your Project ID. "location": "us-central1", "batch": batch_config } )使用这条路径时要注意:
project必须替换为你自己的 GCP Project ID;认证走 Vertex AI 服务账号,而不是上面的 API key。- 库会自动创建并管理名为
langextract-{project}-{location}-batch的 GCS 桶,输入、输出、缓存分别组织在batch-input/、cache/等目录下;输入/输出文件会保留用于调试,retention_days控制保留周期。 batch_length控制单个 batch 任务提交多少个 chunk,文档建议设高值(如1000),让所有 chunk 进入同一个 job,而不是多个串行 job。enable_caching=True时,重复运行相同 prompt 会直接从缓存取结果,跳过模型推理,也就跳过对应费用。
批处理进度可以在另一个终端跟踪日志:
tail -f batch_process.log文档给出的日志样例(示例)显示:job 创建后打印 batchPredictionJobs 路径和 Cloud Console 链接,状态从JOB_STATE_PENDING变到JOB_STATE_RUNNING;job 成功后langextract自动下载、解析并对齐结果。文档的示例输出显示从Romeo and Juliet前约 60,000 字符中抽取了 767 个实体——这是示例结果,不是固定预期。
边界与注意
- 模型名以官方版本文档核对:两套项目文档的模型名不一致(
gemini-3.5-flash系 vsgemini-2.5系),README 明确 Gemini 模型有生命周期和退役日期,运行前按官方模型版本文档确认当前稳定版。 - 成本叠加:
extraction_passes > 1使成本随 pass 数成倍增加;Batch 模式降的是单价,但需要 GCP 项目并会自动创建 GCS 桶。 - 限流:README 与长文档示例都指向付费档位(长文档示例点名 Tier 2)来避免大规模运行时的限流问题。
- 密钥安全:
api_key直传仅限测试/开发;环境部署用环境变量或.env。
【免费下载链接】langextractA Python library for extracting structured information from unstructured text using LLMs with precise source grounding and interactive visualization.项目地址: https://gitcode.com/GitHub_Trending/la/langextract
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考