主頁 >  其他 > 用ChatGPT搭建代碼知識庫,提升開發效率

用ChatGPT搭建代碼知識庫,提升開發效率

2023-07-13 08:54:46 其他

ChatGPT 是一種強大的自然語言處理模型,
在作業中,我們可以借助其卓越的自然語言生成能力,快速檢索代碼資訊,使程式員們能更加專注于業務邏輯的實作和優化,
然而,由于它的知識庫僅覆寫至 2021 年 9 月前的資訊,一些新的技術檔案無法被查詢到,例如我們公司前端經常使用的開源框架 TDesign,
本文講解了本人為了解決這一痛點的實驗程序,即通過應用 embedding 技術并結合 AST 解釋器,實作了對 TDesign 代碼知識庫的自然語言查詢,
在 30 個常見用例的測驗下,查詢精度達到了 90%,常用組件的檢索時間從平均 10 分鐘縮短至 2 分鐘,從而提升了前端研發效率 20%,

1. 知識庫搭建

ChatGPT 的資料覆寫范圍僅至 2021 年 9 月前,這意味著如果出現了 2021 年 9 月之后的新資訊或技術,ChatGPT 可能無法提供準確的答案或建議,例如,前端開發中經常使用的公司開源專案 TDesign 就是一個例子:

圖片

幸運的是,針對這個問題,業界已經提供了解決方案——構建知識庫,一般有兩種路徑:

首選的方法是對開源的大型語言模型(LLM)進行全面或部分的微調,采用 fine-tune 或者 LoRA 技術,這種方法的優點在于,它能使 LLM“記住”特定的領域知識,從而在擁有特定知識背景的條件下進行交流,如“貓娘”或“客服機器人”等,此外,因為采用了私有部署,這種方案適合用于一些尚未公開的公司內部知識,然而,這種微調方案的缺點在于,它需要大量的 GPU 算力支持,且除錯程序耗時較長,

第二種方法是利用嵌入技術(embedding),通過嵌入模型,將特定知識轉化為向量,然后將這些向量存入相應的向量資料庫中,在查詢階段,通過相似度查詢,匹配出關聯的 topK 結果,然后將這些結果提供給 LLM,生成相應的答案,這種方法的優點在于,OpenAI 提供了對應的 text-ada-embedding-002 模型,價格合理,效果也相當出色,然而,其缺點是可能不適合處理內部資料,存在資料泄露的風險,這里我要特別提醒一下,資料安全,人人有責,大家在實踐程序中一定要防止敏感資料泄露的風險,

在對兩種方案進行對比分析后:

1、考慮到 TDesign 已經在公網開源,因此相關資料并不涉及敏感資訊;

2、當前公司的算力資源較為緊張,且微調方案的除錯時間成本偏高;

我最終決定選擇embedding 方案進行實施,

最終效果如下:

Q: 在 TDesign 中,如何校驗表單,寫出代碼:

圖片

2. 實作程序

實作原理圖

圖片

這里面我著重講一下資料準備和處理程序,

1. 資料格式:

這里主要參考了 github 上面的 MrRanedeer 專案: https://github.com/JushBJJ/Mr.-Ranedeer-AI-Tutor ,借鑒他的知識描述方式和資訊組織的格式,綜合對比之后采用了 JSON 的資料格式;

圖片

2. 資料準備:

我是直接從 TDesign 的官網( https://tdesign.tencent.com/vue-next/overview )上,提取所需資料,選取的版本是適用于 vue3 的 tdesign-vue-next,

起初,我的計劃是:組件檔案說明 + 組件代碼 few shots ,以讓 chatGPT 直接理解相應組件的規則,然后生成相關的代碼,然而,實踐證明這種做法效果并不理想,即使結合 prompt 提示進行優化,其最終效果也相對有限,(原因估計是太多的特有名詞模型理解不了,導致產生了幻覺(hullucination))

圖片

最后我決定直接利用 TDesign 中的場景描述和代碼演示,

圖片

調整后的資料結構如下:組件 -> 使用場景 -> {場景描述 & 代碼},

圖片

3. 資料向量化:

我們將使用常見的 LLM 對接工具 Langchain 和它的 Text Splitter 工具,具體來說,我們使用的是RecursiveCharacterTextSpliter,它能在盡可能保證句子語意完整的前提下根據 ChunkSize 進行分段,但是由于 chunkSize 的局限和知識文章長度的不確定導致很多時候,切片后語意的丟失,比如:

{"小明的自我介紹": "大家好叫小明,我的愛好是足球和繪畫"},如果文本在小明這里被截斷,后續搜索"小明的介紹",大概率不會將"小明"和后面的"我的愛好是足球和繪畫"的資訊匹配到一起,而導致在資料召回階段沒辦法得到準確的知識,

關于這一點的優化我會在后面說明,

4. 資料檢索:

這個階段主要是通過提出的問題,搜索向量資料庫中匹配的資訊,與系統 prompt 整合之后傳給 openai competition 完成知識檢索,

代碼如下:

圖片

使用的 prompt 如下:

圖片

3. 效果展示

在 30 個常見的問題中,一共存在 7 個 bad case(錯誤答案,存在大量幻覺(hullucination)),3 個 not perfect(回答正確,但是有瑕疵,比如上傳圖片實作為上傳檔案),其余回答正確,正確率 20/30 = 66.7%,可用率 23/30 = 76.7%,

原因分析:

1. 多維度知識匹配能力有限,比如同時檢索 form,button,input,select 等組件組合的問題,由于 vectorStore.similaritySearch 程序中 topK 召回的數量有限,且 context 長度有限,會造成多維度知識檢索的能力偏弱

2. 知識切片不連貫導致的背景關系資訊丟失,正如上文提到的小明的例子

{"小明的自我介紹": "大家好叫小明,我的愛好是足球和繪畫"},如果文本在小明這里被截斷,后面的資訊就丟失了"小明的自我介紹"的上下問資訊,導致召回失敗,

 

4. 方案優化

1、針對上面提到兩點影響因素,第一個方案可以通過優化 chunkSize 和 topK 的引數進行微除錯錯,但是總的來說當查詢維度提升,所需的背景關系資訊也會相應增多,但這可能受到 LLM 的背景關系長度限制的約束,關于這一點筆者寫文章時已經拿到了 claude 100k 背景關系的 api,會在未來進一步的測驗

2、針對第二點切片的導致的上下問資訊丟失,筆者想出的方案是:通過 JS 解釋器將檔案資訊轉換成 Javascript AST(抽象語法樹),每次切片記錄當前索引所在的 scope 資訊,從而標記出當前切片的背景關系資訊,(體驗 AST: https://astexplorer.net/ )

抽象語法樹展示:

圖片

可以看到在抽象語法樹中,如果處理的是 JSON 物件,無論是 key 還是 value 都是能定位到他的字面量字串的索引區間,所以只要知道我們每次分片的開始和結束的索引,我們就能定位到他在 AST 中的位置,當知道這個位置之后我們就可以通過演算法回溯到當前片段的所有父級 key,也就是說只要我們的父級 key 足夠語意化,我們背景關系的資訊就更加完整,

通過學習 langchain 中 RecursiveCharacterTextSpliter 的原始碼,我們是可以通過 indexChunk 的值得到每次切片時的索引,

圖片

通過演算法計算,可以得到每個切片的開頭和結尾的一個背景關系資訊,效果如下:

圖片

如果套用到前文提到的小明的例子的話,第二段"我的愛好是足球和繪畫"的 scope 資訊就是 {startScope: "小明的自我介紹",endScope: ""},如果我們通過特定格式將他拼接到知識資訊中去就會是:

> > > startScopeStr:"小明的自我介紹"<<<,我的愛好是足球和繪畫>>>endScopeStr:""<<<

現在如果使用"小明的興趣愛好"來匹配并召回 embedding 片段,并喂給 LLM,就能得到準確的答案了,

最后可以在 prompt 中通過 few shots 進一步優化匹配,到此為止優化流程就完成了,

圖片

5. 效果展示

經過上述 AST 優化,最終得到了顯著的優化結果,統計結果顯示,錯誤答案(Bad Case)已減少至 3 個,回答尚有瑕疵(Not Perfect)的數量也降至 2 個,這樣計算下來,正確率達到了 83.3%(25/30),可用率為 90%(27/30),在當前樣本集下,正確率提升了 15.6%,可用率也提升了 13.3%,

部分效果展示

Q: 如何實作帶搜索框的穿梭框

圖片

Q: 使用 TDesign,如何幫我實作一個圣杯布局:

圖片

6. 更多的思考

在整個實驗中,我們可以看到,雖然通過 embedding 方案我們可以顯著提升 ChatGPT 對新知識的理解和應用,但這仍然是一個逐步調優和改善的程序,這引發了我對于以下幾個方向的思考:

  1. 資料質量:專案中用到的高質量 TDesign 檔案,但在處理更復雜的知識庫時,資料質量可能下降,如何在復雜資料下保證資料質量是我們需要深思的問題;
  2. 測驗評估:目前測驗的方法不夠標準化,無法量化的評估 embedding 的效果,需要制定可量化的評估標準;
  3. 多維度和長篇幅知識整合:對于涉及多個組件和背景關系比較長的組件用例的查詢,模型的處理能力有限,我們需要研究如何有效整合多維度和長下文的知識;
  4. 維護模型效果:隨著知識庫的更新和擴大,如何有效地更新模型以保持其在新知識上的表現是一個挑戰;
  5. 資料安全:最后還是想要強調一下,切勿使用敏感資料和代碼來進行處理,切勿泄露公司敏感資訊,

參考

[1]langchain.js ? building applications with llms through composability ?

[2]vue next for web tdesign 適配桌面端的組件庫,適合在 vue3.x 技術堆疊專案中使用

[3] https://community.openai.com/t/the-length-of-the-embedding-contents/111471/12

[4] https://github.com/jushbjj/mr.-ranedeer-ai-tutor

 

作者:teng

本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/Building-a-code-knowledge-base-using-ChatGPT-to-improve-development-efficiency.html

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

標籤:其他

上一篇:用ChatGPT搭建代碼知識庫,提升開發效率

下一篇:返回列表

標籤雲
其他(162509) Python(38275) JavaScript(25532) Java(18295) C(15242) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7299) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4616) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2439) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) HtmlCss(2002) .NET技术(1988) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1884) .NETCore(1863) 谷歌表格(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
最新发布
  • 用ChatGPT搭建代碼知識庫,提升開發效率

    ChatGPT 是一種強大的自然語言處理模型。在作業中,我們可以借助其卓越的自然語言生成能力,快速檢索代碼資訊,使程式員們能更加專注于業務邏輯的實作和優化。然而,由于它的知識庫僅覆寫至 2021 年 9 月前的資訊,一些新的技術檔案無法被查詢到,例如我們公司前端經常使用的開源框架 TDesign。本... ......

    uj5u.com 2023-07-13 08:54:46 more
  • 用ChatGPT搭建代碼知識庫,提升開發效率

    ChatGPT 是一種強大的自然語言處理模型。在作業中,我們可以借助其卓越的自然語言生成能力,快速檢索代碼資訊,使程式員們能更加專注于業務邏輯的實作和優化。然而,由于它的知識庫僅覆寫至 2021 年 9 月前的資訊,一些新的技術檔案無法被查詢到,例如我們公司前端經常使用的開源框架 TDesign。本... ......

    uj5u.com 2023-07-13 08:48:40 more
  • 給程式員準備的“蜜糍”--SOD框架簡介

    以前有一個著名的國產化妝品“*大寶SOD密*”,**SOD框架**雖然跟它沒有什么關系,但是名字的確受到它的啟發,因為SOD框架就是給程式員準備的“蜜糍”(一種含有蜂蜜的糍粑),簡單靈活且非常容易“上手”。 ......

    uj5u.com 2023-07-13 08:22:50 more
  • 集成測驗最全詳解,看完必須懂了

    集成測驗(Integration Testing),也叫組裝測驗或聯合測驗。在單元測驗的基礎上,將所有模塊按照設計要求(如根據結構圖)組裝成為子系統或系統,進行集成測驗。 ......

    uj5u.com 2023-07-13 08:22:44 more
  • 資料結構-鏈表帶哨兵

    ## 一.鏈表帶哨兵 ```java import java.util.Iterator; import java.util.function.Consumer; //帶哨兵 public class shuju02 implements Iterable {//整體 private Node he ......

    uj5u.com 2023-07-13 08:22:38 more
  • 量子糾纏:超越時空的連接

    量子糾纏是一種特殊的量子態,它涉及到兩個或多個量子系統之間的緊密聯系。當這些系統處于糾纏態時,它們之間的狀態無法獨立地描述,即使它們被物理上分離開來。量子糾纏是量子力學中的非局域現象,可以超越時空的距離,為我們提供了一種超越經典物理的聯系方式。 ......

    uj5u.com 2023-07-13 08:22:31 more
  • 后端性能測驗的型別

    ## 性能測驗的型別 性能測驗:確定軟體產品性能的測驗。 ![image](https://img2023.cnblogs.com/blog/3174021/202307/3174021-20230712162602710-1541606934.png) ### 負載測驗(load testing) ......

    uj5u.com 2023-07-13 08:22:16 more
  • SRS之StateThreads學習

    最近在看SRS的原始碼。SRS是基于協程開發的,底層使用了StateThreads。所以為了充分的理解SRS原始碼,需要先學習一下StateThreads。這里對StateThreads的學習做了一些總結和記錄。 ......

    uj5u.com 2023-07-13 08:22:05 more
  • LEA: Improving Sentence Similarity Robustness to Typos Using

    # LEA: Improving Sentence Similarity Robustness to Typos Using Lexical Attention Bias 論文閱讀 KDD 2023 [原文地址](https://arxiv.org/abs/2307.02912) ## Introd ......

    uj5u.com 2023-07-13 08:21:46 more
  • python實作兩函式通過縮放,平移和旋轉進行完美擬合

    # Curve _fitting 前幾天在作業的時候接到了一個需求,希望將不同坐標系,不同角度的兩條不規則曲線,并且組成該曲線的點集數量不一致,需求是希望那個可以通過演算法的平移和旋轉搞到一個概念里最貼合,擬合態進行比較。 ![image-20230712151728578](https://img2 ......

    uj5u.com 2023-07-13 08:21:22 more