這段代碼實現了一個基于大語言模型的信息抽取系統,能夠從金融和新聞類文本中提取結構化信息。下面我將詳細解析整個代碼的結構和功能。
1. 代碼整體結構
代碼主要分為以下幾個部分:
模式定義:定義不同領域(金融、新聞)需要抽取的實體類型
示例數據:提供每個領域的示例文本和標準答案
初始化函數:構建模型對話的上下文提示
推理函數:實際執行信息抽取
后處理函數:清洗模型輸出
主程序:執行整個流程
2. 核心組件詳解
2.1 模式定義 (schema)
schema = {"金融": ["日期", "股票名稱", "開盤價", "收盤價", "成交量"],"新聞": ["日期", "新聞標題", "新聞內容"],
}
定義了兩種文本類型(金融、新聞)及其需要抽取的實體字段
金融類關注股票市場數據,新聞類關注事件信息
2.2 提示模板 (IE_PATTERN)
IE_PATTERN = "{}\n\n提取上述句子中{}的實體,并按照JSON格式輸出..."
定義了信息抽取的提示詞模板
包含占位符
{}
,運行時會被實際句子和實體類型替換
2.3 示例數據 (ie_examples)
ie_examples = {"金融": [{"content": "...", "answers": {...}}],"新聞": [{"content": "...", "answers": {...}}]
}
為每個領域提供one-shot示例
包含原始文本(content)和標準抽取結果(answers)
2.4 初始化函數 (init_prompts)
def init_prompts():ie_pre_history = [{"role": "system", "content": "你是一個信息抽取助手。"}]# 構建示例對話歷史return {"ie_pre_history": ie_pre_history}
設置系統角色為"信息抽取助手"
遍歷所有示例,構建模型學習用的對話歷史
返回包含完整對話歷史的字典
2.5 推理函數 (inference)
def inference(custom_settings: dict, sentences: List[Dict[str, str]]):for item in sentences:# 構造提示詞messages = [*custom_settings["ie_pre_history"], {"role": "user", "content": ...}]# 調用模型response = ollama.chat(model="qwen2.5:7b", messages=messages)# 后處理ie_res = clean_response(response["message"]["content"])
接收待處理句子和初始化設置
為每個句子構造完整的提示詞
調用本地Qwen模型進行推理
對輸出進行清洗和格式化
2.6 后處理函數 (clean_response)
def clean_response(response: str):if "```json" in response:res = re.findall(r"```json(.*?)```", response, re.DOTALL)return json.loads(response)
處理模型返回的可能包含Markdown代碼塊的響應
提取純JSON部分并轉換為Python字典
3. 工作流程示例
假設輸入句子為金融類文本:
"2023-02-15,股票佰篤[BD]美股開盤價10美元..."
處理過程:
根據"金融"類型確定需要抽取的字段(日期、股票名稱等)
構造提示詞:
2023-02-15,股票佰篤[BD]美股開盤價10美元...提取上述句子中"金融"(日期, 股票名稱, 開盤價...)的實體...
模型返回JSON格式的抽取結果
后處理后得到結構化數據:
{"日期": ["2023-02-15"],"股票名稱": ["佰篤[BD]美股"],"開盤價": ["10美元"],... }
4. 技術亮點
上下文學習(In-context Learning):通過示例讓模型學習抽取模式
結構化提示工程:精心設計的提示模板提高抽取準確性
多領域支持:可擴展的schema設計支持不同領域
魯棒的后處理:處理模型輸出的各種格式情況
5. 擴展性建議
可以增加自動文本分類功能,而非手動指定"cls"
添加更多領域和實體類型
實現批量處理優化性能
增加錯誤處理和日志記錄
這個系統展示了如何有效利用大語言模型進行專業領域的信息抽取,核心思想是通過精心設計的提示和示例引導模型完成特定任務。