久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

     江海博覽 2025-08-24 發布于浙江

    在數據驅動的時代,大量有價值的信息隱藏在非結構化文本中—比如詳盡的臨床記錄、冗長的法律文件、大量客戶反饋與評價等。很多時候我們需要把其抽取成更結構化的內容。這是因為結構化信息:更易于被索引與查詢、更適合統計分析與挖掘,也更易于被軟件集成(RPA、API、工作流等)。

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    本篇為大家介紹LangExtract -- Google 新出品的一款開源Python 工具。它可以更完美的借助LLM,并根據用戶指令,將海量非結構化文本轉換為結構清晰、來源可追溯的結構化信息 。這也是近期看到最好的 “小而美” 工具之一:簡潔、高效、有用。

    本文內容:

    • 起源與動機
    • 區別于直接LLM輸出的特點
    • 實例:專業醫學報告抽取
    • 實例:超長文本抽取
    • 總結與應用展望

    01

    起源與動機

    從低密度的自然語言文本中做結構化信息抽取一直是 AI 的難題。傳統方法要么依賴繁瑣的正則表達式,要么借助機器學習提取上下文特征,但很難應對語言多變、含義深刻的真實語料。 LLM給我們看到了解決問題的新方向,但是:

    盡管當前的LLM已經具備了通識領域非常強大的自然語言理解能力,且具備結構化輸出能力(大部分LLM)。但直接讓 LLM “讀文本吐結構” 仍然存在諸多痛點:

    • 結果不穩定:同一段文本,用不同提示或在模型狀態稍有變化時,輸出的結果可能大相徑庭 。
    • 缺乏溯源:模型生成的字段難以定位到原文具體位置,審核和驗證非常困難 。
    • 長文本乏力:一旦文本過長(數萬字乃至更多),模型容易“迷失”,簡單截斷又可能遺漏全局信息 。
    • 跨領域適應難:不同領域(醫療、法律、金融、輿情等)的抽取需求各異,直接讓模型覆蓋所有領域往往力不從心,細調模型代價高昂。

    LangExtract 正是為了解決上述這些問題而生 。它由 Google 開源,可以讓開發者通過自然語言指令和少量示例數據來定義并完成抽取任務 。

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    相較于普通 LLM 的直接輸出,LangExtract 在后臺采取了一系列策略來強化結果的可靠性和可控性開發者無需深厚的機器學習專業知識,只需用幾行代碼結合提示和示例,就能高效地將自由文本轉換為結構化數據:它嘗試把 LLM 抽取變成了一套可控、可追溯的過程。

    02

    區別于直接LLM輸出的特點

    與讓LLM直接嘗試生成 JSON 等結構化結果相比,LangExtract 提供了一整套機制來保證抽取結果的準確、穩定和易用。其主要特點包括:

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。
    • 廣泛的領域適用性針對垂直領域,只需編寫相應的提示和示例,無需對底層 LLM 進行微調,它就能理解并執行新的抽取任務 。從司法文書里的日期地點至醫學報告的數據結構化,都可以通過更改 Prompt 和示例實現 。

    • 精準的來源定位每個抽取結果都能映射回原文中的精確位置。提取的數據帶有字符偏移索引,方便人工審核和驗證 。這一特性使得抽取過程透明可追溯。

    • 可靠的結構化輸出:開發者可以通過提示詞描述所需的輸出結構,并提供一組高質量的Few-Shot示例來定義 schema。LangExtract 會確保模型嚴格遵循預期的字段格式,即使面對復雜任務輸出也穩定一致 。

    • 優化的長文檔處理:針對“海量文本、大海撈針”式的抽取難題,LangExtract 采用分區塊+多線程并行+多輪抽取的策略 。即使百萬級字符的長文檔也能被有效“掃描”,不錯過隱藏的關鍵信息。

    • 交互式可視化:LangExtract 可以生成交互式的 HTML 報告,并使用顏色高亮標注每個提取實體在原文中的位置,且提供導航控件方便瀏覽大量注解 。對于需要人工復核或演示匯報的場景,方便了對結果的理解和質量評估。

    • 善用 LLM 的通用知識:LangExtract 允許模型運用自身的通用知識來補充額外信息 。例如讓模型基于其知識增加抽取的人物身份或時代背景等屬性。在保證核心數據可追溯的前提下,適度發揮模型的知識推理能力,使結果更豐富。(當然,這部分推斷內容的準確性取決于模型能力和提示的引導 )

    以上這些特性使得 LangExtract 將大模型從一個不可控的“黑盒”變成了開發者手中可定制、可追蹤的工具。特別是對于追求嚴格數據質量和合規性的企業應用來說,這種嚴格的控制力正是我們非常需要的。

    03

    實例演示:LangExtract抽取醫學報告

    LangExtract 的核心思想最早正是應用于醫學信息抽取研究:例如從臨床筆記中自動識別藥物名稱、劑量、頻率、適應癥狀等用藥信息,并構建信息間的關系 。

    我們通過一個簡單示例演示 LangExtract 在該領域的應用。在該示例中,LangExtract從雜亂的病人記錄里提取出用藥清單,包括藥物名稱、用法用量,以及不同藥物之間的分組關系等,實現了對非結構化病歷到結構化用藥報告的自動化轉換。

    使用LangExtrace進行結構化信息抽取的基本步驟如下:

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    【基礎抽取】

    這里逐步完成一個基礎示例:

    • 定義抽取任務描述 (Prompt)以自然語言撰寫一段提示,清晰說明需要從文本中提取什么信息、遵循什么規則。
    import textwrap import langextract as lx from langextract.factory import ModelConfig # 提取指令 prompt_description = textwrap.dedent('''提取藥物信息,包括藥物名稱、劑量、給藥途徑、頻率和持續時間,按照它們在文本中出現的順序提取。 ''')
    • 提供高質量示例 (Few-shot Examples):人工構造若干示例,展示給定一段文本時期望的提取結果。這些示例將作為模式指導,幫助模型明白如何輸出。
    examples_ner = [
        lx.data.ExampleData(
            text='患者被給予250毫克靜脈注射頭孢唑啉,每日三次,持續一周。',
            extractions=[
                lx.data.Extraction(extraction_class='dosage', extraction_text='250毫克'),
                lx.data.Extraction(extraction_class='route', extraction_text='靜脈注射'),
                lx.data.Extraction(extraction_class='medication', extraction_text='頭孢唑啉'),
                lx.data.Extraction(extraction_class='frequency', extraction_text='每日三次'),
                lx.data.Extraction(extraction_class='duration', extraction_text='持續一周')
            ]
        )
    ]
    • 執行抽取 (Extraction):調用 LangExtract 的接口,將待處理的輸入文本傳入,并附上定義的提示描述和示例數據,以及指定所用的底層模型。LangExtract 會自動調用 LLM,對文本進行分析并提取所需信息,返回結構化的結果。
    • (這里使用了某API平臺的OpenAI兼容接口,模型為qwen3-14b)
    input_text = '患者服用了400毫克口服布洛芬,每4小時一次,持續兩天。' #配置模型 - 明確指定OpenAI提供者 model_config = ModelConfig( model_id='qwen3-14b', provider='OpenAILanguageModel', # 明確指定使用OpenAI提供者 provider_kwargs={ 'temperature': 0.1, 'max_tokens': 2048, 'base_url': 'your-base-url', 'api_key': 'your-api-key' } ) result_ner = lx.extract( text_or_documents=input_text, prompt_description=prompt_description, examples=examples_ner, config=model_config, # 使用 ModelConfig fence_output=True, use_schema_constraints=False, debug=False )
    • 輸出與可視化結果:你可以直接對解析結果進行輸出,也可以將結果對象保存為 JSONL 文件,然后利用庫提供的 visualize 方法生成交互式HTML文件。
    print('提取的實體:')
    for entity in result_ner.extractions:
        position_info = ''
        if entity.char_interval:
            start, end = entity.char_interval.start_pos, entity.char_interval.end_pos
            position_info = f' (位置: {start}-{end})'
        print(f'· {entity.extraction_class.capitalize()}: {entity.extraction_text}{position_info}')
    
    
    # 保存結果
    lx.io.save_annotated_documents([result_ner], output_name='醫療_ner_提取.jsonl')
    print('\n基礎NER結果已保存到 醫療_ner_提取.jsonl')    
    
    
    html_content_ner = lx.visualization.visualize('./test_output/醫療_ner_提取.jsonl')
    with open('醫療_ner_可視化.html', 'w', encoding='utf-8') as f:
        f.write(html_content_ner)

    LangExtract的解析結果為Extraction類型的對象列表,它代表了抽取信息的完整結構。它是一個數據結果的容器,包含有如下信息:

    • 核心層 - 定義'是什么'
      • extraction_class: 實體類型(如'medication', 'person'等)
      • extraction_text: 提取的具體文本內容(如“布洛芬')
    • 定位層 - 記錄'在哪里
      • char_interval: 字符級別的精確位置
      • token_interval: Token級別的位置(更適合NLP處理)
    • 組織層 - 管理'如何組織'
      • extraction_index: 全局序號
      • group_index: 分組編號
      • alignment_status: 匹配質量狀態
    • 語義層 - 描述'更多信息'
      • description: 人類可讀的描述
      • attributes: 結構化屬性字典(關鍵特性!)

    上面的簡單例子中簡單的打印了extraction_class與extraction_text信息:

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    此外,我們把結果可視化到了一個html文件。通過它你可以直觀的查看提取的實體列表及其在原文本的位置(追溯)。

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。
    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    遺憾的是,目前LangExtraction版本的可視化(visualization)功能對中文支持不完善。如果是英文環境,利用輸出的html文件,可看到類似如下的效果:

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    相信后續的版本將會對多語言環境支持的更好。

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    【關聯抽取】

    實際應用中,可能需要把多個相關的抽取結果關聯在一起,比如在上例中,需要把一種藥物的名稱、用法、劑量等關聯到一起。這有兩種方法可以實現:

    利用分組關聯多個實體

    這種方法給每一個抽取實體賦予一個”分組“屬性,比如medication_group,這樣,具有共同分組屬性的實體就被自然的關聯起來,而你只需要修改提示詞和示例。

    我們對上面的例子改造,引入更復雜的醫學文本(input_text):

    “患者上個月被開了利辛普利和二甲雙胍。他每天服用利辛普利10毫克治療高血壓,但經常漏服二甲雙胍500毫克劑量,應該每日兩次服用治療糖尿病。”

    現在修改prompt和examples:

    prompt_description_re = textwrap.dedent('''提取藥物及其詳細信息,使用屬性將相關信息分組: 1. 按照實體在文本中出現的順序提取 2. 每個實體必須具有 'medication_group' 屬性,將其鏈接到相應的藥物 3. 一個藥物的所有詳細信息應該共享相同的 medication_group 值 ''') examples_re = [ lx.data.ExampleData( text='患者服用阿司匹林100毫克每日一次用于心臟健康,以及辛伐他汀20毫克睡前服用。', extractions=[ # 第一個藥物組 lx.data.Extraction( extraction_class='medication', extraction_text='阿司匹林', attributes={'medication_group': '阿司匹林'} ), lx.data.Extraction( extraction_class='dosage', extraction_text='100毫克', attributes={'medication_group': '阿司匹林'} ), lx.data.Extraction( extraction_class='frequency', extraction_text='每日一次', attributes={'medication_group': '阿司匹林'} ), lx.data.Extraction( extraction_class='condition', extraction_text='心臟健康', attributes={'medication_group': '阿司匹林'} ), # 第二個藥物組【省略】 ] ) ]

    這里通過medication_group把一個藥物相關的多個抽取實體關聯起來。現在,通過對抽取結果解析打印(代碼略),可以輕松查看每種藥物的關聯性質:

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    以實體為中心的屬性抽取

    另外一種抽取方式是以藥物作為中心的抽取實體,而其他相關的性質則作為藥物實體的屬性抽取。提示與示例如下:

    prompt_description_attr = textwrap.dedent('''提取藥物信息,將每個藥物作為主要實體,其相關的劑量、頻率、途徑、適應癥等信息直接作為該藥物的屬性:
    1. extraction_class 統一為 'medication'
    2. extraction_text 為藥物名稱
    3. 所有相關信息(劑量、頻率、給藥途徑、適應癥、持續時間等)放在 attributes 中
    4. 按照藥物在文本中出現的順序提取
    ''')
    
    
    examples_attr = [
        lx.data.ExampleData(
            text='患者服用阿司匹林100毫克每日一次用于心臟健康,以及辛伐他汀20毫克睡前服用。',
            extractions=[
                lx.data.Extraction(
                    extraction_class='medication',
                    extraction_text='阿司匹林',
                    attributes={
                        'dosage': '100毫克',
                        'frequency': '每日一次', 
                        'condition': '心臟健康',
                        'route': '口服'  # 可以推斷或明確提及
                    }
                ),

    在調用lx.extract進行抽取與結果解析后,你應該得到與上面方式基本一致的結果。

    04

    實例演示:LangExtract超長文本抽取

    如果你針對超長文本進行傳統的結構化信息提取(借助LLM),你可能會面臨模型理解能力下降(詳見大模型“大海撈針”測試結果)、性能低下、準確率不夠等問題。

    LangExtract針對長文本的解析與抽取做了更多獨特的設計。

    我們用一篇“漫威世界背景知識”的文本文件做測試,該文件共約23000個中文字符。文件中描述了大量漫威世界中的人物、關系、事件、組織等,很適合用來做復雜的結構化信息抽取與知識圖譜的測試。

    首先仍然是設定prompt并提供examples:

    prompt_description = textwrap.dedent('''從給定的漫威宇宙文本中提取角色、能力、關系、組織和事件。 為每個實體提供有意義的屬性以增加上下文和深度。 重要提示:使用輸入文本中的確切文字作為 extraction_text,不要意譯。 按出現順序提取實體,不要重疊文本片段。注意:在漫威宇宙中,角色通常有多個身份、綽號、能力和隸屬組織。''') example_data = [ ExampleData( text='X教授是一位在漫威漫畫中的出版物《X戰警》中的虛構人物。X教授和至交好友萬磁王不同,他一心想讓變種人與人類能和平共處。', extractions=[ Extraction( extraction_class='角色', extraction_text='X教授', attributes={'身份': '變種人領袖', '能力': '心靈感應', '組織': 'X戰警', '目標': '人類變種人和平共處'} ), Extraction( extraction_class='角色', extraction_text='萬磁王', attributes={'身份': '變種人', '關系': 'X教授至交好友', '立場': '與X教授不同'} ), Extraction( extraction_class='組織', extraction_text='X戰警', attributes={'類型': '超級英雄團隊', '領袖': 'X教授', '成員': '變種人'} ), Extraction( extraction_class='關系', extraction_text='至交好友', attributes={'類型': '友誼', '人物1': 'X教授', '人物2': '萬磁王', '狀態': '理念不同'} ), ] ), .....

    接下來從文件中讀取內容進行解析,這里的解析參數有一些針對長文本的特殊設定:

    ...從文件讀取到marvel_text...
    
    
    # 處理漫威宇宙文本
    result = extract(
        text_or_documents=marvel_text,
        prompt_description=prompt_description,
        examples=example_data,
        config=model_config,
        extraction_passes=2,      # 多輪提取提高召回率
        max_workers=5,           # 并行處理加速
        max_char_buffer=1024,      # 較小的上下文窗口提高準確性
        fence_output=True,
        use_schema_constraints=False
    )

    這里省略后續的輸出打印部分,直接看最后的解析結果,一共提取1926個實體:


    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    打印出提取的前十名角色及屬性:

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    前十名組織(這里看到一點瑕疵:X戰警這個組織出現了兩次):

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    重要事件的前十名:

    谷歌出品!詳解LangExtract:輕量卻強大的結構化信息提取神器。

    最后總結下LangExtract在超長文檔解析上的一些設計策略:

    • 多次提取借助extraction_passes參數,可以執行獨立的多次提取,以發現每次提取中出現的新的非重疊實體,從而減少遺漏。

    • 智能分塊:通過分塊使用更小的上下文,提高單次推理的提取質量,減少上下文干擾;通過對文本分隔符等智能識別,確保上下文完整性和格式規范。

    • 并行處理:為了提高大文檔的處理性能,可以設置并行化處理(max_workers)參數,以減少總體延遲,同時也可以更好的配合分塊處理。

    05

    總結與應用展望

    LangExtract 為從非結構化文本中獲取洞察帶來了新的體驗和很多有效的改進——將 LLM 功能以一種更可控、可靠的方式應用于信息抽取,極大的解決了結果不可預期和不可溯源的問題,這對于企業場景中的應用具有重大的意義。

    LangExtract可以在很多企業級場景中獲得應用:

    • 醫療與金融等專業報告結構化:正如前面的測試樣例,用LangExtract提取臨床文本報告中的藥物名稱、劑量、用法等,并自動建立藥物與屬性之間的關聯關系,用于后續醫學分析挖掘甚至診斷。同樣,在金融領域,它也可以讀取財報或研報,提煉出指標數據關鍵信息,為風控和決策提供支持。類似地,工程日志、學術論文,輿情報告,只要是非結構化文本,均可考慮用 LangExtract 來將隱藏的信息轉化為可用的數據資產。

    • 客戶評價與投訴分析:將凌亂的用戶反饋整理歸類,快速提煉出主要問題類型和用戶情緒。企業能夠一目了然地抓住共性訴求,加快響應。

    • 軟件 Bug 反饋整理:在技術支持和測試反饋場景下,LangExtract 可以自動抽取問題描述錯誤信息影響范圍等字段,幫助開發團隊快速定位和修復缺陷。

    • 合同與法律文檔要點提取:處理冗長的合同、協議或判決書,自動識別出其中的當事方名稱關鍵日期金額義務條款等信息節點,降低人工審核的負擔 。這些結構化要點數據還可進一步用于合同管理系統或法律知識庫。

    • 會議紀要與郵件要點萃取:你可以用LangExtract 從會議紀要中自動抓取決策結論行動項等內容,從長篇討論中抽取出后續執行要點;從郵件中提取客戶要求技術支持摘要,幫助團隊更高效地跟進工作。

    LangExtract 已經發布在 PyPI 上,你可以輕松安裝并集成到自己的應用中,快去試試吧!

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 日韩在线视频线观看一区| 国产一区二区三区在线视頻 | 国产果冻豆传媒麻婆精东| 欧洲精品一卡2卡三卡4卡影视| 亚洲色最新高清AV网站| 免费人成视频在线观看网站| 无码AV免费永久免费永久专区| 少妇高潮水多太爽了动态图| 精品国产亚洲一区二区三区| 亚洲精品国产一二三区| 50岁熟妇的呻吟声对白| 肉大捧一进一出免费视频| 正在播放的国产A一片| 少妇人妻无码专区视频| 亚洲中文字幕无码一区无广告| 伊人久久大香线蕉亚洲五月天| 被公疯狂玩弄的年轻人妻| 久久婷婷五月综合尤物色国产| 漂亮人妻中文字幕丝袜| 亚洲AV综合色区无码一区 | 亚洲蜜臀av乱码久久| 狠狠色噜噜狠狠狠狠7777米奇| 亚洲人妻精品中文字幕| 国产微拍精品一区二区| 99热精品毛片全部国产无缓冲| 国产精品视频第一区二区三区| 欧美巨大极度另类| 无码AV人片在线观看天堂| 国产成人一区二区三区视频免费| 日韩中文字幕高清有码| 日韩放荡少妇无码视频| 久青草国产在视频在线观看| 无码AV动漫精品专区| 肉感饱满中年熟妇日本| 亚洲一区二区偷拍精品| 亚洲国产精品成人网址| 老湿机69福利区18禁网站| 日本一区二区不卡精品| 天天夜碰日日摸日日澡| 国产精品无码一区二区三区电影| 羞羞影院午夜男女爽爽免费视频|