前言
自從Chatgpt橫空出世以來,各種智慧工具層出不窮,聊天、繪畫、影片等各種工具幫助很多人高效的工作。作為一個開發者,目前常用應用包括程式碼自動填充,聊天助手等。
這些是工具層面的使用,有沒有將大模型和日常編碼的前後端流程相結合使用的切入點呢?今天分享一個使用大模型自動呼叫api介面的示例,可以作為大模型在開發中的另一種使用場景。
介面說明
示例介面如下,一個八字測算的介面(僅做示例,非封建迷信)
請求介面:[https://api.yuanfenju.com/index.php/v1/Bazi/paipan](https://api.yuanfenju.com/index.php/v1/Bazi/paipan)
請求方法:POST
請求body:
{
"api_key": "xxxx",
"name": "張三",
"sex": 0,
"type": 1,
"year": 2000,
"month": 10,
"day": 10,
"hours": 22,
"minute": 0
}
api_key 需要在網站申請
請求示例:
大模型提取資訊傳送請求
介面的資訊如上,正常開發過程是構造好url, body,然後傳送請求。使用大模型首先將文字的資訊提取變成請求的body體,使用的langchain框架來完成。
原理非常簡單,就是建立合適的提示詞,讓大模型提取傳入內容中的關鍵欄位,並以json格式返回。
示例如下
import os
import requests
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from langchain_openai import ChatOpenAI
os.environ["OPENAI_API_KEY"] = "sk-eCWGtrwU14E60A45E8a2T3BlbKFJ18b59d41Fdb748828B0f"
os.environ["OPENAI_API_BASE"] = "https://aigptx.top/v1"
def fun(query):
url = f"https://api.yuanfenju.com/index.php/v1/Bazi/cesuan"
# 建立大模型提示詞,提取文字的內容
prompt = ChatPromptTemplate.from_template(
"""你是一個引數查詢助手,根據使用者輸入內容找出相關的引數並按json格式返回。
JSON欄位如下:
- "api_key": "K0I5WCmce7jlMZzTw7vi1xsn0",
- "name": "姓名",
- "sex": "性別,0表示男,1表示女,根據姓名判斷",
- "type": "日曆型別,0農曆,1公里,預設1",
- "year": "出生年份 例:1998",
- "month": "出生月份 例 8",
- "day": "出生日期,例:8",
- "hours": "出生小時 例 14",
- "minute": "0",
如果沒有找到相關引數,則需要提醒使用者告訴你這些內容,只返回資料結構,不要有其他的評論,
使用者輸入:{query}""")
chain = prompt | ChatOpenAI(temperature=0) | JsonOutputParser()
data = chain.invoke({"query": query})
print(f"介面body格式化結果: {data}")
result = requests.post(url, data)
if result.status_code == 200:
print(f"介面關鍵資訊:{result.json()['data']['bazi_info']}")
try:
content = result.json()
res = f"八字為:{content['data']['bazi_info']['bazi']}"
print(res)
except Exception as e:
print(f"八字查詢失敗,返回資料異常: {e}")
else:
print("介面請求狀態異常")
if __name__ == "__main__":
query = "2000年10月10日22時"
fun(query)
結果:
介面body格式化結果: {'year': '2000', 'month': '10', 'day': '10', 'hours': '22', 'api_key': 'K0I5WCmce7jlMZzTw7vi1xsn0', 'name': '姓名', 'sex': '性別,0表示男,1表示女,根據姓名判斷', 'type': '日曆型別,0農曆,1公曆,預設1', 'minute': '0'}
介面關鍵資訊:{'kw': '戌亥', 'tg_cg_god': ['正財', '劫財', '日元', '偏財'], 'bazi': '庚辰 丙戌 丁卯 辛亥', 'na_yin': '白蠟金'}
八字為:庚辰 丙戌 丁卯 辛亥
復現必要準備:
- 安裝langchain
- 國內openai代理
- 網站api_key
分析
首先構造提示詞,這是整個流程的靈魂。通常提示詞常見使用CRISPE框架,它可以為模型提供詳細的背景,任務目標和輸出格式要求。
CR:capacity and role 能力與角色 | 希望模型扮演怎樣的角色以及角色具有的能力 | 你是一個引數查詢助手 |
---|---|---|
I:insight 洞察力 | 完成任務依賴的背景資訊 | |
S:statement 指令 | 希望模型做什麼,任務的核心關鍵詞和目標 | 根據使用者輸入內容找出相關的引數 |
P:personality 個性 | 希望模型以什麼樣的風格或方式輸出 | 並按json格式返回 |
E:experiment 嘗試 | 要求模型提供多個答案,任務輸出結果數量 |
本示例中提示詞:
# 建立大模型提示詞,提取文字的內容
prompt = ChatPromptTemplate.from_template(
"""你是一個引數查詢助手,根據使用者輸入內容找出相關的引數並按json格式返回。
JSON欄位如下:
- "api_key": "K0I5WCmce7jlMZzTw7vi1xsn0",
- "name": "姓名",
- "sex": "性別,0表示男,1表示女,根據姓名判斷",
- "type": "日曆型別,0農曆,1公里,預設1",
- "year": "出生年份 例:1998",
- "month": "出生月份 例 8",
- "day": "出生日期,例:8",
- "hours": "出生小時 例 14",
- "minute": "0",
如果沒有找到相關引數,則需要提醒使用者告訴你這些內容,只返回資料結構,不要有其他的評論,
使用者輸入:{query}""")
呼叫過程:
chain = prompt | ChatOpenAI(temperature=0) | JsonOutputParser()
data = chain.invoke({"query": query})
print(f"介面body格式化結果: {data}")
透過合適的提示詞,將傳入的資訊 2000年10月10日22時
提取出來,組裝成一個結果。其中ChatOpenAI(temperature=0)
是讓大模型不要發散思維,嚴格按照提示詞來生成內容,避免結果不準確。JsonOutputParser()
返回的結果json格式化。
{'year': '2000', 'month': '10', 'day': '10', 'hours': '22', 'api_key': 'K0I5WCmce7jlMZzTw7vi1xsn0', 'name': '姓名', 'sex': '性別,0表示男,1表示女,根據姓名判斷', 'type': '日曆型別,0農曆,1公曆,預設1', 'minute': '0'}
然後使用requests
傳送post請求,解析返回結果。
小結
這是一個很簡單的大模型應用,主要看點在於使用大模型組織介面呼叫的引數,包括欄位和格式,替換手動編碼的實現方式。個人認為在複雜或者變化頻繁的場景下能稍微提升效率。