大模型如何實現自然語言轉換成結構化語言(信息提取 - 參數提取)
背景:
=======
本人傳統產品經理,近期對 AI 興趣很濃,瞭解基本原理,逐步上手嘗試。
沒碰過代碼的我,運用嗶哩嗶哩一些課程、deepseek 等工具,實現了大模型的很多應用 demo,然後再找開發實現。走了一遍發現,有手就會,還挺有意思,今天分享信息提取的一個應用點。
目的:
近期嘗試大模型在實際業務系統有哪些應用,其中一個基礎功能點就是信息提取。
比如希望做 AI 智能搜索,用戶輸入一段話,系統自動解析內容自動搜索,替代原來一個個點擊篩選條件動作(傳統 ERP 常見的搜索方式)。
圖 1——傳統 ERP 搜索頁面
舉例用戶輸入一段話:幫我查詢張三購買的 01 房源,收款了 100 萬元,模型轉換成:客戶姓名:張三;房源:01 房源;單據類型:收款;金額:100 萬元。
結構化輸出 JSON 格式數據後,前端就可以解析賦值到條件裏面,自動完成搜索。
關鍵難點就是用戶輸入內容的提取。
用 deepseek 查閱網上資料,最終實現了精準提取,效果還不錯,但也踩了很多坑,記錄下來,後續業務系統其他需求也會用得上,比如用戶上傳 pdf 合同,借用大模型可以解析語義,提取參數,數據可有很多應用方向。
模型提取參數實際三種方式,工具調用、提示詞 JSON 限制、提示詞直接提取。
圖 2——大模型信息提取的三種方式
但實際生產應用需要大模型穩定發揮,所以重點使用第一個方法,工具調用。
後兩種就是給一個提示詞告訴大模型有一段話要提取參數,大模型一般也能提取出來,但是我要求的 JSON 格式它總是不穩定輸出,或是隨意發揮增加文字輸出,造成業務系統傳統代碼拿到數據無法解析。
實現邏輯:
上述說明使用工具調用,具體有以下 6 個步驟,
步驟 1、定義工具:使用 Pydantic 模型定義要提取的結構化數據,並轉換爲 OpenAI 工具格式
(通過 convert_to_openai_tool),再綁定大模型。
步驟 2、構建提示:包括系統提示(指示模型作爲抽取專家)和用戶輸入。
步驟 3、調用模型:將提示和工具描述一起發送給模型。
步驟 4、型推理:模型根據用戶輸入和工具描述,識別出需要調用工具,並生成符合工具參數要求的參數(結構化數據)。
步驟 5、模型返回:返回的結果中包含 tool_calls 字段,其中是模型生成的工具調用結構(函數名和參數)。
步驟 6、程序解析:我們解析這個結構,得到參數。
核心是因爲大模型只有文字輸出能力,它是不具備工具調用等能力的,如果要給大模型擴充這個能力,就需要運用到 openAI 開發好的工具調用模式。
實現代碼:
因通過 key 調用大模型會產生 token 有費用,下述就使用本地模型進行實現。
本地模型(ollama、qwen3:0.6b)(此步驟可問 deepseek 如何安裝)
1、先導入必備的庫
import requests
from pydantic import BaseModel, Field
from typing import Optional, Literal
from langchain_core.utils.function_calling import convert_to_openai_tool
2、自己需提取的參數,進行定義,放置類中;
classPerson(BaseModel):
"""結構化參數提取模型定義(Pydantic Schema)
說明:此模型定義了大模型需要提取的結構化字段及其約束條件
爲何使用工具模式:這正是圖片中描述的工具調用模式的核心要素 - 預定義輸出結構"""
customerName: Optional[str]= Field(default=None, description="客戶姓名")
houseName: Optional[str]= Field(default=None, description="房源名稱")
documentTypeId: Optional[Literal["S01","S02","S03","S04"]]= Field(
default=None,
description="款項類型:收款→S01;退款→S02;轉款→S03;劃撥→S04"
)
3、工具調用 + 工具綁定大模型 + 調用本地大模型
defget_response_1t(mess):
"""調用本地 Ollama 部署的 Qwen3 模型
說明:此函數核心實現了圖片中的【工具/函數調用模式】
驗證點:通過 convert_to_openai_tool 實現模式轉換,並通過 tools 參數傳遞給大模型"""
# 關鍵實現:將 Pydantic 模型轉換爲工具調用格式(工具調用模式核心步驟)
# 對比圖片中的模式說明:這正是"工具/函數調用模式"的典型實現
tool = convert_to_openai_tool(Person)
# 構建符合工具調用模式的請求體
payload ={
"model":"qwen3:0.6b",# 使用支持工具調用的模型(圖片中模式1的要求)
"messages": mess,# 用戶輸入消息
"tools":[tool],# 關鍵:傳遞工具定義(區別於JSON模式)
"stream":False# 非流式響應
}
try:
# 發送請求到 Ollama API(實現工具調用模式的核心交互)
response = requests.post(OLLAMA_API_URL, json=payload)
response.raise_for_status()# 確保HTTP請求成功
return response.json()# 返回包含結構化參數的響應
except requests.exceptions.RequestException as e:
print(f"調用本地模型時出錯: {e}")
returnNone
4、構建提示詞,系統提示詞和用戶輸入;注意:提示詞很重要,限制隨意輸出。
defprompt_ty(input):
"""構建提示模板(增強工具調用模式的效果)
作用:指導大模型專注於參數提取,不生成額外內容
與工具模式的關係:補充說明但非核心(工具模式本身已有結構定義)"""
# 系統提示(配合工具模式使用)
pro_sys =(
"您是一個專家級信息提取算法,僅從文本中提取相關信息,未知字段返回null."# 防止幻覺
)
# 返回消息結構(符合工具調用模式的輸入要求)
return[
{"role":"system","content": pro_sys},# 系統指令
{"role":"user","content":input}# 用戶實際輸入
]
5、測試用戶輸入
# 注意:最終響應中將包含 tool_calls 部分(工具/函數調用模式的標誌性輸出)
input_text ="王五的宏光小區305室,退款了."
p_y = prompt_ty(input_text)# 構造提示
res = get_response_1t(p_y)# 調用模型(工具模式執行)
print(res)# 輸出包含結構化參數的結果
6、測試模型工具輸出,達到預期。
7、模型返回參數後給到後端,因爲我們傳統業務系統使用 java,再封裝接口返回前端,前端自動將參數賦值到篩選條件,自動搜索結果展示給用戶。
自己執行 python 代碼實現後,開心極了,就積極找開發討論,推進項目上線。
當然,上生產前,還需多輪測試,發現模型的穩定性是個難題,但通過工具調用,基本也很好限制模型發揮。如果模型返回效果不好,我會更換模型、調整提示詞,提示詞中修改規則,或新增示例,也會對模型提取效果有一定幫助。
除了上述介紹本地模型調用,實現信息 / 參數提取,還可申請阿里通義千問的 key 遠程調取雲端大模型進行實現,核心思想也是使用定義數據結構,再將數據結構放入工具綁定大模型進行實現。感興趣小夥伴可將上述代碼嘗試,也可使用 deepseek 搜索轉換代碼遠程調用大模型。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/wGQHQeVJaj9JaZT3U-toLg