分享一個大模型在請求api介面上的巧用

金色旭光發表於2024-10-21

前言

自從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': '白蠟金'}
八字為:庚辰 丙戌 丁卯 辛亥

復現必要準備:

  1. 安裝langchain
  2. 國內openai代理
  3. 網站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請求,解析返回結果。

小結

這是一個很簡單的大模型應用,主要看點在於使用大模型組織介面呼叫的引數,包括欄位和格式,替換手動編碼的實現方式。個人認為在複雜或者變化頻繁的場景下能稍微提升效率。

相關文章