自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

揭示LLaMA 3對話能力的奧秘

人工智能
計(jì)算機(jī)科學(xué)家和法律專家在制定人工智能合規(guī)標(biāo)準(zhǔn)時進(jìn)行了分工和協(xié)作。Agent A 提出技術(shù)實(shí)施的建議和解決技術(shù)難題,而 Agent B 負(fù)責(zé)評估合規(guī)性、提出法律建議和法規(guī)框架。這種分工模式能有效結(jié)合技術(shù)實(shí)施和法律法規(guī),以確保人工智能技術(shù)的合法合規(guī)性。

過去的一年中,大模型技術(shù)得到了廣泛認(rèn)可,全行業(yè)對大模型的投入也在不斷增加。開源社區(qū)涌現(xiàn)了許多優(yōu)秀的模型和框架,推動了大模型技術(shù)的普及和應(yīng)用。在這一年的時間里,LLaMA 系列模型也經(jīng)歷了快速的發(fā)展,從 LLaMA 2 到 LLaMA 3,我們看到了性能和應(yīng)用上的顯著提升。

基本操作:生成內(nèi)容

首先,讓我們來了解一下 LLaMA 3 的核心能力。LLaMA 3 主要依賴于 Next Token Prediction(下一個詞預(yù)測)機(jī)制,通過預(yù)測下一個詞來生成連貫的對話。這種機(jī)制基于海量文本數(shù)據(jù)的訓(xùn)練,使模型能夠捕捉語言的模式和規(guī)律,生成符合上下文邏輯的文本內(nèi)容。

Next Token Prediction

Next Token Prediction 是大語言模型生成文本的基礎(chǔ)。模型處理輸入文本的步驟如下:

標(biāo)記化:首先,大模型將輸入文本分解成一系列的 token(詞或子詞)。例如,句子“請解釋一下黑洞的形成”可能被分解為以下 token:

["請", "解釋", "一", "下", "黑", "洞", "的", "形", "成"]

文字表征:接下來,將這些 token 轉(zhuǎn)換為模型能夠理解的數(shù)值形式(通常是嵌入向量)。

概率預(yù)測:大模型會根據(jù)當(dāng)前的輸入序列計(jì)算下一個詞的概率分布。這些概率分布表示下一個詞的可能性,例如:

{"黑洞": 0.1, "形成": 0.05, "是": 0.2, "由于": 0.15, ...}

生成文本:根據(jù)概率分布選擇具體的一個詞作為下一個詞。選擇方式可以是貪婪搜索(選擇概率最大的詞)、隨機(jī)采樣(根據(jù)概率分布隨機(jī)選擇)或其他搜索策略(比如 Beam Search)。例如,使并將其用貪婪搜索選擇概率最大的詞“是”,添加到已生成的文本序列中,重復(fù)上述步驟。

[“請”, “解釋”, “一”, “下”, “黑”, “洞”, “的”, “形”, “成”, “是”]。

因此,LLaMA 3 模型的推理過程是一個循環(huán):通過預(yù)測下一個詞,將其加入到序列中,再預(yù)測下一個詞來生成連貫的文本。這種循環(huán)造成了大量的模型推理算力開銷,這也是為什么 OpenAI 等公司在 API 使用中根據(jù) Token 計(jì)費(fèi)。

接下來,我們通過一個具體的代碼示例來演示 LLaMA 3 的文本生成過程。假設(shè)我們有一個文章開頭:

在一個陽光明媚的早晨,Alice 決定去森林里探險(xiǎn)。她走著走著,突然發(fā)現(xiàn)了一條小路。

我們使用 LLaMA 3 來續(xù)寫這段話:

import torch
from modelscope import snapshot_download
from transformers import AutoModelForCausalLM, AutoTokenizer


# 下載模型
cache_dir = './llama_cache'
model_id = snapshot_download("LLM-Research/Meta-Llama-3-8B", cache_dir=cache_dir)
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM


# 加載分詞器和模型
cache_dir = './llama_cache'
model_path = cache_dir + '/LLM-Research/Meta-Llama-3-8B'
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
    device_map="auto" if torch.cuda.is_available() else None
)


# 編碼輸入并將其移至模型設(shè)備
input_text = "在一個陽光明媚的早晨,Alice決定去森林里探險(xiǎn)。她走著走著,突然發(fā)現(xiàn)了一條小路。"
inputs = tokenizer(input_text, return_tensors="pt").to(model.device)


# 生成并解碼文本
with torch.no_grad():
    outputs = model.generate(**inputs)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generated_text)

輸出結(jié)果:

這條小路被兩旁茂密的樹木掩映著,似乎通向森林深處。Alice 決定沿著小路前進(jìn),想看看盡頭有什么驚喜等著她。

在這個例子中,LLaMA 3 成功地續(xù)寫了文章內(nèi)容,我們可以看到 LLaMA 3 流暢地生成了具有創(chuàng)意性的內(nèi)容,這個生成的過程就是剛剛提到的 Next Token Prediction  循環(huán)所形成的。

停止條件

你可能會問,Next Token Prediction 的方式豈不是會一直輸出內(nèi)容不停止?很好的問題!現(xiàn)在我們來聊聊 LLaMA 3 停止輸出的條件,LLaMA 3 的輸出由以下幾個因素控制:

最大長度(max_length):這是最常用的控制方式之一。在初始化模型時,你可以指定一個最大長度值。當(dāng)模型生成的文本長度達(dá)到該值時,它就會停止輸出。

例如,如果將最大長度設(shè)置為 100,那么模型生成的文本最長不會超過 100 個詞。

from transformers import AutoTokenizer, AutoModelForCausalLM


cache_dir = './llama_cache'
model_path = cache_dir + '/LLM-Research/Meta-Llama-3-8B'
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
    device_map="auto" if torch.cuda.is_available() else None
)


max_length = 50
input_text = "寫一首關(guān)于愛情的詩"
encoded_input = tokenizer(input_text, return_tensors="pt")
output = model.generate(encoded_input.input_ids, max_length=max_length)
print(tokenizer.decode(output[0], skip_special_tokens=True))

其他停止條件:一些模型還支持其他停止條件。例如檢測到重復(fù)的文本、低質(zhì)量的文本等。

LLaMA 3 可以檢測到重復(fù)的文本并將其跳過。

from transformers import AutoTokenizer, AutoModelForCausalLM


cache_dir = './llama_cache'
model_path = cache_dir + '/LLM-Research/Meta-Llama-3-8B'
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
    device_map="auto" if torch.cuda.is_available() else None
)


repetition_penalty = 1.2
input_text = "寫一首關(guān)于愛情的詩:"
encoded_input = tokenizer(input_text, return_tensors="pt")
output = model.generate(encoded_input.input_ids, repetition_penalty=repetition_penalty)
print(tokenizer.decode(output[0], skip_special_tokens=True))

其他停止條件:一些模型還支持其他停止條件。例如檢測到重復(fù)的文本、低質(zhì)量的文本等。

LLaMA 3 可以檢測到重復(fù)的文本并將其跳過。

from transformers import AutoTokenizer, AutoModelForCausalLM


cache_dir = './llama_cache'
model_path = cache_dir + '/LLM-Research/Meta-Llama-3-8B'
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
    device_map="auto" if torch.cuda.is_available() else None
)


repetition_penalty = 1.2
input_text = "寫一首關(guān)于愛情的詩:"
encoded_input = tokenizer(input_text, return_tensors="pt")
output = model.generate(encoded_input.input_ids, repetition_penalty=repetition_penalty)
print(tokenizer.decode(output[0], skip_special_tokens=True))

這些停止條件確保模型生成的文本不會無限延長,可以通過設(shè)置不同的參數(shù)來控制生成過程。

無狀態(tài)到有狀態(tài):對話能力

對話生成不僅需要理解上下文,還得保持連貫性。因此,我們首先要解決的問題,就是大模型服務(wù)“無狀態(tài)”的問題。為了讓“無狀態(tài)”的 LLaMA 3 模型具備對話能力,我們可以將先前的“歷史會話”作為當(dāng)前輸入的一部分。這樣可以保持上下文的連貫性,使模型成為一個“有狀態(tài)”的服務(wù),從而準(zhǔn)確地生成響應(yīng)。

以下是實(shí)現(xiàn)這一功能的代碼示例:

import torch
from modelscope import snapshot_download
from transformers import AutoModelForCausalLM, AutoTokenizer


# 下載模型
cache_dir = './llama_cache'
model_id = snapshot_download("LLM-Research/Meta-Llama-3-8B-Instruct", cache_dir=cache_dir)
from transformers import AutoTokenizer, AutoModelForCausalLM


cache_dir = './llama_cache'
model_path = cache_dir + '/LLM-Research/Meta-Llama-3-8B-Instruct'
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
    device_map="auto" if torch.cuda.is_available() else None
)


# 初始化對話歷史
dialogue_history = [
    "Customer: Hi, I have an issue with my order.",
    "Support: Sure, could you please provide your order number?",
    "Customer: Sure, it's #12345.",
    "Support: Thank you. Let me check the status for you.",
]


# 合并對話歷史為一個字符串
dialogue_history_text = "\n".join(dialogue_history)


# 添加用戶輸入,模擬當(dāng)前對話
user_input = "Customer: Can you please expedite the delivery?"
input_text = dialogue_history_text + "\n" + user_input


# 生成文本
input_ids = tokenizer.encode(input_text, return_tensors="pt")
outputs = model.generate(input_ids, max_length=100)
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)


print("Generated Response:", generated_text)

這段代碼演示了如何使用 LLaMA 3 模型生成對話響應(yīng)。

首先,我們定義了模型和 tokenizer,并初始化了一個簡單的對話歷史列表。然后,將對話歷史轉(zhuǎn)換為單個字符串,并添加用戶的當(dāng)前輸入。接下來,我們使用 tokenizer 對輸入進(jìn)行編碼,然后通過模型生成響應(yīng)文本。最后,解碼生成的文本并打印出來。

這里為你帶來這節(jié)課的第一個重點(diǎn),你可能會發(fā)現(xiàn),上面的示例使用了基礎(chǔ)版模型,而下面的示例使用了 Instruct 版本的模型。這是為什么呢?這是因?yàn)檫@兩個模型的目標(biāo)不一樣,為了服務(wù)不同的角色,每個版本 LLaMA 3 模型在訓(xùn)練數(shù)據(jù)和訓(xùn)練方法上有所不同,針對特定對象進(jìn)行了微調(diào),比如:

人類用戶:通過指令微調(diào),使模型更好地理解和響應(yīng)人類指令。這種微調(diào)使模型能夠處理更自然的語言輸入,提供更準(zhǔn)確和相關(guān)的回答。

檢索系統(tǒng):結(jié)合檢索系統(tǒng)的微調(diào)方法,提升模型在特定領(lǐng)域的信息檢索能力。通過實(shí)時檢索最新的外部數(shù)據(jù),模型可以提供更加準(zhǔn)確和時效性強(qiáng)的回答。

智能體(多步推理):模型之間的協(xié)作與交互,通過互相微調(diào)提升整體智能水平。不同模型可以相互補(bǔ)充,共同完成復(fù)雜的任務(wù),從而提高整體性能。

此外,選擇不同版本的 LLaMA 3 模型還需要考慮多個維度。

場景數(shù)據(jù):根據(jù)不同應(yīng)用場景選擇合適的指令微調(diào)數(shù)據(jù),如語言、行業(yè)、文化等。不同領(lǐng)域的數(shù)據(jù)特點(diǎn)和需求不同,需要針對性地進(jìn)行模型微調(diào)。

輸入長度:不同版本的模型在輸入長度上有所差異,我們需要根據(jù)具體應(yīng)用需求選擇適合的模型版本。一些應(yīng)用場景可能需要處理較長的輸入文本,因此選擇支持較長輸入的模型版本是必要的。

參數(shù)效率:通過微調(diào)降低模型的參數(shù)要求,例如使用更小的模型架構(gòu)或優(yōu)化算法。在資源有限的環(huán)境中,可以優(yōu)化模型性能以滿足需求。通過合理的參數(shù)配置,可以在性能和資源消耗之間找到平衡點(diǎn)。

量化程度:不同量化程度帶來不同的性能提升和效果下降,需要在性能和效果之間找到平衡點(diǎn)。量化可以減少模型的計(jì)算和存儲需求,但也可能影響生成效果,因此需要根據(jù)具體應(yīng)用情況進(jìn)行權(quán)衡。

這些考慮因素在選擇和使用 LLaMA 3 模型時至關(guān)重要。隨著后面課程的深入,我們將在示例中不斷展開這些內(nèi)容。

在解決了大模型的“無狀態(tài)“問題之后,我們再來看另一個大模型的局限性,那就是訓(xùn)練數(shù)據(jù)時效性的問題。

封閉到開放:檢索增強(qiáng)

在某些情況下,我們需要 LLaMA 3 訓(xùn)練后產(chǎn)生的最新事實(shí)。為了解決這個問題,我們可以結(jié)合檢索系統(tǒng),在生成過程中獲取最新或特定領(lǐng)域的事實(shí)信息。

為了解決 LLaMA 3 無法提供最新的事實(shí)信息的問題,我們需要用到檢索增強(qiáng)生成(RAG)方法。簡單來說,RAG 就是結(jié)合外部知識庫或 API 進(jìn)行實(shí)時檢索,并將檢索到的內(nèi)容通過提示語補(bǔ)充到模型的輸入中。

這種方法可以顯著提高生成內(nèi)容的準(zhǔn)確性和時效性。例如,在對話過程中調(diào)用外部知識庫,增強(qiáng)回答的準(zhǔn)確性。以下是一個常見的示例實(shí)現(xiàn)步驟:

定義檢索機(jī)制:首先,我們需要選擇一個適當(dāng)?shù)耐獠恐R庫或 API,用于實(shí)時檢索最新的事實(shí)信息。常見的選擇包括搜索引擎 API、新聞 API、專門的行業(yè)知識庫等。

集成檢索系統(tǒng):將外部檢索系統(tǒng)集成到 LLaMA 3 的生成流程中。當(dāng)模型生成初步響應(yīng)后,調(diào)用檢索系統(tǒng)獲取最新的相關(guān)信息,并將檢索到的信息整合到最終的響應(yīng)中。

更新生成內(nèi)容:利用檢索到的最新信息,更新和完善模型的初步生成內(nèi)容,確?;卮鸬臏?zhǔn)確性和時效性。

相應(yīng)的,以下是一個簡單的代碼示例,演示如何在生成過程中集成外部知識庫進(jìn)行實(shí)時檢索和信息更新。

定義檢索機(jī)制:在 retrieve_information 函數(shù)中,我們使用搜索引擎 API 根據(jù)給定的查詢關(guān)鍵詞檢索最新的信息。

集成檢索系統(tǒng):在 generate_response 函數(shù)中,首先使用 LLaMA 3 生成初步響應(yīng),然后提取生成文本中的關(guān)鍵詞,通過 retrieve_information 函數(shù)獲取相關(guān)的最新信息。

更新生成內(nèi)容:將檢索到的信息整合到最終的響應(yīng)中,生成更為準(zhǔn)確和時效性的回答。

import requests
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
from googleapiclient.discovery import build


cache_dir = './llama_cache'
model_path = cache_dir + '/LLM-Research/Meta-Llama-3-8B-Instruct'
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
    device_map="auto" if torch.cuda.is_available() else None
)


# Google Custom Search API配置
API_KEY = 'YOUR_GOOGLE_API_KEY'
SEARCH_ENGINE_ID = 'YOUR_SEARCH_ENGINE_ID'


# 檢索相關(guān)文檔的函數(shù)
def retrieve_documents(query):
    try:
        service = build("customsearch", "v1", developerKey=API_KEY)
        res = service.cse().list(q=query, cx=SEARCH_ENGINE_ID).execute()
        results = res.get('items', [])
        documents = [item["snippet"] for item in results]
        return documents
    except Exception as e:
        print(f"Error retrieving documents: {e}")
        return []


# 生成答案的函數(shù)
def generate_answer(query, documents):
    # 限制檢索到的文檔數(shù)量
    documents = documents[:3]
    context = "\n\n".join(documents) + "\n\nQuestion: " + query + "\nAnswer:"
    # 編碼輸入
    inputs = tokenizer(context, return_tensors="pt", truncation=True, max_length=2048).to(model.device)
    # 生成答案
    outputs = model.generate(**inputs, max_length=512)
    # 解碼答案
    answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
    return answer


# 主函數(shù)
def main():
    query = "What is the capital of France?"
    documents = retrieve_documents(query)
    if documents:
        answer = generate_answer(query, documents)
        print("Question:", query)
        print("Answer:", answer)
    else:
        print("No documents retrieved.")


if __name__ == "__main__":
    main()
Question: What is the capital of France?Answer: The capital of France is Paris. It is known for its art, fashion, and culture, and is home to famous landmarks such as the Eiffel Tower and the Louvre Museum.

通過結(jié)合外部知識庫或 API 進(jìn)行實(shí)時檢索和信息更新,我們可以有效解決 LLaMA 3 在生成過程中無法獲取最新事實(shí)的問題。這種方法不僅提高了回答的準(zhǔn)確性,還確保了內(nèi)容的時效性。在后續(xù)課程中,我們將進(jìn)一步探討如何使用向量數(shù)據(jù)和混合檢索及重排技術(shù),來構(gòu)建一個定制化的 RAG 引擎。

單體服務(wù)到微服務(wù):多智能體

在單步推理方面,LLaMA 3 存在一定的局限性,例如長對話和職責(zé)混亂可能會影響模型的推理性能。針對這些問題,多智能體架構(gòu)提供了一些優(yōu)化策略。多智能體系統(tǒng)(MAS)通過將多個智能體組織起來協(xié)同工作,實(shí)現(xiàn)復(fù)雜任務(wù)的解決。

每個智能體都有特定的角色和功能,通過相互之間的通信和協(xié)作來達(dá)成共同目標(biāo)。在 LLaMA 3 的應(yīng)用中,我們可以利用多智能體系統(tǒng)的以下優(yōu)點(diǎn):

拆分對話:將單一對話拆分成多個獨(dú)立的對話段,以減少對話長度對模型推理性能的影響。例如,在處理一個長篇對話時,可以將對話分成若干段,每段集中討論一個具體問題。

明確職責(zé):當(dāng)單個模型需要處理過多問題時,可以通過拆分角色來明確每個模型的職責(zé)。例如,在一個復(fù)雜的對話系統(tǒng)中,可以設(shè)置不同的子模型分別處理用戶意圖識別、對話管理和應(yīng)答生成等任務(wù)。

角色拆分:通過角色拆分,確保每個模型處理的內(nèi)容單一而連貫,從而提升整體對話系統(tǒng)的性能和準(zhǔn)確性。例如,可以設(shè)置一個專門處理技術(shù)問題的模型和一個專門處理日常對話的模型,分別負(fù)責(zé)不同類型的對話。

為了模擬一個計(jì)算機(jī)科學(xué)家(Agent A)和一個法律專家(Agent B)協(xié)作解決人工智能合規(guī)標(biāo)準(zhǔn)制定的問題,我們設(shè)計(jì)了如下復(fù)雜的任務(wù)和分工:

gent A(計(jì)算機(jī)科學(xué)家):負(fù)責(zé)提出技術(shù)實(shí)施的建議和技術(shù)難題的解決,熟悉人工智能技術(shù)和數(shù)據(jù)隱私。

# agent_a.py
from common import create_app


app = create_app("system: 你是一個熟悉人工智能技術(shù)的計(jì)算機(jī)科學(xué)家。")


if __name__ == '__main__':
    app.run(port=5000)

Agent B(法律專家):負(fù)責(zé)評估合規(guī)性、提出法律建議和法規(guī)框架,精通法律法規(guī)和數(shù)據(jù)隱私保護(hù)。

# agent_b.py
from common import create_app


app = create_app("system: 你是一個熟悉法律法規(guī)的法律專家。")


if __name__ == '__main__':
    app.run(port=5001)

Agent C(標(biāo)準(zhǔn)化專家):負(fù)責(zé)協(xié)調(diào)和整合建議,生成完整的技術(shù)合規(guī)方案。確保最終的合規(guī)方案完整和可實(shí)施。

# agent_c.py
from flask import Flask, request, jsonify
from transformers import pipeline
from transformers import AutoTokenizer, AutoModelForCausalLM


from langchain.agents import initialize_agent, Tool, AgentType
from langchain.llms import HuggingFacePipeline
import requests
import torch


app = Flask(__name__)


cache_dir = './llama_cache'
model_path = cache_dir + '/LLM-Research/Meta-Llama-3-8B-Instruct'
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
    device_map="auto" if torch.cuda.is_available() else None,
    pad_token_id=tokenizer.eos_token_id
)


def call_expert(url, task_requirement):
    response = requests.post(url, json={"intent": task_requirement}, timeout=5)
    response.raise_for_status()
    return response.json().get("response", "Error: No response from expert")


ai_expert = lambda task: call_expert("http://localhost:5000/chat", task)
law_expert = lambda task: call_expert("http://localhost:5001/chat", task)


ai = Tool.from_function(func=ai_expert, name="ai_expert", description="當(dāng)你需要人工智能專家知識時使用這個工具,輸入為具體問題,返回為問題答案")
law = Tool.from_function(func=law_expert, name="law_expert", description="當(dāng)你需要法律合規(guī)專家知識時使用這個工具,輸入為具體問題,返回為問題答案")


tools = [ai, law]


pipe = pipeline(task="text-generation", model=model, tokenizer=tokenizer, max_new_tokens=512)
llm = HuggingFacePipeline(pipeline=pipe)


agent = initialize_agent(tools,
        llm,
        agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
        verbose=True,
        max_iterations = 5,
        handle_parsing_errors = True)


@app.route('/integrate', methods=['POST'])
def integrate():
    data = request.get_json()
    task = data.get('task', '')
    res = agent.run(task)
    return jsonify({'response': res})


if __name__ == '__main__':
    app.run(port=5002)

可以看出,在多智能體合作的時候,各個智能體在彼此的眼中都是工具。下面,通過 curl 命令向 http://localhost:5002/integrate 發(fā)送 POST 請求,任務(wù)描述為制定人工智能合規(guī)標(biāo)準(zhǔn),避免人工智能傷害人類。

返回結(jié)果為標(biāo)準(zhǔn)化專家(Agent C)通過協(xié)調(diào)計(jì)算機(jī)科學(xué)家(Agent A)和法律專家(Agent B)的響應(yīng)生成的綜合答案。

$ curl -X POST http://localhost:5002/integrate \
       -H "Content-Type: application/json" \
       -d '{"task": "制定人工智能合規(guī)標(biāo)準(zhǔn),避免人工智能傷害人類"}'

在這個設(shè)計(jì)示例中,計(jì)算機(jī)科學(xué)家和法律專家在制定人工智能合規(guī)標(biāo)準(zhǔn)時進(jìn)行了分工和協(xié)作。Agent A 提出技術(shù)實(shí)施的建議和解決技術(shù)難題,而 Agent B 負(fù)責(zé)評估合規(guī)性、提出法律建議和法規(guī)框架。這種分工模式能有效結(jié)合技術(shù)實(shí)施和法律法規(guī),以確保人工智能技術(shù)的合法合規(guī)性。

最后,我們展開介紹 common.py,這個函數(shù)接收模型目錄和種子記憶(seed memory)作為參數(shù),創(chuàng)建并返回一個 python 服務(wù)應(yīng)用。

這里有一個重點(diǎn),那就是我們要給每個 Agent 一個種子記憶,也就是它的全局人設(shè),這是智能體應(yīng)用中最重要的部分,因?yàn)槿绻麤]有一個堅(jiān)固的人設(shè),智能體在長期工作過程中一定會出現(xiàn)偏離,在后面課程中我將進(jìn)一步解釋這句話的含義。

# common.py
from flask import Flask, request, jsonify
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch


def create_app(seed_memory):
    app = Flask(__name__)


    cache_dir = './llama_cache'
    model_path = cache_dir + '/LLM-Research/Meta-Llama-3-8B-Instruct'
    tokenizer = AutoTokenizer.from_pretrained(model_path)
    model = AutoModelForCausalLM.from_pretrained(
        model_path,
        torch_dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
        device_map="auto" if torch.cuda.is_available() else None,
        pad_token_id=tokenizer.eos_token_id
    )


    # 定義聊天接口
    @app.route('/chat', methods=['POST'])
    def chat():
        data = request.get_json()
        intent = data.get('intent', '')


        # 構(gòu)造提示詞
        prompt = f"{seed_memory}\n請回答以下問題:{intent}"
        input_ids = tokenizer.encode(prompt, return_tensors="pt").to("cuda")
        outputs = model.generate(input_ids, max_length=150)
        response = tokenizer.decode(outputs[0], skip_special_tokens=True)


        return jsonify({'response': response})


    return app

當(dāng)然本節(jié)課的例子都是為了讓你可以快速產(chǎn)生感性認(rèn)識,這種實(shí)現(xiàn)方式適用于簡單的示例和小規(guī)模的應(yīng)用,但在生產(chǎn)環(huán)境中則需要進(jìn)一步地學(xué)習(xí)更復(fù)雜的方案。

責(zé)任編輯:武曉燕 來源: 二進(jìn)制跳動
相關(guān)推薦

2018-07-05 09:35:53

百度AI系統(tǒng)藍(lán)牙設(shè)備

2024-07-15 00:30:00

MetaAI 模型大語言模型

2024-02-17 21:50:30

2023-06-01 17:06:49

模型思維

2010-05-19 11:18:52

喬布斯蓋茨

2011-09-15 09:52:45

Delphi XE2

2020-06-23 12:31:21

人工智能

2024-05-16 08:48:57

2025-04-24 08:20:00

C#Llama3人工智能

2020-04-27 15:14:10

人工智能技術(shù)安全

2024-05-27 09:00:00

2024-05-27 09:01:42

Llama 3大型語言模型人工智能

2023-07-30 17:39:53

Vicuna數(shù)字孿生網(wǎng)友

2024-08-07 08:32:30

2024-07-24 13:18:17

2018-04-27 08:50:50

2024-11-12 08:59:39

2024-04-19 14:52:13

MetaGPT-4模型

2024-07-19 13:31:41

2024-11-07 15:40:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號