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

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

2023-05-05 09:03:46 其他

作者:京東零售 牛曉光

根據現有調研和實踐,由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/archive/2023/05/04/{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/551639.html

標籤:其他

上一篇:【手記】翻新顯卡安裝驅動程式

下一篇:返回列表

標籤雲
其他(158432) 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 09:03:46 more
  • 【手記】翻新顯卡安裝驅動程式

    只嘗試過N卡,A卡不知道適不適用。 解包驅動程式到目錄。正常運行驅動程式,它會先解壓到c:\nvidia\xxx,然后報錯,此時不要把報錯叉掉,因為叉掉后剛剛解壓得到的c:\nvidia會被刪掉,而我們要的就是這個目錄,所以要趁這個時候,把c:\nvidia復制一份,然后再叉報錯,這樣就得到了一個解 ......

    uj5u.com 2023-05-05 09:03:36 more
  • 阿里測驗經驗7年,從功能測驗到自動化測驗,我整理的超全學習指南

    在阿里做測驗七年多,有不少人問過我下面問題:現在的手工測驗真的不行了嗎?測驗工程師,三年多快四年的經驗,入門自動化測驗需要多久?自學自動化測驗到底需要學哪些東西? ......

    uj5u.com 2023-05-05 09:03:13 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 09:02:46 more
  • 軟體測驗工程師——你不僅僅應該會點點點

    你眼中的軟體測驗崗位是怎樣的?大部分人可能會給出這樣的回答:“測驗?簡單啊,沒什么技術含量,無非就是看需求、看業務手冊、看設計檔案、然后點點功能是否實作,麻煩點的就是測驗下部署安裝是否出現兼容性問題等 。” ......

    uj5u.com 2023-05-05 09:02:33 more
  • 寫一首李白風格的詩

    秋風蕭瑟天氣涼, 草木搖蕩露為霜。 白露未晞凝冰片, 素林初靜露沾裳。 落葉舞飛皆似雪, 游魚翻躍不驚浪。 乘興南游忘歸期, 四海云山皆可望。 ......

    uj5u.com 2023-05-05 09:02:28 more
  • 優化演算法-從梯度下降到深度學習非凸優化

    一、數學優化 1.1 定義 Mathematical Optimization(數學優化)問題,亦稱最優化問題,是指在一定約束條件下,求解一個目標函式的最大值(或最小值)問題。 根據輸入變數 𝑿 的值域是否為實數域,數學優化問題可以分為離散優化問題和連續優化問題. 在連續優化問題中,根據是否有變數 ......

    uj5u.com 2023-05-05 09:01:48 more
  • 【動手學深度學習】第十二章筆記:異步計算、資料并行

    為了更好的閱讀體驗,請點擊這里 12.1 編譯器和解釋器 原書主要關注的是命令式編程(imperative programming)。Python 是一種解釋性語言,因此沒有編譯器給代碼優化,代碼會跑得很慢。 12.1.1 符號式編程 考慮另一種選擇符號式編程(symbolic programmin ......

    uj5u.com 2023-05-05 09:01:11 more
  • 基于YOLOv4的目標檢測系統(附MATLAB代碼+GUI實作)

    本文介紹了一種MATLAB實作的目標檢測系統代碼,采用 YOLOv4 檢測網路作為核心模型,用于訓練和檢測各種任務下的目標,并在GUI界面中對各種目標檢測結果可視化。文章詳細介紹了YOLOv4的實作程序,包括演算法原理、MATLAB 實作代碼、訓練資料集、訓練程序和圖形用戶界面。在GUI界面中,用戶可... ......

    uj5u.com 2023-05-05 08:55:32 more
  • 【OpenAI】私有框架代碼生成實踐

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

    uj5u.com 2023-05-05 08:50:20 more