中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

汕頭市企業(yè)網(wǎng)站建設(shè)教程百度廣告管家

汕頭市企業(yè)網(wǎng)站建設(shè)教程,百度廣告管家,網(wǎng)站建設(shè)與管理教材,58同城通遼做網(wǎng)站全文共1w余字,預(yù)計(jì)閱讀時(shí)間約40~60分鐘 | 滿滿干貨(附代碼),建議收藏! 本文目標(biāo):通過LtM提示流程實(shí)現(xiàn)自動(dòng)構(gòu)建符合要求的函數(shù),并通過實(shí)驗(yàn)逐步完整測(cè)試code_generate函數(shù)功能。 代碼下載點(diǎn)這里 一、介紹 此篇文章為…

全文共1w余字,預(yù)計(jì)閱讀時(shí)間約40~60分鐘 | 滿滿干貨(附代碼),建議收藏!

本文目標(biāo):通過LtM提示流程實(shí)現(xiàn)自動(dòng)構(gòu)建符合要求的函數(shù),并通過實(shí)驗(yàn)逐步完整測(cè)試code_generate函數(shù)功能。
在這里插入圖片描述

代碼下載點(diǎn)這里

一、介紹

此篇文章為從0到1構(gòu)建一個(gè)高度自動(dòng)化的AI項(xiàng)目開發(fā)流程的第二篇,在大模型開發(fā)(十五):從0到1構(gòu)建一個(gè)高度自動(dòng)化的AI項(xiàng)目開發(fā)流程(上)中已經(jīng)實(shí)現(xiàn)了第一部分的優(yōu)化:完整的執(zhí)行引導(dǎo)Chat模型創(chuàng)建外部函數(shù)代碼、代碼管理以及測(cè)試的全部流程。此文將提出一種“全自動(dòng)函數(shù)編寫策略”的解決思路,進(jìn)一步深化大模型在實(shí)際開發(fā)過程中的作用,即嘗試梳理當(dāng)前開發(fā)流程中的核心環(huán)節(jié),并嘗試借助Chat模型完成各核心環(huán)節(jié)的工作。

image-20230801135253001

二、利用Chat模型自動(dòng)實(shí)現(xiàn)需求函數(shù)的編寫

2.1 借助Few-shot完成需求函數(shù)的自動(dòng)編寫

在之前的流程中,已經(jīng)實(shí)現(xiàn)了圍繞某個(gè)具體的需求實(shí)現(xiàn)了讓Chat模型自己編寫代碼完成需求的功能,因此,現(xiàn)在距離讓智能郵件收發(fā)系統(tǒng)實(shí)現(xiàn)功能上的自生長(zhǎng)就還剩下最后的關(guān)鍵一步,那就是將用戶的實(shí)時(shí)需求進(jìn)行翻譯和整理,并形成一整套自動(dòng)代碼流程和提示方法,來引導(dǎo)模型進(jìn)行對(duì)應(yīng)的外部函數(shù)創(chuàng)建。

這一步是非常重要的,比如在當(dāng)前對(duì)話過程中,用戶提出了一個(gè)全新的需求:查看郵箱里是否有某位重要人物的未讀郵件,并解讀郵件里面的內(nèi)容。此前定義的一系列外部函數(shù)都無法滿足當(dāng)前需求,回顧一下之前定義的四個(gè)函數(shù):

functions_list = [get_recent_emails, send_email, get_latest_email, get_email_count]
functions = auto_functions(functions_list)

各外部函數(shù)JSON Schema格式的描述如下:

image-20230801141802674

如果此時(shí)使用這些外部函數(shù),來回答新需求:查看郵箱里是否有某位重要人物的未讀郵件,并解讀郵件里面的內(nèi)容

messages = [{"role": "user", "content": '請(qǐng)幫我查詢一下我的Gmail郵箱中是否有來自算法小陳的未讀郵件,如果有的話請(qǐng)幫我解讀下郵件內(nèi)容。'}]response = openai.ChatCompletion.create(model="gpt-4-0613",messages=messages,functions=functions,function_call="auto",  )

此時(shí)的輸出是這樣的:

image-20230801142348526

針對(duì)這個(gè)問答,模型找到了get_recent_emails函數(shù),看起來貌似是對(duì)了,但是當(dāng)使用response.choices[0].message[‘content’]查看返回內(nèi)容的時(shí)候,會(huì)發(fā)現(xiàn)返回的內(nèi)容數(shù)據(jù)是空的,很容易發(fā)現(xiàn),從功能實(shí)現(xiàn)角度來說,這個(gè)功能和查詢最近若干封郵件信息屬于類似的功能,但還是存在需求上的差異,為了避免這種讓大模型混淆的外部函數(shù),是需要進(jìn)一步根據(jù)新需求創(chuàng)建新的外部函數(shù)。

所以一個(gè)比較好的解決思路就是:通過提示工程讓大模型(LLMs)自動(dòng)完成新增功能。上述過程是這樣的:

1

提示詞過程其實(shí)就是一個(gè)指令翻譯過程,和大模型開發(fā)(九):基于Few-Shot-LtM提示工程復(fù)現(xiàn)SCAN數(shù)據(jù)集下的指令翻譯任務(wù)復(fù)現(xiàn)的任務(wù)類似,唯一不同的是,對(duì)于SCAN指令翻譯,其背后是一套完全不同于自然語言的語法規(guī)則,而當(dāng)前指令翻譯任務(wù)相對(duì)簡(jiǎn)單,輸入和輸出都是可以基于自然語言的語義對(duì)其進(jìn)行理解的,其背后的語法規(guī)則相對(duì)清晰。

所以從指令翻譯的角度來思考,是否可以通過Few-shot提示法來給大模型賦能呢?所以做了下面一系列的測(cè)試:

  • Step 1:構(gòu)建提示詞

直接使用這里大模型開發(fā)(十五):從0到1構(gòu)建一個(gè)高度自動(dòng)化的AI項(xiàng)目開發(fā)流程(上)中手寫的兩個(gè)創(chuàng)建外部函數(shù)的示例,如下:

get_email_input = "請(qǐng)幫我查下郵箱里最后一封郵件內(nèi)容。"get_email_out = "請(qǐng)幫我編寫一個(gè)python函數(shù),用于查看我的Gmail郵箱中最后一封郵件信息,函數(shù)要求如下:\1.函數(shù)參數(shù)userId,userId是字符串參數(shù),默認(rèn)情況下取值為'me',表示查看我的郵件;\2.函數(shù)返回結(jié)果是一個(gè)包含最后一封郵件信息的對(duì)象,返回結(jié)果本身必須是一個(gè)json格式對(duì)象;\3.請(qǐng)將全部功能封裝在一個(gè)函數(shù)內(nèi);\4.請(qǐng)?jiān)诤瘮?shù)編寫過程中,在函數(shù)內(nèi)部加入中文編寫的詳細(xì)的函數(shù)說明文檔,用于說明函數(shù)功能、函數(shù)參數(shù)情況以及函數(shù)返回結(jié)果等信息;"email_counts_input = "請(qǐng)幫我查下郵箱里現(xiàn)在總共有多少封郵件。"email_counts_out = "請(qǐng)幫我編寫一個(gè)python函數(shù),用于查看我的Gmail郵箱中總共有多少封郵件,函數(shù)要求如下:\1.函數(shù)參數(shù)userId,userId是字符串參數(shù),默認(rèn)情況下取值為'me',表示查看我的郵件;\2.函數(shù)返回結(jié)果是當(dāng)前郵件總數(shù),返回結(jié)果本身必須是一個(gè)json格式對(duì)象;\3.請(qǐng)將全部功能封裝在一個(gè)函數(shù)內(nèi);\4.請(qǐng)?jiān)诤瘮?shù)編寫過程中,在函數(shù)內(nèi)部加入中文編寫的詳細(xì)的函數(shù)說明文檔,用于說明函數(shù)功能、函數(shù)參數(shù)情況以及函數(shù)返回結(jié)果等信息;"
  • Step 2:拼接成Few-shot的輸入形式
user_content = "請(qǐng)查下我的郵箱里是否有來自無敵小怪獸的未讀郵件,并解讀最近一封未讀郵件的內(nèi)容"messages_fewShot_stage1 = [{"role": "system", "content": "請(qǐng)按照格式,編寫一段函數(shù)功能說明。"},{"role": "user", "name":"example1_user", "content": get_email_input},{"role": "assistant", "name":"example1_assistant", "content": get_email_out},{"role": "user", "name":"example2_user", "content": email_counts_input},{"role": "assistant", "name":"example2_assistant", "content": email_counts_out},{"role": "user", "name":"example_user", "content": user_content}]
messages_fewShot_stage1

看下輸出結(jié)果:

image-20230801160939396

  • Step 3:調(diào)用GPT 4.0 API
response = openai.ChatCompletion.create(model="gpt-4-0613",messages=messages_fewShot_stage1
)

看一下輸出結(jié)果:

image-20230801161212809

通過這段返回結(jié)果,其實(shí)能看出模型可以較好的學(xué)習(xí)到Few-shot提示示例的指令翻譯規(guī)范,進(jìn)一步測(cè)試一下。

  • Step 4:功能測(cè)試

讀取之前本地已經(jīng)存儲(chǔ)好的get_latest_email()外部函數(shù):

with open('./functions/tested functions/%s_module.py' % 'get_latest_email', encoding='utf-8') as f:assistant_example_content = f.read()

描述是這樣的:

image-20230801163440567

在Step 3 中GPT 4.0 API給生成的函數(shù)描述是這樣的:

image-20230801163810269

  • Step 5:構(gòu)建測(cè)試的提示詞
messages_fewShot_stage2 = [{"role": "system", "content": system_content},{"role": "user", "name":"example_user", "content": user_example_content},{"role": "assistant", "name":"example_assistant", "content": assistant_example_content},{"role": "user", "name":"example_user", "content": user_content}]messages_fewShot_stage2

輸出是這樣的:

image-20230801163951867

  • Step 6:再次調(diào)用GPT 4.0 API
response = openai.ChatCompletion.create(model="gpt-4-0613",messages=messages_fewShot_stage2
)

結(jié)果輸出是這樣的:

image-20230801164230288

  • Step 7:提取為本地代碼文件
def extract_function_code(s, detail=0, tested=False):"""函數(shù)提取函數(shù),同時(shí)執(zhí)行函數(shù)內(nèi)容,可以選擇打印函數(shù)信息,并選擇代碼保存的地址"""def extract_code(s):"""如果輸入的字符串s是一個(gè)包含Python代碼的Markdown格式字符串,提取出代碼部分。否則,返回原字符串。參數(shù):s: 輸入的字符串。返回:提取出的代碼部分,或原字符串。"""# 判斷字符串是否是Markdown格式if '```python' in s or 'Python' in s or'PYTHON' in s:# 找到代碼塊的開始和結(jié)束位置code_start = s.find('def')code_end = s.find('```\n', code_start)# 提取代碼部分code = s[code_start:code_end]else:# 如果字符串不是Markdown格式,返回原字符串code = sreturn code# 提取代碼字符串code = extract_code(s)# 提取函數(shù)名稱match = re.search(r'def (\w+)', code)function_name = match.group(1)# 將函數(shù)寫入本地if tested == False:with open('./functions/untested functions/%s_module.py' % function_name, 'w', encoding='utf-8') as f:f.write(code)else:with open('./functions/tested functions/%s_module.py' % function_name, 'w', encoding='utf-8') as f:f.write(code)# 執(zhí)行該函數(shù)try:exec(code, globals())except Exception as e:print("An error occurred while executing the code:")print(e)# 打印函數(shù)名稱if detail == 0:print("The function name is:%s" % function_name)if detail == 1:with open('./functions/untested functions/%s_module.py' % function_name, encoding='utf-8') as f:content = f.read()print(content)

看一下代碼描述:

image-20230801164904223

從測(cè)試結(jié)果上看,這個(gè)函數(shù)確實(shí)是沒什么問題的,基本上已經(jīng)能借助Few-shot來完成函數(shù)的自動(dòng)創(chuàng)建。

2.2 借助LtM提示流程完成更穩(wěn)定的函數(shù)編寫

大語言模型(LLMs)生成的內(nèi)容并不是固定的,雖然Few-shot在一定程度上能解決自動(dòng)編寫函數(shù)的需求,但在實(shí)際的測(cè)試過程中,Few-shot還不是特別的穩(wěn)定,一個(gè)有效而且容易想到的解決辦法就是使用更強(qiáng)的提示方法:如LtM提示法。

在大模型開發(fā)(八):基于思維鏈(CoT)的進(jìn)階提示工程這篇文章中已經(jīng)用大量實(shí)驗(yàn)證明,LtM就是目前為止最有效的提示方法,通過多段提示策略并結(jié)合當(dāng)前指令翻譯任務(wù)考慮,一種更有希望能夠引導(dǎo)模型能夠順利完成指令翻譯流程的提示方法是:先引導(dǎo)模型拆解當(dāng)前需求中的“變量”作為后續(xù)函數(shù)的參數(shù),然后再基于已經(jīng)確定的變量,引導(dǎo)模型完成翻譯工作。

就整個(gè)指令翻譯任務(wù)來說,最難的地方也就在于函數(shù)參數(shù)的理解過程,一旦模型能夠準(zhǔn)確的翻譯出外部函數(shù)需要哪些參數(shù),其他部分的翻譯任務(wù)自然迎刃而解。所以優(yōu)化第一階段提示流程后,一個(gè)比較好的整體提示過程如下:

2

讓模型合理的分析符合當(dāng)前需求的參數(shù)設(shè)置,是一種提高函數(shù)復(fù)用率的措施。例如現(xiàn)在想查詢來自無敵小怪獸的未讀郵件,若模型可以將讀取“誰”的未讀郵件視作一個(gè)變量,即將讀取郵件的對(duì)象設(shè)置為參數(shù),則可以更好的提升后續(xù)該函數(shù)的復(fù)用率。

如果還不理解LtM提示過程的,強(qiáng)烈建議先看完這一篇再繼續(xù)本文:大模型開發(fā)(八):基于思維鏈(CoT)的進(jìn)階提示工程

看一下LtM的流程圖:

image-20230719153447415

對(duì)于LtM提示有兩個(gè)階段,第一個(gè)階段的提示命名為Command decomposition,簡(jiǎn)寫為CD,第二階段的提示命名為Command mapping,簡(jiǎn)寫為CM。

image-20230719153925634

  • Step 1:使用Few-shot構(gòu)建拆分子問題的示例

以“查看最后一封郵件內(nèi)容”和“發(fā)送郵件”這兩個(gè)函數(shù)作為L(zhǎng)tM提示的兩個(gè)階段的示例,其使用Few-shot提示首先要做示例的子問題拆解,如下:

system_content1 = "為了更好編寫滿足用戶需求的python函數(shù),我們需要先識(shí)別用戶需求中的變量,以作為python函數(shù)的參數(shù)。需要注意的是,當(dāng)前編寫的函數(shù)中涉及到的郵件收發(fā)查閱等功能,都是通過調(diào)用Gmail API來完成。"input1 = "請(qǐng)幫我查下Gmail郵箱里最后一封郵件內(nèi)容。"
pi1 = "當(dāng)前需求中可以作為函數(shù)參數(shù)的是:1.查看誰的郵箱。"input2 = "請(qǐng)幫我給小陳發(fā)送一封Gmail郵件,請(qǐng)他明天早上9點(diǎn)半來我辦公室開會(huì),商量我的100億應(yīng)該怎么花。"
pi2 = "當(dāng)前需求中可以作為函數(shù)參數(shù)的是:1.發(fā)送郵件的對(duì)象;2.發(fā)送郵件的主題;3.郵件具體內(nèi)容"input3 = "請(qǐng)查下我的郵箱里是否有來自無敵小怪獸的未讀郵件,并解讀最近一封未讀郵件的內(nèi)容。"
  • Step 2:創(chuàng)建Prompt
messages_CD = [{"role": "system", "content": system_content1},{"role": "user", "name":"example1_user", "content": input1},{"role": "assistant", "name":"example1_assistant", "content": pi1},{"role": "user", "name":"example2_user", "content": input2},{"role": "assistant", "name":"example2_assistant", "content": pi2},{"role": "user", "name":"example_user", "content": input3}]

看下結(jié)果:

image-20230802082855418

  • Step 3:調(diào)用GPT 4.0 API
response = openai.ChatCompletion.create(model="gpt-4-0613",messages=messages_CD
)

看一下在Few-shot下的拆解結(jié)果:

image-20230802094846316

從結(jié)果上看,通過Few-shot將問題拆解并在第一個(gè)階段給與提示,模型能夠非常清楚的判斷當(dāng)前需求中可以作為函數(shù)的變量。

  • Step 4:創(chuàng)建LtM Command mapping階段提示
system_content2 = "我現(xiàn)在已完成Gmail API授權(quán),授權(quán)文件為本地文件token.json。所編寫的函數(shù)要求參數(shù)類型都必須是字符串類型。"get_email_input = "請(qǐng)幫我查下郵箱里最后一封郵件內(nèi)容。" + pi1get_email_out = "請(qǐng)幫我編寫一個(gè)python函數(shù),用于查看我的Gmail郵箱中最后一封郵件信息,函數(shù)要求如下:\1.函數(shù)參數(shù)userId,userId是字符串參數(shù),默認(rèn)情況下取值為'me',表示查看我的郵件;\2.函數(shù)返回結(jié)果是一個(gè)包含最后一封郵件信息的對(duì)象,返回結(jié)果本身必須是一個(gè)json格式對(duì)象;\3.請(qǐng)將全部功能封裝在一個(gè)函數(shù)內(nèi);\4.請(qǐng)?jiān)诤瘮?shù)編寫過程中,在函數(shù)內(nèi)部加入中文編寫的詳細(xì)的函數(shù)說明文檔,用于說明函數(shù)功能、函數(shù)參數(shù)情況以及函數(shù)返回結(jié)果等信息;"send_email_input = "請(qǐng)幫我給小陳發(fā)送一封Gmail郵件,請(qǐng)他明天早上9點(diǎn)半來我辦公室開會(huì),商量我的100億應(yīng)該怎么花。" + pi2send_email_out = "請(qǐng)幫我編寫一個(gè)python函數(shù),用于給小陳發(fā)送郵件,請(qǐng)他明天早上9點(diǎn)半來我辦公室開會(huì),商量我的100億應(yīng)該怎么花。,函數(shù)要求如下:\1.函數(shù)參數(shù)to、subject和message_text,三個(gè)參數(shù)都是字符串類型,其中to表示發(fā)送郵件對(duì)象,subject表示郵件主題,message_text表示郵件具體內(nèi)容;\2.函數(shù)返回結(jié)果是當(dāng)前郵件發(fā)送狀態(tài),返回結(jié)果本身必須是一個(gè)json格式對(duì)象;\3.請(qǐng)將全部功能封裝在一個(gè)函數(shù)內(nèi);\4.請(qǐng)?jiān)诤瘮?shù)編寫過程中,在函數(shù)內(nèi)部加入中文編寫的詳細(xì)的函數(shù)說明文檔,用于說明函數(shù)功能、函數(shù)參數(shù)情況以及函數(shù)返回結(jié)果等信息;"user_content = input3 + pi3
  • Step 4:創(chuàng)建第二階段的Prompt
messages_CM = [{"role": "system", "content": system_content2},{"role": "user", "name":"example1_user", "content": get_email_input},{"role": "assistant", "name":"example1_assistant", "content": get_email_out},{"role": "user", "name":"example2_user", "content": send_email_input},{"role": "assistant", "name":"example2_assistant", "content": send_email_out},{"role": "user", "name":"example_user", "content": user_content}]

看下輸出結(jié)果:

image-20230802095447681

  • **Step 5:再次調(diào)用GPT 4.0 API **
response = openai.ChatCompletion.create(model="gpt-4-0613",messages=messages_CM
)

看一下結(jié)果:

image-20230802100002842

能夠發(fā)現(xiàn),在合理的函數(shù)參數(shù)設(shè)置下,這段函數(shù)描述看起來也更加合理,至此就完成了基于LtM的函數(shù)描述創(chuàng)建的提示過程,也就是下圖:

image-20230802100319119

對(duì)于整體提示的第二階段,即引導(dǎo)大模型基于function_description進(jìn)行相應(yīng)函數(shù)的創(chuàng)建工作。

  • Step 6:根據(jù)Prompt創(chuàng)建函數(shù)

在函數(shù)創(chuàng)建階段,同樣采用Few-shot的方式進(jìn)行提示,提示的示例仍然為get_email_out和send_email_out兩個(gè)函數(shù),提示流程如下:

對(duì)于get_email_out來說,它的函數(shù)描述和函數(shù)定義是這樣的:

image-20230802100742324

對(duì)于send_email_out來說,它的函數(shù)描述和函數(shù)定義是這樣的:

image-20230802100911934

  • Step 7:創(chuàng)建Prompt
system_content3 = "我現(xiàn)在已完成Gmail API授權(quán),授權(quán)文件為本地文件token.json。函數(shù)參數(shù)必須是字符串類型對(duì)象,函數(shù)返回結(jié)果必須是json表示的字符串對(duì)象。"messages_stage2 = [{"role": "system", "content": system_content3},{"role": "user", "name":"example1_user", "content": func1_description},{"role": "assistant", "name":"example1_assistant", "content": func1_str},{"role": "user", "name":"example2_user", "content": func2_description},{"role": "assistant", "name":"example2_assistant", "content": func2_str},{"role": "user","content": function_description}]messages_stage2

生成的Prompt 是這樣的:

image-20230802101143216

  • Step 8:調(diào)用GPT 4.0 API
response = openai.ChatCompletion.create(model="gpt-4",messages=messages_stage2
)

看一下輸出結(jié)果:

image-20230802101834941

  • Step 9: 將字符串解析

image-20230802102343042

模型定義的函數(shù)為get_unread_email,該函數(shù)在經(jīng)過人工審核后,是能夠滿足當(dāng)前功能需求的。

  • Step 10:帶入該函數(shù)到Chat模型中進(jìn)行功能驗(yàn)證

先看一下函數(shù)的解析情況:

functions_list = [get_unread_email_from]functions = auto_functions(functions_list)functions

image-20230802103022962

先發(fā)送一篇測(cè)試郵件,如圖:

image-20230802103517276

然后通過LLMs + Gmail API 測(cè)試AI應(yīng)用程序情況:

messages = [{"role": "user", "content": '請(qǐng)查詢我的郵箱,看下里面是否有來自算法小陳的未讀郵件。'}]response = openai.ChatCompletion.create(model="gpt-4",messages=messages,functions=functions,function_call="auto",  )

看下輸出:

image-20230802103659539

至此就能驗(yàn)證出:模型能夠正常使用用戶需求,并創(chuàng)建對(duì)應(yīng)的符合要求的參數(shù)。

2.3 多輪對(duì)話測(cè)試

在完成上述過程后,可以將該函數(shù)直接帶入到多輪對(duì)話函數(shù)中測(cè)試效果,并同時(shí)帶入其他外部函數(shù)以便進(jìn)行更加復(fù)雜的功能測(cè)試。

  • Step 1:準(zhǔn)備測(cè)試郵件

先提前往Gmail郵箱中發(fā)送一封郵件,郵件內(nèi)容如下:

image-20230802104244401

  • Step 2:導(dǎo)入多輪對(duì)話函數(shù):
def chat_with_model(functions_list=None, prompt="你好呀", model="gpt-4-0613", system_message=[{"role": "system", "content": "你是以為樂于助人的助手。"}]):messages = system_messagemessages.append({"role": "user", "content": prompt})while True:           answer = run_conversation(messages=messages, functions_list=functions_list, model=model)print(f"模型回答: {answer}")# 詢問用戶是否還有其他問題user_input = input("您還有其他問題嗎?(輸入退出以結(jié)束對(duì)話): ")if user_input == "退出":break# 記錄用戶回答messages.append({"role": "user", "content": user_input})
  • Step 3:更新外部函數(shù)列表
functions_list = [get_recent_emails, send_email, get_latest_email, get_email_count, get_unread_email_from]
  • Step 4:功能測(cè)試
chat_with_model(functions_list=functions_list, system_message=[{"role": "system", "content": "算法小陳的郵箱地址是:snowball6@qq.com"}])

看一下對(duì)話過程:

image-20230802112318039

看下郵箱情況:

image-20230802112335601

至此,就完整的執(zhí)行了一次新需求自動(dòng)編寫函數(shù)實(shí)現(xiàn)的完整流程。

三、實(shí)現(xiàn)全自動(dòng)功能函數(shù)編寫流程

上述基于LtM提示流程的穩(wěn)定編寫外部函數(shù)流程,根本目的是在探索一種適用于更多一般情況的全自動(dòng)開發(fā)流程,做成目前這樣還遠(yuǎn)遠(yuǎn)不夠,通過更高層次的抽象實(shí)現(xiàn)函數(shù)封裝,還有幾個(gè)關(guān)鍵的中間環(huán)節(jié)。

3.1 提示詞管理

其實(shí)不論任何領(lǐng)域的開發(fā)任務(wù),**找到一種有效的對(duì)模型、流程中間環(huán)節(jié)的提示詞管理方法,才能具備對(duì)掌控大語言(LLMs)輸出的能力,**不同開發(fā)項(xiàng)目在前期需要通過人工經(jīng)驗(yàn)的探索得到適用于當(dāng)前開發(fā)流程的(能獲得穩(wěn)定代碼結(jié)果的)提示流程,例如對(duì)于當(dāng)前開發(fā)項(xiàng)目而言,總共是兩個(gè)階段進(jìn)行提示,并且第一階段還會(huì)采用LtM提示法,因此每個(gè)函數(shù)的背后總共都有三個(gè)提示階段,一種有效的解決思路是:圍繞每個(gè)經(jīng)過測(cè)試的函數(shù),創(chuàng)建一個(gè)JSON對(duì)象以保存其每個(gè)階段的提示過程。過程如下:

  • Step 1:get_latest_email完整提示示例創(chuàng)建過程

此前的流程中手動(dòng)編寫的該函數(shù)的三個(gè)階段提示詞及結(jié)果如下:

# 第一階段LtM_CD階段提示詞及輸出結(jié)果
get_latest_email_CD_input = "請(qǐng)幫我查下Gmail郵箱里最后一封郵件內(nèi)容。"
get_latest_email_pi = "當(dāng)前需求中可以作為函數(shù)參數(shù)的是:1.查看誰的郵箱。"
get_latest_email_messages_CD = [{"role": "user", "content": get_latest_email_CD_input},{"role": "assistant", "content": get_latest_email_pi}]# 第一階段LtM_CM階段提示詞及輸出結(jié)果
get_latest_email_CM_input = get_latest_email_CD_input + get_latest_email_pi
get_latest_email_description = "請(qǐng)幫我編寫一個(gè)python函數(shù),用于查看我的Gmail郵箱中最后一封郵件信息,函數(shù)要求如下:\1.函數(shù)參數(shù)userId,userId是字符串參數(shù),默認(rèn)情況下取值為'me',表示查看我的郵件;\2.函數(shù)返回結(jié)果是一個(gè)包含最后一封郵件信息的對(duì)象,返回結(jié)果本身必須是一個(gè)json格式對(duì)象;\3.請(qǐng)將全部功能封裝在一個(gè)函數(shù)內(nèi);\4.請(qǐng)?jiān)诤瘮?shù)編寫過程中,在函數(shù)內(nèi)部加入中文編寫的詳細(xì)的函數(shù)說明文檔,用于說明函數(shù)功能、函數(shù)參數(shù)情況以及函數(shù)返回結(jié)果等信息;"
get_latest_email_messages_CM = [{"role": "user", "content": get_latest_email_CM_input},{"role": "assistant", "content":get_latest_email_description}]# 第二階段提示詞及輸出結(jié)果
with open('./functions/tested functions/%s_module.py' % 'get_latest_email', encoding='utf-8') as f:get_latest_email_function = f.read()get_latest_email_messages = [{"role": "user", "content": get_latest_email_description},{"role": "assistant", "content":get_latest_email_function}]  

這個(gè)過程中需要注意兩點(diǎn):

  • 在提示詞保存過程中,不僅需要保存提示的提示詞,還需要保存提示結(jié)果,以便作為其他提示過程的提示示例
  • 實(shí)際開發(fā)過程多用Chat模型,因此建議以類messages參數(shù)形式進(jìn)行保存

在以message形式保存完每個(gè)階段的提示內(nèi)容之后,將三個(gè)提示示例以如下格式進(jìn)行保存,即將一個(gè)函數(shù)對(duì)象的三個(gè)階段的全部提示示例保存為一個(gè)字典,并且字典中的每個(gè)鍵值對(duì)代表一個(gè)階段的提示內(nèi)容。同時(shí),每個(gè)函數(shù)的完整提示示例都以function_name_prompt命名,具體get_latest_email_prompt對(duì)象創(chuàng)建過程如下:

# 第一階段LtM_CD階段提示詞及輸出結(jié)果
get_latest_email_CD_input = "請(qǐng)幫我查下Gmail郵箱里最后一封郵件內(nèi)容。"
get_latest_email_pi = "當(dāng)前需求中可以作為函數(shù)參數(shù)的是:1.查看誰的郵箱。"
get_latest_email_messages_CD = [{"role": "user", "content": get_latest_email_CD_input},{"role": "assistant", "content": get_latest_email_pi}]# 第一階段LtM_CM階段提示詞及輸出結(jié)果
get_latest_email_CM_input = get_latest_email_CD_input + get_latest_email_pi
get_latest_email_description = "請(qǐng)幫我編寫一個(gè)python函數(shù),用于查看我的Gmail郵箱中最后一封郵件信息,函數(shù)要求如下:\1.函數(shù)參數(shù)userId,userId是字符串參數(shù),默認(rèn)情況下取值為'me',表示查看我的郵件;\2.函數(shù)返回結(jié)果是一個(gè)包含最后一封郵件信息的對(duì)象,返回結(jié)果本身必須是一個(gè)json格式對(duì)象;\3.請(qǐng)將全部功能封裝在一個(gè)函數(shù)內(nèi);\4.請(qǐng)?jiān)诤瘮?shù)編寫過程中,在函數(shù)內(nèi)部加入中文編寫的詳細(xì)的函數(shù)說明文檔,用于說明函數(shù)功能、函數(shù)參數(shù)情況以及函數(shù)返回結(jié)果等信息;"
get_latest_email_messages_CM = [{"role": "user", "content": get_latest_email_CM_input},{"role": "assistant", "content":get_latest_email_description}]# 第二階段提示詞及輸出結(jié)果
with open('./functions/tested functions/%s_module.py' % 'get_latest_email', encoding='utf-8') as f:get_latest_email_function = f.read()get_latest_email_messages = [{"role": "user", "content": get_latest_email_description},{"role": "assistant", "content":get_latest_email_function}]  get_latest_email_prompt = {"stage1_CD": get_latest_email_messages_CD,"stage1_CM": get_latest_email_messages_CM,"stage2": get_latest_email_messages}    

看一下完整的Prompt:

image-20230802154554165

  • Step 2:將其寫入本地,并將其和對(duì)應(yīng)函數(shù)的py文件保存為同一文件夾內(nèi)
with open('./functions/tested functions/%s_prompt.json' % 'get_latest_email', 'w') as f:json.dump(get_latest_email_prompt, f)

同樣的操作,可以完成get_recent_emails, send_email, get_email_count, get_unread_email_from的完整提示示例保存。

  • Step 3:保存系統(tǒng)提示消息
system_messages = {"system_message_CD": [{"role": "system", "content": "為了更好編寫滿足用戶需求的python函數(shù),我們需要先識(shí)別用戶需求中的變量,以作為python函數(shù)的參數(shù)。需要注意的是,當(dāng)前編寫的函數(shù)中涉及到的郵件收發(fā)查閱等功能,都是通過調(diào)用Gmail API來完成。"}], "system_message_CM": [{"role": "system", "content": "我現(xiàn)在已完成Gmail API授權(quán),授權(quán)文件為本地文件token.json。函數(shù)參數(shù)必須是字符串類型對(duì)象,函數(shù)返回結(jié)果必須是json表示的字符串對(duì)象。"}], "system_message": [{"role": "system", "content":"我現(xiàn)在已完成Gmail API授權(quán),授權(quán)文件為本地文件token.json。函數(shù)參數(shù)必須是字符串類型對(duì)象,函數(shù)返回結(jié)果必須是json表示的字符串對(duì)象。"}]}with open('./functions/tested functions/%s.json' % 'system_messages', 'w') as f:json.dump(system_messages, f)

看下最終的保存結(jié)果:

image-20230802155728811

3.2 項(xiàng)目代碼文件管理

一個(gè)完整的開發(fā)項(xiàng)目,必然存在著非常多的函數(shù)代碼和相關(guān)提示詞說明文檔,為了更好的做項(xiàng)目管理,有必要對(duì)當(dāng)前項(xiàng)目的代碼結(jié)構(gòu)和文件結(jié)構(gòu)進(jìn)行修改。

就以Gmail這個(gè)項(xiàng)目開發(fā)為例,可以嘗試這種操作:

  • 將原本的通用性functions文件夾更名為特定的autoGmail_project,注明是該文件夾專門用于保存autoGmail相關(guān)文件。
  • 將tested和untested內(nèi)的同名函數(shù)代碼和提示文件保存到一個(gè)同名文件夾內(nèi),原system_messages.json文件位置不變。

修改前是這樣的:

image-20230802160332397

將同一個(gè)函數(shù)的module文件和prompt文件都放在一個(gè)函數(shù)同名文件夾內(nèi),修改后tested文件是這樣的:

image-20230802160631340

3.3 提示詞管理輔助函數(shù)

  • Step 1:修改remove_to_tested函數(shù)

當(dāng)修改了文件路徑后,需要重新定義一個(gè)remove_to_tested函數(shù),以實(shí)現(xiàn)函數(shù)文件夾的untested到tested的轉(zhuǎn)移過程,代碼如下:

def remove_to_tested(function_name):"""將函數(shù)同名文件夾由untested文件夾轉(zhuǎn)移至tested文件夾內(nèi)。\完成轉(zhuǎn)移則說明函數(shù)通過測(cè)試,可以使用。此時(shí)需要將該函數(shù)的源碼寫入gptLearning.py中方便下次調(diào)用。"""# 將函數(shù)代碼寫入gptLearning.py文件中with open('./functions/untested functions/%s/%s_module.py' % (function_name, function_name), encoding='utf-8') as f:function_code = f.read()with open('gptLearning.py', 'a', encoding='utf-8') as f:f.write(function_code)# 源文件夾路徑src_dir = './functions/untested functions/%s' % function_name# 目標(biāo)文件夾路徑dst_dir = './functions/tested functions/%s' % function_name# 移動(dòng)文件夾shutil.move(src_dir, dst_dir)
  • Step 2:修改extract_function_code函數(shù)

extract_function_code需要添加在完成函數(shù)提取時(shí)就在untested文件夾中創(chuàng)建同名函數(shù)文件夾的功能,以及需要求修改讀取和寫入代碼的文件路徑,代碼如下:

def extract_function_code(s, detail=0, tested=False, g=globals()):"""函數(shù)提取函數(shù),同時(shí)執(zhí)行函數(shù)內(nèi)容,可以選擇打印函數(shù)信息,并選擇代碼保存的地址"""def extract_code(s):"""如果輸入的字符串s是一個(gè)包含Python代碼的Markdown格式字符串,提取出代碼部分。否則,返回原字符串。參數(shù):s: 輸入的字符串。返回:提取出的代碼部分,或原字符串。"""# 判斷字符串是否是Markdown格式if '```python' in s or 'Python' in s or'PYTHON' in s:# 找到代碼塊的開始和結(jié)束位置code_start = s.find('def')code_end = s.find('```\n', code_start)# 提取代碼部分code = s[code_start:code_end]else:# 如果字符串不是Markdown格式,返回原字符串code = sreturn code# 提取代碼字符串code = extract_code(s)# 提取函數(shù)名稱match = re.search(r'def (\w+)', code)function_name = match.group(1)# 在untested文件夾內(nèi)創(chuàng)建函數(shù)同名文件夾directory = './functions/untested functions/%s' % function_nameif not os.path.exists(directory):os.makedirs(directory)# 將函數(shù)寫入本地if tested == False:with open('./functions/untested functions/%s/%s_module.py' % (function_name, function_name), 'w', encoding='utf-8') as f:f.write(code)else:# 調(diào)用remove_to_test函數(shù)將函數(shù)文件夾轉(zhuǎn)移至tested文件夾內(nèi)remove_to_tested(function_name)with open('./functions/tested functions/%s/%s_module.py' % (function_name, function_name), 'w', encoding='utf-8') as f:f.write(code)# 執(zhí)行該函數(shù)try:exec(code, g)except Exception as e:print("An error occurred while executing the code:")print(e)# 打印函數(shù)名稱if detail == 0:print("The function name is:%s" % function_name)if detail == 1:if tested == False:with open('./functions/untested functions/%s/%s_module.py' % (function_name, function_name), 'r', encoding='utf-8') as f:content = f.read()else:with open('./functions/tested functions/%s/%s_module.py' % (function_name, function_name), 'r', encoding='utf-8') as f:   content = f.read()print(content)return function_name
  • Step 3:修改show_functions函數(shù)

show_functions功能則需要修改為展示文件夾內(nèi)內(nèi)文件名稱,代碼如下:

def show_functions(tested=False, if_print=False):"""打印tested或untested文件夾內(nèi)全部函數(shù)"""current_directory = os.getcwd()if tested == False:directory = current_directory + '\\functions\\untested functions'else:directory = current_directory + '\\functions\\tested functions'files_and_directories = os.listdir(directory)# 過濾結(jié)果,只保留.py文件和非__pycache__文件夾files_and_directories = files_and_directories = [name for name in files_and_directories if (os.path.splitext(name)[1] == '.py' or os.path.isdir(os.path.join(directory, name))) and name != "__pycache__"]if if_print != False:for name in files_and_directories:print(name)return files_and_directories

至此,就完成了經(jīng)過測(cè)試的函數(shù)的提示詞管理,并搭建了新的提示詞管理方法,以及創(chuàng)建了協(xié)助完成文件管理的相關(guān)函數(shù)。

四、實(shí)現(xiàn)全自動(dòng)編程函數(shù)創(chuàng)建方法

在對(duì)功能函數(shù)實(shí)現(xiàn)自動(dòng)化編寫后,還需要將從用戶需求到LtM提示法創(chuàng)建外部函數(shù)完整流程封裝到一個(gè)名為code_generate的函數(shù)內(nèi)。該函數(shù)基本功能、和其他函數(shù)交互關(guān)系以及和函數(shù)庫之間調(diào)用關(guān)系如下:

3

將上述過程封裝成高級(jí)函數(shù),代碼是這樣的:

def code_generate(req, few_shot='all', model='gpt-4-0613', g=globals(), detail=0):"""Function calling外部函數(shù)自動(dòng)創(chuàng)建函數(shù),可以根據(jù)用戶的需求,直接將其翻譯為Chat模型可以直接調(diào)用的外部函數(shù)代碼。:param req: 必要參數(shù),字符串類型,表示輸入的用戶需求;:param few_shot: 可選參數(shù),默認(rèn)取值為字符串a(chǎn)ll,用于描述Few-shot提示示例的選取方案,當(dāng)輸入字符串a(chǎn)ll時(shí),則代表提取當(dāng)前外部函數(shù)庫中全部測(cè)試過的函數(shù)作為Few-shot;\而如果輸入的是一個(gè)包含了多個(gè)函數(shù)名稱的list,則表示使用這些函數(shù)作為Few-shot。:param model: 可選參數(shù),表示調(diào)用的Chat模型,默認(rèn)選取gpt-4-0613;:param g: 可選參數(shù),表示extract_function_code函數(shù)作用域,默認(rèn)為globals(),即在當(dāng)前操作空間全域內(nèi)生效;:param detail: 可選參數(shù),默認(rèn)取值為0,還可以取值為1,表示extract_function_code函數(shù)打印新創(chuàng)建的外部函數(shù)細(xì)節(jié);:return:新創(chuàng)建的函數(shù)名稱。需要注意的是,在函數(shù)創(chuàng)建時(shí),該函數(shù)也會(huì)在當(dāng)前操作空間被定義,后續(xù)可以直接調(diào)用;"""# 提取提示示例的函數(shù)名稱if few_shot == 'all':few_shot_functions_name = show_functions(tested=True)elif type(few_shot) == list:few_shot_functions_name = few_shot# few_shot_functions = [globals()[name] for name in few_shot_functions_name]# 讀取各階段系統(tǒng)提示with open('./functions/tested functions/system_messages.json', 'r') as f:system_messages = json.load(f)# 各階段提示message對(duì)象few_shot_messages_CM = []few_shot_messages_CD = []few_shot_messages = []# 先保存第一條消息,也就是system messagefew_shot_messages_CD += system_messages["system_message_CD"]few_shot_messages_CM += system_messages["system_message_CM"]few_shot_messages += system_messages["system_message"]# 創(chuàng)建不同階段提示messagefor function_name in few_shot_functions_name:with open('./functions/tested functions/%s/%s_prompt.json' % (function_name, function_name), 'r') as f:msg = json.load(f)few_shot_messages_CD += msg["stage1_CD"]few_shot_messages_CM += msg["stage1_CM"]few_shot_messages += msg['stage2']# 讀取用戶需求,作為第一階段CD環(huán)節(jié)User contentnew_req_CD_input = reqfew_shot_messages_CD.append({"role": "user", "content": new_req_CD_input})print('第一階段CD環(huán)節(jié)提示創(chuàng)建完畢,正在進(jìn)行CD提示...')# 第一階段CD環(huán)節(jié)Chat模型調(diào)用過程response = openai.ChatCompletion.create(model=model,messages=few_shot_messages_CD)new_req_pi = response.choices[0].message['content']print('第一階段CD環(huán)節(jié)提示完畢')# 第一階段CM環(huán)節(jié)Messages創(chuàng)建new_req_CM_input = new_req_CD_input + new_req_pifew_shot_messages_CM.append({"role": "user", "content": new_req_CM_input})print('第一階段CM環(huán)節(jié)提示創(chuàng)建完畢,正在進(jìn)行第一階段CM提示...')# 第一階段CM環(huán)節(jié)Chat模型調(diào)用過程response = openai.ChatCompletion.create(model=model,messages=few_shot_messages_CM)new_req_description = response.choices[0].message['content']print('第一階段CM環(huán)節(jié)提示完畢')# 第二階段Messages創(chuàng)建過程few_shot_messages.append({"role": "user", "content": new_req_description})print('第二階段提示創(chuàng)建完畢,正在進(jìn)行第二階段提示...')# 第二階段Chat模型調(diào)用過程response = openai.ChatCompletion.create(model=model,messages=few_shot_messages)new_req_function = response.choices[0].message['content']print('第二階段提示完畢,準(zhǔn)備運(yùn)行函數(shù)并編寫提示示例')# 提取函數(shù)并運(yùn)行,創(chuàng)建函數(shù)名稱對(duì)象,統(tǒng)一都寫入untested文件夾內(nèi)function_name = extract_function_code(s=new_req_function, detail=detail, g=g)print('新函數(shù)保存在./functions/untested functions/%s/%s_module.py文件中' % (function_name, function_name))# 創(chuàng)建該函數(shù)提示示例new_req_messages_CD = [{"role": "user", "content": new_req_CD_input},{"role": "assistant", "content": new_req_pi}]new_req_messages_CM = [{"role": "user", "content": new_req_CM_input},{"role": "assistant", "content":new_req_description}]with open('./functions/untested functions/%s/%s_module.py' % (function_name, function_name), encoding='utf-8') as f:new_req_function = f.read()new_req_messages = [{"role": "user", "content": new_req_description},{"role": "assistant", "content":new_req_function}] new_req_prompt = {"stage1_CD": new_req_messages_CD,"stage1_CM": new_req_messages_CM,"stage2": new_req_messages}   with open('./functions/untested functions/%s/%s_prompt.json' % (function_name, function_name), 'w') as f:json.dump(new_req_prompt, f)print('新函數(shù)提示示例保存在./functions/untested functions/%s/%s_prompt.json文件中' % (function_name, function_name))print('done')return function_name

對(duì)于上述過程,如果不理解的話可以手動(dòng)嘗試驗(yàn)證一下,以get_latest_email為例:

  • Step 1:讀取get_latest_email的函數(shù)描述
function_name = 'get_latest_email'with open('./functions/tested functions/%s/%s_prompt.json' % (function_name, function_name), 'r') as f:msg = json.load(f)msg['stage2']

看一下輸出:

image-20230802161931652

  • Step 2:查看保存的函數(shù)文件
few_shot_functions_name = show_functions(tested=True)

看下返回結(jié)果:

image-20230802162944430

  • Step 3:查看各階段的系統(tǒng)Prompt
with open('./functions/tested functions/system_messages.json', 'r') as f:system_messages = json.load(f)# 各階段提示message對(duì)象
few_shot_messages_CM = []
few_shot_messages_CD = []
few_shot_messages = []# 先保存第一條消息,也就是system message
few_shot_messages_CD += system_messages["system_message_CD"]
few_shot_messages_CM += system_messages["system_message_CM"]
few_shot_messages += system_messages["system_message"]

看下返回結(jié)果:

image-20230802163152760

  • Step 4:查看各函數(shù)完整的Prompt
for function_name in few_shot_functions_name:with open('./functions/tested functions/%s/%s_prompt.json' % (function_name, function_name), 'r') as f:msg = json.load(f)few_shot_messages_CD += msg["stage1_CD"]few_shot_messages_CM += msg["stage1_CM"]few_shot_messages += msg['stage2']

看下結(jié)果:

image-20230802163709515

image-20230802163737076

  • Step 4:輸入新需求
new_req_CD_input = "請(qǐng)查下我的郵箱里是否有來自算法小陳的未讀郵件,有的話請(qǐng)解讀下這封未讀郵件的內(nèi)容。"
  • Step 5:拼接新需求的Prompt
few_shot_messages_CD.append({"role": "user", "content": new_req_CD_input})

輸出的Prompt如下:

image-20230802164022378

  • Step 6:進(jìn)行第一階段的CD提示
response = openai.ChatCompletion.create(model="gpt-4-0613",messages=few_shot_messages_CD
)

看下模型輸出:

image-20230802164255788

  • Step 7:進(jìn)行第一階段的CM提示
new_req_CM_input = new_req_CD_input + new_req_pifew_shot_messages_CM.append({"role": "user", "content": new_req_CM_input})
few_shot_messages_CM

看下拼接好的Prompt:

image-20230802164447559

輸入模型:

response = openai.ChatCompletion.create(model="gpt-4-0613",messages=few_shot_messages_CM
)

看一下模型返回結(jié)果:

image-20230802164743710

  • Step 8:進(jìn)行第二階段的提示

此階段的提示為系統(tǒng)輸入+ 函數(shù)描述及具體函數(shù)的Few-shot,引導(dǎo)大語言模型(LLMs)根據(jù)Prompt生成具體的函數(shù),代碼如下:

few_shot_messages.append({"role": "user", "content": new_req_description})response = openai.ChatCompletion.create(model="gpt-4-0613",messages=few_shot_messages
)

看下模型輸出結(jié)果:

image-20230802165134192

  • Step 9:提取字符串,轉(zhuǎn)化成函數(shù)
extract_function_code(new_req_function, detail=1, g=globals())

看下生成的函數(shù):

image-20230802165258140

  • Step 10:測(cè)試code_generate一鍵生成函數(shù)
few_shot_functions = ['get_latest_email', 'send_email']req = "請(qǐng)查下我的郵箱里是否有來自算法小陳的未讀郵件,有的話請(qǐng)解讀下這封未讀郵件的內(nèi)容。"function_name = code_generate(req=req, few_shot=few_shot_functions)

其創(chuàng)建過程如下:

image-20230802165802965

image-20230802165837115

  • Step 11:手動(dòng)對(duì)生成的函數(shù)進(jìn)行測(cè)試
functions_list = [check_unread_emails]messages = [{"role": "system", "content": "算法小陳的郵箱地址是:snowball6@qq.com "},{"role": "user", "content": req}]final_response = run_conversation(messages=messages, functions_list=functions_list, model="gpt-3.5-turbo-16k-0613")

基于這套流程,基本上實(shí)現(xiàn)了高效便捷的外部函數(shù)創(chuàng)建,可以基于code_generate嘗試新增函數(shù),示例如下:

few_shot_functions = ['get_latest_email', 'send_email']req = "請(qǐng)查下我的郵箱里第一封郵件,并告訴我第一封郵件的收件時(shí)間和郵件內(nèi)容"function_name = code_generate(req=req, few_shot=few_shot_functions)functions_list = [get_first_email]messages = [{"role": "user", "content": req}]final_response = run_conversation(messages=messages, functions_list=functions_list, model="gpt-3.5-turbo-16k-0613")
final_response

五、總結(jié)

本文作為構(gòu)建高度自動(dòng)化AI項(xiàng)目開發(fā)流程的第二步優(yōu)化,通過LtM提示流程,解決了根據(jù)用戶需求,自動(dòng)構(gòu)建符合要求的函數(shù),并通過示例一步一步的完整測(cè)試了code_generate函數(shù)功能。

總的來說,進(jìn)展到這里整套流程已經(jīng)基本固定并且符合高度的自動(dòng)化,并且具有一定的通用性,但在實(shí)驗(yàn)測(cè)試中發(fā)現(xiàn),gpt4.0接口相較于gpt3.5接口,其輸出能力還是更為穩(wěn)定,然而就算是目前最強(qiáng)的gpt4.0,在實(shí)際進(jìn)行批量代碼創(chuàng)建時(shí)還是會(huì)存在編寫的代碼不穩(wěn)定的情況,這也是一個(gè)需要進(jìn)一步思考如何解決的問題。

最后,感謝您閱讀這篇文章!如果您覺得有所收獲,別忘了點(diǎn)贊、收藏并關(guān)注我,這是我持續(xù)創(chuàng)作的動(dòng)力。您有任何問題或建議,都可以在評(píng)論區(qū)留言,我會(huì)盡力回答并接受您的反饋。如果您希望了解某個(gè)特定主題,也歡迎告訴我,我會(huì)樂于創(chuàng)作與之相關(guān)的文章。謝謝您的支持,期待與您共同成長(zhǎng)!

http://www.risenshineclean.com/news/26922.html

相關(guān)文章:

  • 能看各種網(wǎng)站的瀏覽器深圳百度公司地址在哪里
  • 為什么選用美食做網(wǎng)站主頁百度競(jìng)價(jià)排名什么意思
  • wordpress 主題 建站搜索引擎關(guān)鍵詞排名優(yōu)化
  • 使用dw做門戶網(wǎng)站營銷軟文寫作
  • 專業(yè)建站公司服務(wù)百度手機(jī)網(wǎng)頁版
  • 黑龍江省網(wǎng)站建設(shè)北京seo顧問
  • 陽江網(wǎng)站建設(shè)公司百度網(wǎng)站官網(wǎng)入口
  • 網(wǎng)站的數(shù)據(jù)庫怎么備份網(wǎng)絡(luò)營銷與網(wǎng)站推廣的
  • 青島做外貿(mào)網(wǎng)站廣州疫情最新消息
  • 濟(jì)寧網(wǎng)站建設(shè) 田振在線磁力搜索引擎
  • c 做的網(wǎng)站又哪些廈門關(guān)鍵詞優(yōu)化網(wǎng)站
  • 林州網(wǎng)站建設(shè)外貿(mào)網(wǎng)站平臺(tái)
  • java web網(wǎng)站開發(fā)流程廈門人才網(wǎng)最新招聘信息網(wǎng)
  • 北京制作頁面網(wǎng)站搜索優(yōu)化官網(wǎng)
  • 微信朋友圈廣告投放平臺(tái)杭州上城區(qū)抖音seo有多好
  • 找美工做網(wǎng)站多少錢長(zhǎng)沙seo優(yōu)化推廣公司
  • 洛陽做網(wǎng)站哪家便宜沈陽seo排名收費(fèi)
  • 靜態(tài)網(wǎng)站制作模板百度seo關(guān)鍵詞排名優(yōu)化
  • 創(chuàng)業(yè)商機(jī)網(wǎng)餐飲seoapp推廣
  • dz論壇怎么做視頻網(wǎng)站上海十大營銷策劃公司
  • 日照網(wǎng)站建設(shè)哪家好看廣告賺錢的平臺(tái)
  • 怎么用css做網(wǎng)站背景圖整站優(yōu)化seo公司哪家好
  • 大連網(wǎng)站建設(shè)特色南京seo關(guān)鍵詞排名
  • asp動(dòng)態(tài)網(wǎng)站建設(shè)模擬搜索點(diǎn)擊軟件
  • 源碼下載網(wǎng)站源碼廣西網(wǎng)絡(luò)優(yōu)化seo
  • 網(wǎng)站下載的軟件怎么安裝代寫1000字多少錢
  • 集團(tuán)網(wǎng)站建設(shè)要多少錢sem推廣軟件選哪家
  • 一級(jí)a做爰片免費(fèi)觀網(wǎng)站看無碼滄州網(wǎng)站建設(shè)
  • 網(wǎng)站建設(shè)英語翻譯資料產(chǎn)品軟文范例軟文
  • 深圳做網(wǎng)站 漢獅網(wǎng)絡(luò)seo合作代理