你有一個能力超強但“不太懂行”的助手(大語言模型LLM)。它能說會道,知識淵博,但它:
- 不懂你的數據庫: 不知道你的數據庫里有哪些表,表里有哪些字段,這些字段代表什么意思。
- 不懂你的API: 不知道你的系統里有哪些可以調用的功能(API),這些功能需要什么參數(比如郵箱地址、城市名、日期)。
提示工程(Prompt Engineering) 就是教你如何給這個“超強助手”寫一份清晰、詳細的指令說明書(Prompt),讓它能理解你的自然語言問題,并幫你完成特定的專業任務(寫SQL查數據庫、調用API)。
核心目標:把“人話”變成“機器能聽懂的專業指令”
- Text2SQL: 把“今年賣得最好的產品是啥?” 變成
SELECT ... FROM ... WHERE ...
這樣的數據庫查詢語句。 - Text2API: 把“給老王發個郵件,告訴他明天下午3點開會” 變成調用
send_email
這個接口,并填好to=老王@公司.com
,subject=會議提醒
,content=明天下午3點開會...
這些參數。
from langchain.utilities import SQLDatabase
from langchain.chains import SQLDatabaseChain
from langchain_community.llms import OpenAI
db = SQLDatabase.from_uri("sqlite:///sales.db")
llm = OpenAI(temperature=0)chain = SQLDatabase
Chain.from_llm(llm, db, verbose=True)
response = chain.run("2024年銷售額超過100萬的產品是什么?")
SELECT p.name, SUM(o.sales) AS total_sales
FROM orders o
JOIN products p ON o.product_id = p.id
WHERE YEAR(o.date) = 2023
GROUP BY p.id
HAVING total_sales > 1000000;
關鍵秘訣:給助手“補課” (顯式化領域知識)
LLM本身不懂你的業務細節。提示工程的核心就是通過Prompt把這些背景知識(領域知識) 明確地告訴它:
- 角色扮演: “嘿助手,你現在是一個數據庫專家/API調用專家!”
- 知識注入:
- 對SQL: 把數據庫的結構(Schema) 告訴它。比如:
- 我們有個
orders
表,里面有id, product_id, sales (銷售額), date (日期)
- 還有個
products
表,里面有id, name (產品名), category (類別)
orders.product_id
對應著products.id
- 我們有個
- 對API: 把API文檔告訴它。比如:
- 有個API叫
/send_email
,需要用POST
方法調用,需要提供to (收件人郵箱), subject (郵件主題), content (郵件內容)
這三個參數。 - 還有個API叫
/weather
,需要用GET
方法調用,需要提供city (城市名), date (日期)
。
- 有個API叫
- 對SQL: 把數據庫的結構(Schema) 告訴它。比如:
一、 Text2SQL 深入淺出解析 (怎么讓助手幫你查數據庫?)
- 助手需要什么?
- 你的問題: “2024年銷售額超過100萬的產品是什么?”
- 數據庫結構: 哪些表?哪些字段?它們啥關系?(Schema)
- 助手怎么做? (提示工程的步驟)
- 理解問題: 助手先看你的問題,找出關鍵信息(這叫實體識別、關系抽取、意圖理解)。
- 你要查什么? -> 產品 (
product
) - 查哪個時間? -> 2024年 (
year=2024
) - 查什么條件? -> 銷售額 (
sales
) 超過 (>
) 100萬 (1000000
) - 怎么衡量? -> 很可能是按產品匯總 (
SUM(o.sales)
然后GROUP BY p.id
)
- 你要查什么? -> 產品 (
- 對照數據庫結構 (Schema綁定): 助手拿著這些關鍵詞,去對比你提供的Schema。
- “銷售額” -> 哦,在
orders
表里叫sales
。 - “產品名” -> 在
products
表里叫name
。 orders
和products
怎么關聯? -> 哦,通過orders.product_id = products.id
。- “2024年” ->
orders
表里有個date
字段,需要提取年份YEAR(o.date) = 2024
。
- “銷售額” -> 哦,在
- 組裝SQL語句: 助手根據理解的信息和數據庫結構,拼裝出正確的SQL語句。
SELECT p.name, SUM(o.sales) AS total_sales -- 選出產品名,計算總銷售額 FROM orders o -- 從訂單表(起別名o) JOIN products p ON o.product_id = p.id -- 關聯產品表(起別名p) WHERE YEAR(o.date) = 2024 -- 條件是2024年的訂單 GROUP BY p.id -- 按產品分組 HAVING total_sales > 1000000; -- 篩選總銷售額大于100萬的產品
- 執行與反饋: 數據庫運行這個SQL,把結果(產品列表)返回給你。如果SQL寫錯了(比如字段名不對),助手可能會嘗試修正或者告訴你哪里出了問題(需要更好的Prompt或你提供更明確的信息)。
- 理解問題: 助手先看你的問題,找出關鍵信息(這叫實體識別、關系抽取、意圖理解)。
- LangChain 幫了大忙:
- 它有個
SQLDatabaseChain
能自動連接到你的數據庫 (db = SQLDatabase.from_uri("sqlite:///sales.db")
)。 - 它能自動讀取數據庫結構(Schema)并塞進給LLM的Prompt里。
- 你只需要告訴LLM你的問題 (
chain.run("2024年銷售額超過100萬的產品是什么?")
),它就能幫你完成上述所有步驟(理解->綁定->生成->執行->返回結果)。
- 它有個
二、 Text2API 深入淺出解析 (怎么讓助手幫你調用接口?)
Text2API(文本轉API調用) 是一種將自然語言描述的用戶需求自動轉換為對應用程序接口(API)的調用請求的技術。
LangChain提供APIChain,支持將API文檔(如OpenAPI/Swagger)嵌入提示詞,引導大模型生成請求參數,可以支持多步驟調用(如先查詢用戶ID,再調用訂單API)。
from langchain.chains import APIChain
from langchain_community.llms import OpenAIllm = OpenAI(temperature=0)api_docs = """
API文檔:
- 發送郵件:POST /send_email參數:to(收件人), subject(主題), content(內容)
- 查詢天氣:GET /weather參數:city(城市), date(日期)
"""chain = APIChain.from_llm_and_api_docs(llm, api_docs, verbose=True)
response = chain.run("給Allen發郵件,主題是會議提醒,內容為明天下午2點開會。")
如何實現Text2API?
通過自然語言處理技術進行語義解析(含意圖識別、實體抽取、上下文理解),結合預加載的API文檔信息,利用大語言模型(LLM)生成符合語法規范的API調用請求。
-
API目錄管理:維護API文檔(端點、參數、權限)。
例如:郵件API文檔:POST /send_email 參數: to (str), subject (str), content (str) 權限: 需用戶OAuth令牌
-
意圖識別:模型解析用戶指令,匹配目標API。
例如:“給Allen發郵件,主題是項目開發進度,內容為’本周完成80%’” → 調用 /send_email。
-
參數填充:提取并驗證參數(如郵箱、內容)。
{"endpoint": "/send_email","params": {"to": "zhangsan@company.com", "subject": "項目進度", "content": "本周完成80%" }
-
執行與反饋:調用API并返回結果(成功/失敗原因)。
- 助手需要什么?
- 你的指令: “給Allen發郵件,主題是會議提醒,內容為明天下午2點開會。”
- API菜單: 系統里有哪些接口?每個接口怎么用?需要啥參數?(API文檔)
- 助手怎么做? (提示工程的步驟)
- 管理API目錄: 你需要事先準備好一份清晰的“服務菜單”(API文檔),告訴助手:
- 有
/send_email
服務(POST
方法),需要to, subject, content
三個菜(參數)。 - 有
/weather
服務(GET
方法),需要city, date
兩個菜(參數)。 - 可能還需要權限(比如登錄令牌),但這篇文章例子沒提。
- 有
- 理解你想點哪道菜 (意圖識別): 助手看你的指令,找出你想做什么。
- “發郵件” -> 這對應
/send_email
這個API。
- “發郵件” -> 這對應
- 準備好配菜 (參數填充): 助手從你的指令里找出做這道菜需要的材料(參數)。
to
(收件人) 是誰? -> “Allen” -> 需要轉成郵箱地址(allen@company.com
)。(實際應用中,可能需要查通訊錄API,這里簡化了)subject
(主題) 是什么? -> “會議提醒”。content
(內容) 是什么? -> “明天下午2點開會”。
- 下單并上菜 (執行與反饋): 助手按照API文檔的要求(方法、參數格式),調用
/send_email
接口,把參數傳過去。接口執行后,告訴助手結果:“郵件發送成功!” 或者 “失敗,原因:收件人郵箱無效”。助手把這個結果告訴你。
- 管理API目錄: 你需要事先準備好一份清晰的“服務菜單”(API文檔),告訴助手:
- LangChain 幫了大忙:
- 它有個
APIChain
(chain = APIChain.from_llm_and_api_docs(llm, api_docs, verbose=True)
)。 - 你只需要把API文檔 (
api_docs
) 提供給它,然后告訴它你的自然語言指令 (chain.run("給Allen發郵件...")
)。 - 它能自動幫你完成:理解指令對應哪個API -> 提取需要的參數 -> 組裝API調用請求 -> 調用API -> 返回結果。它甚至能處理需要多個API按順序調用的復雜任務(比如先查用戶ID,再用ID查訂單)。
- 它有個
總結:
- LLM (大模型): 一個超級聰明但沒學過你公司業務的新員工。
- 自然語言問題/指令: 你口頭交代給新員工的任務(“查下今年最賺錢的產品”、“給老王發個會議通知”)。
- Schema/API文檔: 你給新員工看的公司業務手冊/操作指南(數據庫結構圖、API使用說明書)。
- Prompt (提示工程): 你交代任務時說的完整、清晰、包含背景信息的話:“小張(角色扮演),這是我們的銷售數據庫結構(知識注入),你幫我查一下(任務類型)…(具體任務描述)”。
- SQL/API調用: 新員工看完手冊,理解了你的話之后,親手寫好的查詢語句/填好的系統操作單。
- 結果: 新員工把查詢結果/操作結果匯報給你。
提示工程的核心價值就在于: 通過精心設計的Prompt(包含角色定義和領域知識),讓原本“不懂行”的大模型助手,瞬間變成你業務領域的專家,準確地將你的“人話”需求轉化為可執行的“機器指令”(SQL或API調用)。LangChain等工具則大大簡化了這個過程。