主頁 >  其他 > 【OpenAI】私有框架代碼生成實踐

【OpenAI】私有框架代碼生成實踐

2023-05-05 08:50:20 其他

作者:京東零售 牛曉光

根據現有調研和實踐,由OpenAI提供的ChatGPT/GPT-4模型和CodeX模型能夠很好的理解和生成業界大多數編程語言的邏輯和代碼,其中尤其擅長Python、JavaScript、TypeScript、Ruby、Go、C# 和 C++等語言,

然而在實際應用中,我們經常會在編碼時使用到一些私有框架、包、協議和DSL等,由于相關模型沒有學習最新網路資料,且這些私有資料通常也沒有發布在公開網路上,OpenAI無法根據這些私有資訊生成對應代碼,

一、OpenAI知識學習方式

OpenAI提供了幾種方式,讓OpenAI模型學習私有知識:

1. 微調模型

OpenAI支持基于現有的基礎模型,通過提供“prompt - completion”訓練資料生成私有的自定義模型,

使用方法

在執行微調作業時,需要執行下列步驟:

1. 準備訓練資料:資料需包含prompt/completion,格式支持CSV, TSV, XLSX, JSON等,

  • 格式化訓練集:openai tools fine_tunes.prepare_data -f <LOCAL_FILE>
  • LOCAL_FILE:上一步中準備好的訓練資料,

2. 訓練模型微調:openai api fine_tunes.create -t <LOCAL_FILE> -m <BASE_MODULE> --suffix "<MODEL_SUFFIX>"

  • LOCAL_FILE:上一步中準備好的訓練集,
  • BASE_MODULE:基礎模型的名稱,可選的模型包括adababbagecuriedavinci等,
  • MODEL_SUFFIX:模型名稱后綴,

3. 使用自定義模型

使用成本

在微調模型方式中,除了使用自定義模型進行推理時所需支付的費用外,訓練模型時所消耗的Tokens也會對應收取費用,根據不同的基礎模型,費用如下:

結論

使用微調模型進行私有知識學習,依賴于大量的訓練資料,訓練資料越多,微調效果越好,
此方法適用于擁有大量資料積累的場景,

2. 聊天補全

GPT模型接收對話形式的輸入,而對話按照角色進行整理,對話資料的開始包含系統角色,該訊息提供模型的初始說明,可以在系統角色中提供各種資訊,如:

  • 助手的簡要說明

  • 助手的個性特征

  • 助手需要遵循的指令或規則

  • 模型所需的資料或資訊

我們可以在聊天中,通過自定義系統角色為模型提供執行用戶指令所必要的私有資訊,

使用方法

可以在用戶提交的資料前,追加對私有知識的說明內容,

openai.createChatCompletion({
  model: "gpt-3.5-turbo",
  messages: [
    { role: "system", content: "你是一款智能聊天機器人,幫助用戶回答有關內容管理系統低代碼引擎CCMS的技術問題,智能根據下面的背景關系回答問題,如果不確定答案,可以說“我不知道”,\n\n" +
      "背景關系:\n" + 
      "- CCMS通過可視化配置方式生成中后臺管理系統頁面,其通過JSON資料格式描述頁面資訊,并在運行時渲染頁面,\n" + 
      "- CCMS支持普通串列、篩選串列、新增表單、編輯表單、詳情展示等多種頁面型別,\n" + 
      "- CCMS可以配置頁面資訊、介面定義、邏輯判斷、資料系結和頁面跳轉等互動邏輯,"
    },
    { role: "user", content: "CCMS是什么?" }
  ]
}).then((response) => response.data.choices[0].message.content);


使用成本

除了用戶所提交的內容外,系統角色所提交的關于私有知識的說明內容,也會按照Tokens消耗量進行計費,

結論

使用聊天補全進行私有知識學習,依賴于系統角色的資訊輸入,且此部分資料的Tokens消耗會隨每次用戶請求而重復計算,

此方法適用于私有知識清晰準確,且內容量較少的場景,

二、私有知識學習實踐

對于私有框架、包、協議、DSL等,通常具備比較完善的使用檔案,而較少擁有海量的用戶使用資料,所以在當前場景下,傾向于使用聊天補全的方式讓GPT學習私有知識,

而在此基礎上,如何為系統角色提供少量而精確的知識資訊,則是在保障用戶使用情況下,節省使用成本的重要方式,

3. 檢索-提問解決方案

我們可以在呼叫OpenAI提供的Chat服務前,使用用戶所提交的資訊對私有知識進行檢索,篩選出最相關的資訊,再進行Chat請求,檢索Tokens消耗,

而OpenAI所提供的嵌入(Embedding)服務則可以解決檢索階段的作業,

使用方法

1. 準備搜索資料(一次性)

  • 收集:準備完善的使用檔案,如:https://jd-orion.github.io/docs

  • 分塊:將檔案拆分為簡短的、大部分是獨立的部分,這通常是檔案中的頁面或章節,

  • 嵌入:為每一個分塊分別呼叫OpenAI API生成Embedding,

await openai.createEmbedding({
  model: "text-embedding-ada-002",
  input: fs.readFileSync('./document.md', 'utf-8').toString(),
}).then((response) => response.data.data[0].embedding);


  • 存盤:保存Embedding資料,(對于大型資料集,可以使用矢量資料庫)

2. 檢索(每次查詢一次)

  • 為用戶的提問,呼叫OpenAI API生成Embedding,(同1.3步驟)

  • 使用提問Embedding,根據與提問的相關性對私有知識的分塊Embedding進行排名,

const fs = require('fs');
const { parse } = require('csv-parse/sync');
const distance = require( 'compute-cosine-distance' );

function (input: string, topN: number) {
  const knowledge: { text: string, embedding: string, d?: number }[] = parse(fs.readFileSync('./knowledge.csv').toString());

  for (const row of knowledge) {
    row.d = distance(JSON.parse(row.embedding), input)
  }

  knowledge.sort((a, b) => a.d - b.d);

  return knowledge.slice(0, topN).map((row) => row.text));
}


3. 提問(每次查詢一次)

  • 給請求的系統角色插入與問題最相關的資訊
async function (knowledge: string[], input: string) {
  const response = await openai.createChatCompletion({
    model: "gpt-3.5-turbo",
    messages: [
      {
        role: 'system',
        content: "你是一款智能聊天機器人,幫助用戶回答有關內容管理系        統低代碼引擎CCMS的技術問題,\n\n" + knowledge.join("\n")
      },
      {
        role: 'user',
        content: input
      }
    ]
  }).then((response) => response.data.choices[0].message.content);
  return response
}


  • 回傳GPT的答案

使用成本

使用此方法,需要一次性的支付用于執行Embedding的費用,

三、低代碼自然語言搭建案例

解決了讓GPT學習私有知識的問題后,就可以開始使用GPT進行私有框架、庫、協議和DSL相關代碼的生成了,

本文以低代碼自然語言搭建為例,幫助用戶使用自然語言對所需搭建或修改的頁面進行描述,進而使用GPT對描述頁面的組態檔進行修改,并根據回傳的內容為用戶提供實時預覽服務,

使用方法

OpenAI呼叫組件

const { Configuration, OpenAIApi } = require("openai");
const openai = new OpenAIApi(new Configuration({ /** OpenAI 配置 */ }));
const distance = require('compute-cosine-distance');
const knowledge: { text: string, embedding: string, d?: number }[] = require("./knowledge")

export default function OpenAI (input, schema) {
  return new Promise((resolve, reject) => {
    // 將用戶提問資訊轉換為Embedding
    const embedding = await openai.createEmbedding({
      model: "text-embedding-ada-002",
      input,
    }).then((response) => response.data.data[0].embedding);
    
    // 獲取用戶提問與知識的相關性并排序
    for (const row of knowledge) {
      row.d = distance(JSON.parse(row.embedding), input)
    }
    knowledge.sort((a, b) => a.d - b.d);
    
    // 將相關性知識、原始代碼和用戶提問發送給GPT-3.5模型
    const message = await openai.createChatCompletion({
      model: "gpt-3.5-turbo",
      messages: [
        {
          role: 'system',
          content: "你是編程助手,需要閱讀協議知識,并按照用戶的要求修改代碼,\n\n" + 
                  "協議知識:\n\n" +
                  knowledge.slice(0, 10).map((row) => row.text).join("\n\n") + "\n\n" + 
                  "原始代碼:\n\n" +
                  "```\n" + schema + "\n```"
        },
        {
          role: 'user',
          content: input
        }
      ]
    }).then((response) => response.data.choices[0].message.content);

      // 檢查回傳訊息中是否包含Markdown語法的代碼塊標識
    let startIndex = message.indexOf('```');
    if (message.substring(startIndex, startIndex + 4) === 'json') {
      startIndex += 4;
    }

    if (startIndex > -1) {
      // 回傳訊息為Markdown語法
      let endIndex = message.indexOf('```', startIndex + 3);
      let messageConfig;

      // 需要遍歷所有代碼塊
      while (endIndex > -1) {
        try {
          messageConfig = message.substring(startIndex + 3, endIndex);

          if (
            /** messageConfig正確性校驗 */
          ) {
            resolve(messageConfig);
            break;
          }
        } catch (e) {
          /* 本次失敗 */
        }

        startIndex = message.indexOf('```', endIndex + 3);

        if (message.substring(startIndex, startIndex + 4) === 'json') {
          startIndex += 4;
        }

        if (startIndex === -1) {
          reject(['OpenAI回傳的資訊不可識別:', message]);
          break;
        }

        endIndex = message.indexOf('```', startIndex + 3);
      }
    } else {
      // 回傳訊息可能為代碼本身
      try {
        const messageConfig = message;

        if (
          /** messageConfig正確性校驗 */
        ) {
          resolve(messageConfig);
        } else {
          reject(['OpenAI回傳的資訊不可識別:', message]);
        }
      } catch (e) {
        reject(['OpenAI回傳的資訊不可識別:', message]);
      }
    }
  })
}


低代碼渲染

import React, { useState, useEffect } from 'react'
import { CCMS } from 'ccms-antd'
import OpenAI from './OpenAI'

export default function App () {
  const [ ready, setReady ] = useState(true)
  const [ schema, setSchema ] = useState({})

  const handleOpenAI = (input) => {
    OpenAI(input, schema).then((nextSchema) => {
      setReady(false)
      setSchema(nextSchema)
    })
  }

  useEffect(() => {
    setReady(true)
  }, [schema])

  return (
    <div style={{ width: '100vw', height: '100vh' }}>
      {ready && (
        <CCMS
          config={pageSchema}
          /** ... */
        />
      )}
      <div style={{ position: 'fixed', right: 385, bottom: 20, zIndex: 9999 }}>
        <Popover
          placement="topRight"
          trigger="click"
          content={
            <Form.Item label="使用OpenAI助力搭建頁面:" labelCol={{ span: 24 }}>
              <Input.TextArea
                placeholder="請在這里輸入內容,按下Shift+回車確認,"
                defaultValue=https://www.cnblogs.com/Jcloud/p/{defaultPrompt}
                onPressEnter={(e) => {
                  if (e.shiftKey) {
                    handleOpenAI(e.currentTarget.value)
                  }
                }}
              />
            
          }
        >
          

四、資訊安全

根據OpenAI隱私政策說明,使用API方式進行資料訪問時:

  1. 除非明確的授權,OpenAI不會使用用戶發送的資料進行學習和改進模型,
  2. 用戶發送的資料會被OpenAI保留30天,以用于監管和審查,(有限數量的授權OpenAI員工,以及負有保密和安全義務的專業第三方承包商,可以訪問這些資料)
  3. 用戶上傳的檔案(包括微調模型是提交的訓練資料),除非用戶洗掉,否則會一直保留,

另外,OpenAI不提供模型的私有化部署(包括上述微調模型方式所生成的自定義模型),但可以通過聯系銷售團隊購買私有容器,

文中所使用的訓練資料、私有框架知識以及低代碼框架均源自本團隊開發并已開源的內容,用戶使用相關服務時也會進行資料安全提示,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/551630.html

標籤:其他

上一篇:極速進化,光速轉錄,C++版本人工智能實時語音轉文字(字幕/語音識別)Whisper.cpp實踐

下一篇:返回列表

標籤雲
其他(158423) Python(38117) JavaScript(25399) Java(18012) C(15221) 區塊鏈(8261) C#(7972) AI(7469) 爪哇(7425) MySQL(7157) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5334) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1964) Web開發(1951) HtmlCss(1931) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 【OpenAI】私有框架代碼生成實踐

    OpenAI提供的ChatGPT/GPT-4模型和CodeX模型能夠很好的理解和生成業界大多數編程語言的邏輯和代碼,然而在實際應用中,我們經常會在編碼時使用到一些私有框架、包、協議和DSL等。由于相關模型沒有學習最新網路資料,且這些私有資料通常也沒有發布在公開網路上,OpenAI無法根據這些私有資訊... ......

    uj5u.com 2023-05-05 08:50:20 more
  • 極速進化,光速轉錄,C++版本人工智能實時語音轉文字(字幕/語音識

    業界良心OpenAI開源的Whisper模型是開源語音轉文字領域的執牛耳者,白璧微瑕之處在于無法通過蘋果M芯片優化轉錄效率,Whisper.cpp 則是 Whisper 模型的 C/C++ 移植版本,它具有無依賴項、記憶體使用量低等特點,重要的是增加了 Core ML 支持,完美適配蘋果M系列芯片。 ......

    uj5u.com 2023-05-05 08:50:14 more
  • pytorch&scikit-learn機器學1- 賦予計算機從資料中學習的能力

    在我看來,機器學習即對資料有意義的演算法的應用和科學,是所有計算機科學中最令人興奮的領域!利用機器學習領域的自學演算法,我們可以將這些資料轉化為知識。 在本章中,我們將涵蓋以下主題: 機器學習的一般概念 三種型別的學習和基本術語 成功設計機器學習系統的基石 安裝和設定用于資料分析和機器學習的Python ......

    uj5u.com 2023-05-05 08:49:56 more
  • vCenter報錯:Log Disk Exhaustion on 10

    vCenter報錯:Log Disk Exhaustion on 10 1、問題現象: 巡檢時發現 vCenter Server 中,錯誤顯示為:Log Disk Exhaustion on 10(字面意思是日志磁盤耗盡),VC版本 6.7 在瀏覽器輸入https://appliance-IP-ad ......

    uj5u.com 2023-05-05 08:44:14 more
  • 工業互聯網:加速從“中國制造”邁向“中國智造”

    摘要:在推進制造業智能化的程序中,除設備本身數字化外,基于工業互聯網實作設備互聯和全流程智能化已成為最重要方向之一。 本文分享自華為云社區《【華為云Stack】【大架光臨】第18期:工業互聯網:加速從“中國制造”邁向“中國智造”》,作者:華為云Stack 制造行業總經理 崔新。 隨著全球數字化浪潮的 ......

    uj5u.com 2023-05-05 08:38:57 more
  • Codeforces Round 867 (Div. 3)

    A. TubeTube Feed 分析: 從所有a[i]+i-1<=t的選擇種取個max即可 code: #include <bits/stdc++.h> using namespace std; const int N = 55; int a[N], b[N]; int main() { std: ......

    uj5u.com 2023-05-05 08:38:06 more
  • [Week 19]每日一題(C++,數學,并查集,動態規劃)

    [Daimayuan] T1 倒數第n個字串(C++,進制) 給定一個完全由小寫英文字母組成的字串等差遞增序列,該序列中的每個字串的長度固定為 $L$,從 $L$ 個 $a$ 開始,以 $1$ 為步長遞增。例如當 $L$ 為 $3$ 時,序列為 $aaa,aab,aac,...,aaz,aba ......

    uj5u.com 2023-05-05 08:38:00 more
  • 基于MobileNet的人臉表情識別系統(MATLAB GUI版+原理詳解)

    本篇博客介紹了基于MobileNet的人臉表情識別系統,支持圖片識別、視頻識別、攝像頭識別等多種形式,通過GUI界面實作表情識別可視化展示。首先介紹了表情識別任務的背景與意義,總結近年來利用深度學習進行表情識別的相關技術和作業。在資料集選擇上,本文選擇了Fer2013和CK+兩個資料集,并使用MAT... ......

    uj5u.com 2023-05-05 08:37:07 more
  • FreeSWITCH對接vosk實作實時語音識別

    環境:CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Python版本:3.9.2 一、背景描述 vosk是一個開源語音識別工具,可識別中文,之前介紹過python使用vosk進行中文語音識別,今天記錄下FreeSWITCH對接vosk實作實時語音識別。 vosk離線語音識別 ......

    uj5u.com 2023-05-05 08:36:15 more
  • 根據 大峽谷國家公園, 寫一首李白風格的詩

    大峽谷,天然屏障, 險峻絕壁擋云霄。 沉淀歲月千萬載, 鬼斧神工刻畫成。 石壁上,千仞懸崖, 奇峰怪石聳蒼天。 百里觀音俯世間, 宏偉壯闊震人心。 流云間,孤鷹翱翔, 蔚藍天空放眼望。 仰望群峰云霧里, 猶如仙境夢中藏。 李白曾譜華章詩, 今我到此嘆驚嘆。 壯觀壯美妙不可言, 大自然之美亙古傳。 ......

    uj5u.com 2023-05-05 08:35:29 more