
Google LangExtract让文本结构化变得简单
声明:该文章由作者(我能再吃一顿)发表,转载此文章须经作者同意并请附上出处(0XUCN)及本页链接。。
LangExtract是一个基于Python的开源库,专门设计用于利用大语言模型(LLM)从非结构化文本中提取结构化信息。这个项目的核心理念是将复杂的文本分析任务简化为几行代码,同时保证提取结果的准确性和可追溯性。
如果说其他工具是在做"文本搬运工",那LangExtract更像是在做"文本外科医生"——不仅提取得精准,还能告诉你每个信息具体来自哪里,甚至给你生成一份详细的"手术报告"。
核心功能特性
1. 精确的源文档映射
LangExtract的最大创新在于能够将提取的每个信息片段精确映射到源文本的具体位置。这意味着用户不仅能获得结构化的提取结果,还能清楚地知道这些信息来自文档的哪个部分,大大提高了结果的可信度和可验证性。
2. 可靠的结构化输出
基于用户定义的示例,LangExtract能够强制执行一致的输出模式。特别是在支持受控生成的模型(如Gemini)中,这一特性能够保证输出结果的结构稳定性和数据质量。
3. 长文档处理优化
面对大型文档的"大海捞针"挑战,LangExtract采用了优化的文本分块策略、并行处理和多轮提取技术,显著提高了长文档处理的召回率和准确性。
4. 交互式可视化
系统能够自动生成包含所有提取实体的交互式HTML文件,用户可以在原始上下文中直观地查看和审核成千上万个提取实体,极大地提升了工作效率。
5. 灵活的模型支持
LangExtract支持多种LLM模型,从Google Gemini系列等云端模型到通过内置Ollama接口的本地开源模型,为用户提供了最大的选择灵活性。
快速上手
安装配置
可以通过pip轻松安装:
pip install langextract
设置API密钥
LangExtract默认使用如Gemini这样的云托管模型,这些模型需要API密钥。你可以从AI Studio获取Gemini模型的API密钥。
推荐通过.env文件设置API密钥:
# 将API密钥添加到.env文件 echo "LANGEXTRACT_API_KEY=your-api-key" > .env
基础使用示例
医疗文本中提取药物相关的信息?看这个例子:
1. 导入相关依赖 import langextract as lx import textwrap
2. 定义提取任务和规则 prompt = textwrap.dedent(""" 从医疗文本中提取药物相关信息: - 药物名称(medication) - 剂量(dosage) - 给药途径(route) - 给药频率(frequency) - 持续时间(duration) - 适应症(indication) 使用medication_group属性将同一药物的相关信息分组。 按照文本中出现的顺序提取实体。 """)
3. 提供高质量示例来指导模型 examples = [ lx.data.ExampleData( text="患者服用阿司匹林100mg,每日一次,口服,用于心血管保护,持续治疗6个月。", extractions=[ lx.data.Extraction( extraction_class="medication", extraction_text="阿司匹林", attributes={"medication_group": "阿司匹林", "category": "抗血小板药"} ), lx.data.Extraction( extraction_class="dosage", extraction_text="100mg", attributes={"medication_group": "阿司匹林", "unit": "毫克"} ), lx.data.Extraction( extraction_class="frequency", extraction_text="每日一次", attributes={"medication_group": "阿司匹林", "times_per_day": "1"} ), lx.data.Extraction( extraction_class="route", extraction_text="口服", attributes={"medication_group": "阿司匹林", "route_type": "oral"} ), lx.data.Extraction( extraction_class="indication", extraction_text="心血管保护", attributes={"medication_group": "阿司匹林", "therapeutic_area": "心血管"} ), lx.data.Extraction( extraction_class="duration", extraction_text="6个月", attributes={"medication_group": "阿司匹林", "time_unit": "月"} ), ] ) ]
4. 提取医疗实体 input_text = """ 患者诊断为高血压和糖尿病。 开始服用缬沙坦80mg每日一次,口服,用于降血压治疗。 同时处方二甲双胍500mg,每日两次,餐前服用,控制血糖。 建议患者定期监测血压和血糖水平,治疗周期为3个月后复查。 如出现不良反应,立即停药并联系医生。 """ result = lx.extract( text_or_documents=input_text, prompt_description=prompt, examples=examples, model_id="gemini-2.5-flash", api_key=os.environ.get('LANGEXTRACT_API_KEY') )
5. 保存结果并生成可视化 # 保存到JSONL文件 lx.io.save_annotated_documents([result], output_name="medical_entity_extraction_results.jsonl", output_dir=".") # 生成HTML可视化 html_content = lx.visualize(output_file) with open("medical_entity_extraction_visualization.html", "w", encoding="utf-8") as f: f.write(html_content)
6. 这里贴出了部分解析后的JSONL数据 "extractions": [ { "extraction_class":"medication", "extraction_text":"缬沙坦", "char_interval":null, "alignment_status":null, "extraction_index":1, "group_index":0, "description":null, "attributes":{ "medication_group":"缬沙坦", "category":"降压药" } }, { "extraction_class":"dosage", "extraction_text":"80mg", "char_interval":{ "start_pos":38, "end_pos":42 }, "alignment_status":"match_exact", "extraction_index":2, "group_index":1, "description":null, "attributes":{ "medication_group":"缬沙坦", "unit":"毫克" } }, { "extraction_class":"frequency", "extraction_text":"每日一次", "char_interval":null, "alignment_status":null, "extraction_index":3, "group_index":2, "description":null, "attributes":{ "medication_group":"缬沙坦", "times_per_day":"1" } }, { "extraction_class":"route", "extraction_text":"口服", "char_interval":null, "alignment_status":null, "extraction_index":4, "group_index":3, "description":null, "attributes":{ "medication_group":"缬沙坦", "route_type":"oral" } }, { "extraction_class":"indication", "extraction_text":"降血压治疗", "char_interval":null, "alignment_status":null, "extraction_index":5, "group_index":4, "description":null, "attributes":{ "medication_group":"缬沙坦", "therapeutic_area":"心血管" } }, ]
高级功能:长文档处理
对于大型文档,LangExtract提供了强化的处理能力:
# 直接从URL处理完整文档 result = lx.extract( text_or_documents="https://www.gutenberg.org/files/1513/1513-0.txt", prompt_description=prompt, examples=examples, model_id="gemini-2.5-flash", extraction_passes=3, # 多轮提取提高召回率 max_workers=20, # 并行处理加快速度 max_char_buffer=1000 # 小上下文窗口提高准确性 )
应用场景:从传统到前沿的全覆盖
传统场景就不多说了,医疗报告分析、法律文档处理、学术文献挖掘这些都是基操。
真正让我眼前一亮的是它在新兴RAG应用中的表现:
• 智能客服升级:企业知识库不再是一堆PDF,而是结构化的问答对和解决方案 • 法律AI助手:法条检索精确到条款级别,案例匹配基于具体的法理逻辑 • 医疗诊断辅助:从海量文献中提取的症状-诊断-治疗关系图谱,为医生提供循证医学支持 • 教育个性化:教材内容的知识点结构化,学习路径推荐更加精准
关键是,项目还提供了RadExtract演示,直接在HuggingFace Spaces上就能体验放射学报告的自动结构化。这种垂直领域的专业应用真的让人看到了AI落地的无限可能。
写在最后
特别是在RAG成为AI应用主流的今天,LangExtract填补了一个关键空白:如何让文档预处理从"粗暴简单"变成"精准可控"。这种创新为构建下一代可信AI应用奠定了坚实基础。
无论你是研究人员想要处理学术文献,开发者想要构建RAG应用,还是企业用户想要数字化内部知识,LangExtract都能给你带来质的飞跃。
作为Google的开源贡献,这个项目不仅技术先进,社区生态也很健康。随着RAG技术的持续演进,相信LangExtract会在构建更精准、更可信的智能系统中发挥越来越重要的作用。
项目地址: https://github.com/google/langextract
[超站]友情链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
- 1 读懂“两山”理念的天下情怀 7904008
- 2 女子被误诊绝症服药3个月 医院回应 7809021
- 3 骗子不是一夜变多了而是太会上网了 7712161
- 4 一组数据带你回顾2025世运会 7616236
- 5 一场“防拐测试” 骗走13个娃 7521832
- 6 中国男篮怎么就突然变强了 7429138
- 7 净网:中医堂?违规广告?侵公犯罪? 7329373
- 8 演员戴娇倩曝有导演连续工作7天猝死 7233169
- 9 警方通报2岁男童独自陪妈妈尸体数天 7141681
- 10 小伙送外卖结识美籍幼师5个月闪婚 7046168