當前位置: 妍妍網 > 碼農

Pyhon+Curl+C#玩大模型

2024-05-15碼農

點選上方 藍字 江湖評談 設為關註/星標




前言

重度後端研究,搞前端真有點不習慣。

目前所有大模型幾乎都提供了python和curl形式的api/get/post, 無論指令碼,服務,http/https, 用它倆玩大模型是比較順手的。同時也用C#體驗了下,本篇用這三種方式使用llama-atom的API以及前端展示。

先看下最終成型:

Curl

首先curl的請求,這個命令在linux/win上都適用。一般是透過http/https來操作,這裏用的js fetch,關鍵程式碼如下:

fetch('https://api.atomecho.cn/v1/chat/completions', {method: 'POST',headers: headers, // 設定請求頭 body: JSON.stringify(postData) // 將數據轉換為 JSON 字串並行送 }) .then(response => response.text()) // 解析 JSON 響應 .then(data => {let str = data;//message = str.match(/[\u4e00-\u9fa5]+/g);中文輸出正則匹配,其它會出錯let fruits = str.split("content"); message='';for (let i = 0; i < fruits.length; i++) {let regex = /":"(.*?)"}}],/;let match = regex.exec(fruits[i]);if (match && match[1]) {let extractedContent = match[1];//alert(extractedContent); message= message.concat(extractedContent); } else{console.log("No match found."); } }let cleanedString = message .replace(/\\\"/g, '\"') // 去掉轉義的雙引號 .replace(/\\n/g, ' ') // 去掉轉義的換行符並替換為空格 .replace(/\\r/g, ' ') // 去掉轉義的回車符並替換為空格 .replace(/\\t/g, ' ') // 去掉轉義的制表符並替換為空格 .replace(/```/g, '') // 去掉反引號 .replace(/\\/g, '') // 去掉所有剩余的反斜杠 .replace(/\n/g, ' ') // 去掉實際的換行符並替換為空格 .replace(/\r/g, ' '); // 去掉實際的回車符並替換為空格// 模擬 AI 的回復(可以根據實際情況修改) setTimeout(() => { appendMessage('AI', cleanedString); }, 500);

因為跨域,代理,etc/host等問題,所以這裏需要一個幹凈無任何限制的瀏覽器環境,以避免請求出錯。開啟cmd,切換到如下目錄,然後執行chrome

C:\Program Files\Google\Chrome\Application>chrome.exe --disable-web-security --user-data-dir="c:/ChromeDevSession"

在chrome裏面執行以上js/html程式碼,就可以對話了:

Python

python這裏是指令碼形式的,如下:

from openai import OpenAIimport sysdefABC(str): client = OpenAI(api_key="sk-your atom key",base_url="https://api.atomecho.cn/v1",) completion = client.chat.completions.create(model="Llama3-Chinese-8B-Instruct",messages=[{"role":"user", "content": str}],temperature=0.3,) print(completion.choices[0].message.content)returnprint("歡迎使用llama3大模型對話")while(1):try: print("\r\n") user_input = input("Please type something and press enter: ")if user_input =="exit": exit(0)if len(user_input)!=0: ABC(user_input)else: print("請輸入參數")except KeyboardInterrupt: print("\r\n") sys.exit()

一般執行在後端:

C#

C#因為不太喜歡semantic kernel這種看似很沈重的框架,所以這裏直接.NET8 API AOT計畫構建的後端http-get請求。

publicstaticstringllama(string question) {var client = new RestClient("https://api.atomecho.cn/v1/chat/completions");var request = new RestRequest("https://api.atomecho.cn/v1/chat/completions", Method.Post); request.AddHeader("Authorization", "Bearer sk-your atom key"); request.AddHeader("Content-Type", "application/json"); request.AddHeader("Accept", "*/*"); request.AddHeader("Host", "api.atomecho.cn"); request.AddHeader("Connection", "keep-alive");var body = @"{" + "\n" +@" ""model"": ""Atom-7B-Chat""," + "\n" +@" ""messages"": [" + "\n" +@" {" + "\n" +@" ""role"": ""user""," + "\n" +@" ""content"":""+" + question + @"+""" + "\n" +@" }" + "\n" +@" ]," + "\n" +@" ""temperature"": 0.3," + "\n" +@" ""stream"": true" + "\n" +@"}"; request.AddParameter("application/json", body, ParameterType.RequestBody); RestResponse response = client.Execute(request);string str = response.Content;string[] str1 = str.Split("data"); StringBuilder addstr = new StringBuilder();for (int i = 0; i < str1.Length - 1; i++) {try {string gg = str1[i].Substring(str1[i].IndexOf("content") + 10, (str1[i].IndexOf("usage") - str1[i].IndexOf("content")) - 16);if (!gg.Contains("finish_reason")) addstr.Append(gg); }catch { } }return addstr.ToString(); }

執行之後,API請求執行可以透過:http://localhost:5069/llama請求,它會返回如下:

如果你想要跟它對話,則在 http://localhost:5069/llama 後面加參數就可以了。比如要它作首詩,則可以請求如下: http://localhost:5069/llama/作首詩,它返回:

這種形式可以作為get請求數據,用在任何需要的地方。

結尾

以上是AI模型的三種請求方式,可以作為https,伺服器,指令碼等。大模型的呼叫情況基本上相同,非常簡單,此處作為一個參考,可以快速切換其它AI模型進行對話等等。