精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于Prefect、Weave和RAGAS的RAG應(yīng)用開發(fā)實(shí)戰(zhàn)

譯文 精選
人工智能 后端
本文介紹了RAG應(yīng)用程序開發(fā)中的一些增強(qiáng)技術(shù),例如加入線下/線上評估、借助Prefect自動提取數(shù)據(jù)等。

譯者 | 朱先忠

審校 | 重樓

幾個(gè)月前,我發(fā)布了一款電影搜索應(yīng)用程序“Film Search”,這是一個(gè)檢索增強(qiáng)生成(RAG)應(yīng)用程序,旨在根據(jù)用戶查詢實(shí)現(xiàn)電影推薦。例如,用戶可能會發(fā)出下面的英文提問:

“Find me drama movies in English that are less than 2 hours long and feature dogs.”

中文意思:“給我找一部長度不到2小時(shí)、以狗為主角的英文劇情片。”

之后,用戶會收到類似下面這樣的英文推薦:

Title of Film: Hachi: A Dog’s Tale

Runtime: 93 minutes
Release Year: 2009
Streaming: Not available for streaming
This film tells the poignant true story of Hachiko, an Akita dog known for his remarkable loyalty to his owner. The emotional depth and the themes of friendship and loyalty resonate strongly, making it a touching drama that showcases the profound bond between humans and dogs. It’s perfect for anyone looking for a heartfelt story that highlights the importance of companionship.

對應(yīng)的中文回答意思是:

電影名稱:忠犬八公的故事

片長:93分鐘

發(fā)行年份:2009

流媒體:不可用于流媒體

這部電影告訴了秋田犬Hachiko的辛酸真實(shí)故事,這種犬以其對主人的非凡忠誠而聞名。情感深度以及友誼和忠誠的主題引起了強(qiáng)烈的共鳴,使其成為一部感人的電影,展示了人與狗之間的深厚友誼。它非常適合想尋找一個(gè)發(fā)自內(nèi)心的故事來強(qiáng)調(diào)友誼重要性的人。

這個(gè)軟件不僅僅是一個(gè)簡單的RAG應(yīng)用程序。該程序中使用了所謂的自查詢檢索。這意味著,機(jī)器人接受用戶的查詢,并通過添加元數(shù)據(jù)過濾器對其進(jìn)行轉(zhuǎn)換。這樣就確保了拉入聊天模型上下文的任何文檔都遵守用戶查詢設(shè)置的約束。有關(guān)更多信息,我建議查看我文后提供的我早些時(shí)候發(fā)表的文章的鏈接。

但遺憾的是,該應(yīng)用程序尚存在如下一些問題:

  • 除了通過“肉眼測試”外,并沒有進(jìn)行離線評估。這種測試是必要的,但還不夠。
  • 沒有提供可觀察性支持。如果查詢進(jìn)展不順利,你必須手動調(diào)出項(xiàng)目并運(yùn)行一些特別的腳本,以便找出問題所在。
  • 必須手動拉入Pinecone向量數(shù)據(jù)庫。這意味著,如果一部電影從流媒體服務(wù)中撤下,這些文件很快就會過時(shí)。

在本文中,我將簡要介紹對以前開發(fā)的那款電影搜索應(yīng)用程序“Film Search”所做的一些改進(jìn),具體的改進(jìn)內(nèi)容將包括:

  • 使用RAGAS和Weave進(jìn)行離線評估。
  • 在線評估和可觀察性。
  • 使用Prefect自動提取數(shù)據(jù)。

在我們正式開始之前,還有一個(gè)細(xì)節(jié)需要說明:我發(fā)現(xiàn)“Film Search”這個(gè)名字有點(diǎn)籠統(tǒng),所以我把這個(gè)應(yīng)用程序重新命名為“Rosebud”,如下圖所示。不用多作解釋,我想任何一位真正的電影迷都會明白這個(gè)意思的(【譯者注】影片Citizen Kane(公民凱恩)的故事是由報(bào)業(yè)巨子凱恩臨死前說的一個(gè)字“玫瑰花蕾”(Rosebud)引出的)。

程序名字“Film Search”更改為“Rosebud”,此圖來自Unsplash網(wǎng)站

線下評估

能夠判斷對LLM應(yīng)用程序所做的更改是提高還是降低了程序性能,這一點(diǎn)是非常重要的。不幸的是,LLM應(yīng)用程序的評估是一個(gè)困難而新穎的領(lǐng)域。對于什么是好的評估,根本沒有達(dá)成太多的共識。

在新的程序Rosebud中,我決定解決所謂的“RAG Triad(RAG三元組):https://www.trulens.org/trulens_eval/getting_started/core_concepts/rag_triad/”問題。這種方法由TruLens推出,TruLens是一個(gè)評估和跟蹤LLM應(yīng)用程序的平臺。

RAG Triad(RAG三元組)

概括來看,三元組涵蓋了RAG應(yīng)用程序的三個(gè)方面:

  • 上下文相關(guān)性:當(dāng)用戶進(jìn)行查詢時(shí),文檔會填充聊天模型的上下文。檢索到的上下文真的有用嗎?如果沒有用,你可能需要調(diào)整文檔嵌入、分塊或元數(shù)據(jù)過濾等操作。
  • 可信度:模型的響應(yīng)是否真的基于檢索到的文檔而生成?你不希望模型編造事實(shí);RAG的全部目的是通過使用檢索到的文檔來幫助減少幻覺。
  • 答案相關(guān)性:模型的響應(yīng)是否真正回答了用戶的查詢?如果用戶詢問“20世紀(jì)90年代制作的喜劇電影有哪些?”,該模型的答案最好只包含20世紀(jì)90時(shí)代制作的喜劇影片。

目前,已經(jīng)存在幾種方法可以嘗試評估RAG應(yīng)用程序的這三個(gè)功能。一種方法是借助人類專家評估員。不幸的是,這種方法十分昂貴,而且無法擴(kuò)展。在新的程序Rosebud中,我決定使用大型數(shù)據(jù)模型進(jìn)行評估。這意味著,使用聊天模型來查看上述三個(gè)標(biāo)準(zhǔn)中的每一個(gè),并為每個(gè)標(biāo)準(zhǔn)分配0到1的分?jǐn)?shù)值。這種方法具有成本低、可擴(kuò)展性好的優(yōu)點(diǎn)。為了實(shí)現(xiàn)這一點(diǎn),我使用了RAGAS(https://github.com/explodinggradients/ragas),這是一個(gè)流行的框架,可以幫助你評估RAG應(yīng)用程序。RAGAS框架包括上述三個(gè)指標(biāo),可以很容易地使用它們來評估你的應(yīng)用程序。下面是一個(gè)代碼片段,演示了我是如何使用開源的RAGAS框架進(jìn)行離線評估的:

from ragas import evaluate
from ragas.metrics import AnswerRelevancy, ContextRelevancy, Faithfulness
import weave

@weave.op()
def evaluate_with_ragas(query, model_output):
#將數(shù)據(jù)放入一個(gè)數(shù)據(jù)集對象中
data = {
"question": [query],
"contexts": [[model_output['context']]],
"answer": [model_output['answer']]
}
dataset = Dataset.from_dict(data)

# 定義要判斷的指標(biāo)
metrics = [
AnswerRelevancy(),
ContextRelevancy(),
Faithfulness(),
]

judge_model = ChatOpenAI(model=config['JUDGE_MODEL_NAME'])
embeddings_model = OpenAIEmbeddings(model=config['EMBEDDING_MODEL_NAME'])

evaluation = evaluate(dataset=dataset, metrics=metrics, llm=judge_model, embeddings=embeddings_model)

return {
"answer_relevancy": float(evaluation['answer_relevancy']),
"context_relevancy": float(evaluation['context_relevancy']),
"faithfulness": float(evaluation['faithfulness']),
}
def run_evaluation():
#初始化聊天模型
model = rosebud_chat_model()
# 定義評估問題
questions = [
{"query": "Suggest a good movie based on a book."},  # Adaptations
{"query": "Suggest a film for a cozy night in."},  # Mood-Based
{"query": "What are some must-watch horror movies?"},  # Genre-Specific
...
# 共20個(gè)問題
]
#創(chuàng)建Weave評估對象
evaluation = weave.Evaluation(dataset=questions, scorers=[evaluate_with_ragas])
#運(yùn)行評估
asyncio.run(evaluation.evaluate(model))
if __name__ == "__main__":
weave.init('film-search')
run_evaluation()

在上述代碼中,有幾點(diǎn)注意事項(xiàng):

  • 有20個(gè)問題和3個(gè)評判標(biāo)準(zhǔn),你會看到60次LLM調(diào)用僅需要一次評估!然而,接下來的情況變得更糟了:通過調(diào)用函數(shù)rosebud_chat_model,每個(gè)查詢都需要兩次調(diào)用。其中,一個(gè)用于構(gòu)造元數(shù)據(jù)過濾器,另一個(gè)用于提供答案;所以,實(shí)際上這是對單個(gè)模型計(jì)算的120次調(diào)用!我評估的所有模型都是使用新的gpt-4o-mini,我也強(qiáng)烈推薦使用這種模型。根據(jù)我的經(jīng)驗(yàn),每次評估的調(diào)用費(fèi)用為0.05美元。
  • 請注意,我們使用了異步的asyncio.run運(yùn)行模型計(jì)算。這種情況下,使用異步調(diào)用是比較合適的,因?yàn)槟悴幌胍粋€(gè)接一個(gè)地以順序方式評估每個(gè)問題。相反,借助于asyncio框架,我們可以在等待之前的I/O操作完成時(shí)開始評估其他的問題。
  • 一次評估共有20個(gè)問題。這些涵蓋了用戶可能會提問的各種典型的電影查詢。這些大多是我自己想出的,但在實(shí)踐中,最好使用生產(chǎn)中用戶實(shí)際提出的查詢。
  • 請注意正在使用的weap.init和@weap.op裝飾器。它們是Weights & Biases(W&B) AI開發(fā)者平臺提供的新的Weave庫的一部分。其中,Weave庫是對傳統(tǒng)W&B庫的補(bǔ)充,專注于LLM應(yīng)用程序。它允許你通過使用簡單的@weap.op裝飾器來捕獲LLM的輸入和輸出。它還允許你使用weave.Evaluation(…)評估結(jié)果。通過集成RAGAS來執(zhí)行評估,并集成Weave框架來捕獲和記錄它們,我們便有了一個(gè)強(qiáng)大的組合,可以幫助GenAI開發(fā)人員以迭代方式不斷改進(jìn)他們的應(yīng)用程序。此外,你還可以記錄下模型延遲、所需成本等其他信息。

集成Weave+RAGAS的示例程序

從理論上講,現(xiàn)在我們可以調(diào)整一個(gè)超參數(shù)(如溫度),重新運(yùn)行評估,看看調(diào)整是否有積極或消極的影響了。但遺憾的是,在實(shí)踐中,我發(fā)現(xiàn)大型語言評判者的評判很挑剔,而且我也不是唯一一個(gè)發(fā)現(xiàn)這一點(diǎn)的人(https://x.com/aparnadhinak/status/1748368364395721128)。

大型語言模型評估似乎不太擅長使用浮點(diǎn)數(shù)來評估這些指標(biāo)。相反,它們似乎在分類方面做得更好些,例如回答“同意/不同意”這樣的問題。當(dāng)前,RAGAS尚不支持使用LLM評判者進(jìn)行分類。直接手寫有關(guān)代碼似乎也并不難,也許在未來的更新中,我可能會自己嘗試一下。

在線評估

離線評估有助于了解調(diào)整超參數(shù)如何影響性能,在我看來,在線評估要有用得多。在新的程序Rosebud中,我現(xiàn)在已經(jīng)使用“同意/不同意”的方案——使用每個(gè)響應(yīng)底部的兩個(gè)相應(yīng)按鈕來提供反饋。

在線反饋示例

當(dāng)用戶點(diǎn)擊上圖中底部任一按鈕時(shí),就會被告知他們的反饋已被記錄。以下給出在Streamlit應(yīng)用程序界面中如何實(shí)現(xiàn)這一點(diǎn)的代碼片段:

def start_log_feedback(feedback):
print("Logging feedback.")
st.session_state.feedback_given = True
st.session_state.sentiment = feedback
thread = threading.Thread(target=log_feedback, args=(st.session_state.sentiment,
st.session_state.query,
st.session_state.query_constructor,
st.session_state.context,
st.session_state.response))
thread.start()
def log_feedback(sentiment, query, query_constructor, context, response):
ct = datetime.datetime.now()
wandb.init(project="film-search",
name=f"query: {ct}")
table = wandb.Table(columns=["sentiment", "query", "query_constructor", "context", "response"])
table.add_data(sentiment,
query,
query_constructor,
context,
response
)
wandb.log({"Query Log": table})
wandb.finish()

請注意,向W&B發(fā)送反饋的過程是在單獨(dú)的線程上運(yùn)行的,而不是在主線程上運(yùn)行。這是為了防止用戶在等待日志記錄完成時(shí)被卡住幾秒鐘。

我們使用了一個(gè)W&B表格用于存儲反饋。表中記錄了五個(gè)數(shù)值:

  • 情緒(Sentiment):用戶是否點(diǎn)擊了拇指圖標(biāo)(同意/不同意)。
  • 查詢(Query):用戶的查詢,例如,查找長度不到2小時(shí)的英文戲劇電影和故事狗。
  • Query_Constructor:查詢構(gòu)造函數(shù)的結(jié)果,它重寫用戶的查詢,并在必要時(shí)包含元數(shù)據(jù)過濾,例如:
{
"query": "drama English dogs", 
"filter": {
"operator": "and", 
"arguments": [
{
"comparator": "eq", "attribute": "Genre", "value": "Drama"
}, 
{
"comparator": "eq", "attribute": "Language", "value": "English"
}, 

{
"comparator": "lt", "attribute": "Runtime (minutes)", "value": 120
}
]
},
}
  • 上下文(Context):基于重建的查詢檢索到的上下文,例如標(biāo)題“Title: Hachi: A Dog’s Tale. Overview: A drama based on the true story of a college professor’s…”。
  • 回應(yīng)(Response):模型的回應(yīng)。

所有這些都可以方便地記錄在與前面顯示的Weave評估相同的項(xiàng)目中。現(xiàn)在,當(dāng)查詢“不同意”情況時(shí),只需按下拇指向下的圖標(biāo)按鈕即可查看到底發(fā)生了什么。這將有助于使推薦應(yīng)用程序Rosebud的迭代和改進(jìn)加快速度。

模型響應(yīng)可觀測性展示(請注意左側(cè)的W&B和Weave之間的無縫過渡)

借助Prefect自動提取數(shù)據(jù)

為了使推薦程序Rosebud保持準(zhǔn)確性,將數(shù)據(jù)提取和上傳到Pinecone向量數(shù)據(jù)庫的過程自動化非常重要。對于這個(gè)任務(wù),我選擇使用Prefect(https://www.prefect.io/)。Prefect是一個(gè)流行的工作流編排工具。我一直在尋找一些輕量級、易于學(xué)習(xí)和Python風(fēng)格的程序。最后,我在Prefect中找到了這一切。

Prefect提供的用于提取和更新Pinecone向量存儲的自動流程

Prefect支持提供多種方式來規(guī)劃你的工作流程。我決定使用帶有自動基礎(chǔ)設(shè)施配置的推送工作池方式。我發(fā)現(xiàn)這種設(shè)置在簡單性和可配置性之間取得了平衡。它允許用戶委托Prefect自動配置在所選云提供商中運(yùn)行流所需的所有基礎(chǔ)設(shè)施。經(jīng)過幾番權(quán)衡后,我選擇在Azure上部署,但是在GCP或AWS上部署的話只需要更改幾行代碼即可。有關(guān)更多詳細(xì)信息,請參閱pinecone_flow.py文件。下面代碼只是提供了一個(gè)簡化的流程:

@task
def start():
"""
啟動:檢查一切工作或失敗的速度快!
"""
#打印出一些調(diào)試信息
print("Starting flow!")
# 確保用戶已經(jīng)設(shè)置了適當(dāng)?shù)沫h(huán)境變量
assert os.environ['LANGCHAIN_API_KEY']
assert os.environ['OPENAI_API_KEY']
...
@task(retries=3, retry_delay_seconds=[1, 10, 100])
def pull_data_to_csv(config):
TMBD_API_KEY = os.getenv('TMBD_API_KEY')
YEARS = range(config["years"][0], config["years"][-1] + 1)
CSV_HEADER = ['Title', 'Runtime (minutes)', 'Language', 'Overview', ...]

for year in YEARS:
# 獲取所有在{Year}中制作的電影的id列表
movie_list = list(set(get_id_list(TMBD_API_KEY, year)))

FILE_NAME = f'./data/{year}_movie_collection_data.csv'

#生成文件
with open(FILE_NAME, 'w') as f:
writer = csv.writer(f)
writer.writerow(CSV_HEADER)
...
print("Successfully pulled data from TMDB and created csv files in data/")
@task
def convert_csv_to_docs():
#從所有csv文件中加載數(shù)據(jù)
loader = DirectoryLoader(
...
show_progress=True)
docs = loader.load()
metadata_field_info = [
AttributeInfo(name="Title",
description="The title of the movie", type="string"),
AttributeInfo(name="Runtime (minutes)",
description="The runtime of the movie in minutes", type="integer"),
...
]

def convert_to_list(doc, field):
if field in doc.metadata and doc.metadata[field] is not None:
doc.metadata[field] = [item.strip()
for item in doc.metadata[field].split(',')]
...
fields_to_convert_list = ['Genre', 'Actors', 'Directors',
'Production Companies', 'Stream', 'Buy', 'Rent']
...
# 將'overview' 和'keywords' 設(shè)置為'page_content',其他字段設(shè)置為'metadata'
for doc in docs:
#將page_counte字符串解析為字典
page_content_dict = dict(line.split(": ", 1)
for line in doc.page_content.split("\n") if ": " in line)

doc.page_content = (
'Title: ' + page_content_dict.get('Title') +
'. Overview: ' + page_content_dict.get('Overview') +
...
)
...
print("Successfully took csv files and created docs")

return docs
@task
def upload_docs_to_pinecone(docs, config):
# 創(chuàng)建空索引
PINECONE_KEY, PINECONE_INDEX_NAME = os.getenv(
'PINECONE_API_KEY'), os.getenv('PINECONE_INDEX_NAME')

pc = Pinecone(api_key=PINECONE_KEY)

# 目標(biāo)索引和檢查狀態(tài)
pc_index = pc.Index(PINECONE_INDEX_NAME)
print(pc_index.describe_index_stats())
embeddings = OpenAIEmbeddings(model=config['EMBEDDING_MODEL_NAME'])
namespace = "film_search_prod"
PineconeVectorStore.from_documents(
docs,
...
)
print("Successfully uploaded docs to Pinecone vector store")
@task
def publish_dataset_to_weave(docs):
#初始化Weave
weave.init('film-search')
rows = []
for doc in docs:
row = {
'Title': doc.metadata.get('Title'),
'Runtime (minutes)': doc.metadata.get('Runtime (minutes)'),
...
}
rows.append(row)

dataset = Dataset(name='Movie Collection', rows=rows)
weave.publish(dataset)
print("Successfully published dataset to Weave")

@flow(log_prints=True)
def pinecone_flow():
with open('./config.json') as f:
config = json.load(f)
start()
pull_data_to_csv(config)
docs = convert_csv_to_docs()
upload_docs_to_pinecone(docs, config)
publish_dataset_to_weave(docs)
if __name__ == "__main__":
pinecone_flow.deploy(
name="pinecone-flow-deployment",
work_pool_name="my-aci-pool",
cron="0 0 * * 0",
image=DeploymentImage(
name="prefect-flows:latest",
platform="linux/amd64",
)
)

請注意,將Python函數(shù)轉(zhuǎn)換為Prefect流是非常簡單的事情。你只需要在主函數(shù)上使用@task裝飾器和@flow裝飾器來設(shè)計(jì)一些子函數(shù)。還要注意,在將文檔上傳到Pinecone向量數(shù)據(jù)庫后,我們流程的最后一步是將數(shù)據(jù)集發(fā)布到Weave。這對于再現(xiàn)性很重要。為了學(xué)習(xí)Prefect的基礎(chǔ)知識,我建議你瀏覽一下他們官網(wǎng)上的教程(https://docs.prefect.io/latest/tutorial/)。

在上面腳本的最后,我們看到部署是如何在Prefect中完成的。

  • 我們需要為部署提供一個(gè)名稱,這個(gè)名稱是自由決定的。
  • 我們還需要指定一個(gè)work_pool_name。Prefect中的推送工作池會自動將任務(wù)發(fā)送到無服務(wù)器計(jì)算機(jī),而不需要中介。此名稱需要與用于創(chuàng)建池的名稱相匹配,我們將在下面看到。
  • 你還需要指定一個(gè)cron,它是計(jì)時(shí)器的縮寫。這允許你指定重復(fù)工作流的頻率。值“0 0**0”表示每周重復(fù)此工作流。
  • 最后,你需要指定一個(gè)DeploymentImage。在這里,你可以指定名稱和平臺。名稱是任意的,但平臺不是。由于我想部署到Azure計(jì)算實(shí)例,而這些實(shí)例運(yùn)行Linux操作系統(tǒng),所以我在DeploymentImage中指定這一點(diǎn)很重要。

要使用命令行方式在Azure上部署此流,請運(yùn)行以下命令:

prefect work-pool create --type azure-container-instance:push --provision-infra my-aci-pool
prefect deployment run 'get_repo_info/my-deployment'

這些命令將自動在Azure上提供所有必要的基礎(chǔ)設(shè)施。這包括一個(gè)Azure容器注冊表(ACR),它將保存一個(gè)Docker映像,其中包含目錄中的所有文件以及requirements.txt中列出的任何必要的依賴庫。它還將包括一個(gè)Azure容器實(shí)例(ACI)標(biāo)識,該標(biāo)識將具有部署具有上述Docker映像的容器所需的權(quán)限。最后,使用deployment run命令安排每周運(yùn)行的代碼。你可以通過Prefect控制面板來查看你的流是否運(yùn)行:

Prefect中的流正在成功運(yùn)行的情形

通過每周更新我的Pinecone向量庫,我可以確保來自程序Rosebud的推薦結(jié)果準(zhǔn)確。

總結(jié)

在本文中,我介紹了我的改進(jìn)后的Rosebud應(yīng)用程序的一些改進(jìn)方案。這包括整合離線和在線評估的過程,以及自動更新我的Pinecone向量庫等。

本文還有未提及的其他一些改進(jìn),包括:

  • 在電影數(shù)據(jù)中包括電影數(shù)據(jù)庫的評級。現(xiàn)在,你可以使用“好評電影(highly rated films)”,這種聊天模式能夠過濾掉7/10以上的電影。
  • 升級了聊天模式。現(xiàn)在查詢和摘要模型使用的是模型gpt-4o-mini。請回想一下,LLM判斷模型也是使用了模型gpt-4o-mini。
  • 嵌入模型從text-Embedding-ada-002升級為text-embeading-3-small。
  • 現(xiàn)在的年份跨越1950年至2023年,而不是從1920年開始。1920年至1950年的電影數(shù)據(jù)質(zhì)量不高,只有糟糕的推薦。
  • 用戶界面更加清晰,所有關(guān)于項(xiàng)目的細(xì)節(jié)都放在側(cè)邊欄中。
  • 程序在GitHub上的文檔得到了進(jìn)一步的改進(jìn)。
  • 修復(fù)了一些錯(cuò)誤。

正如文章一開始提到的,該應(yīng)用程序現(xiàn)在可以100%免費(fèi)使用!在可預(yù)見的未來,我將為查詢買單(因此選擇gpt-4o-mini而不是更昂貴的gpt-4o)。我真的很想獲得在生產(chǎn)環(huán)境中運(yùn)行應(yīng)用程序的經(jīng)驗(yàn),并讓我的讀者測試Rosebud,這是一個(gè)很好的方法。萬一應(yīng)用程序真的“火爆”了,我將不得不想出其他的融資模式。但這會是一個(gè)很大的問題。

下面,請盡情享受使用Rosebud程序搜索精彩電影的樂趣吧!

譯者介紹

朱先忠,51CTO社區(qū)編輯,51CTO專家博客、講師,濰坊一所高校計(jì)算機(jī)教師,自由編程界老兵一枚。

原文標(biāo)題:Productionizing a RAG App with Prefect, Weave, and RAGAS,作者:Ed Izaguirre

鏈接:https://towardsdatascience.com/productionizing-a-rag-app-04c857e0966e。

責(zé)任編輯:姜華 來源: 51CTO內(nèi)容精選
相關(guān)推薦

2024-10-29 11:54:25

2023-12-25 14:34:27

2024-05-22 09:38:25

2025-02-14 00:00:35

2009-03-03 10:06:00

IBMJavaOSGi

2025-05-22 06:48:50

RAGAI應(yīng)用開發(fā)框架DeepSeek

2025-10-30 00:00:00

2025-03-19 08:43:17

檢索增強(qiáng)生成RAG大型語言模型

2024-06-24 14:32:33

2025-01-13 10:55:53

2022-04-01 10:51:33

TektonArgoCDGitOps

2025-02-06 08:26:21

2009-05-20 14:48:07

ibmdwEclipse開發(fā)技巧

2024-03-19 08:45:45

WebSocketSpring應(yīng)用開發(fā)

2025-05-27 00:15:00

RAG指數(shù)圖譜大模型

2022-07-12 17:24:48

NginxDocker

2014-07-29 10:35:21

DockerNodeJS

2024-08-07 08:32:30

2010-04-07 08:55:00

OSGiSpring

2012-03-06 10:56:32

HTML 5
點(diǎn)贊
收藏

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

冲田杏梨av在线| 大波视频国产精品久久| 亚洲精品视频久久久| 校园春色亚洲| 久久综合精品国产一区二区三区| 性欧美激情精品| 性生活在线视频| 成人女同在线观看| 成人国产免费视频| 91成品人片a无限观看| wwwww在线观看| xxx.xxx欧美| 久久婷婷久久一区二区三区| 国产成人精品免高潮费视频| 手机看片日韩av| 国产精品美女久久久久人| 亚洲激情自拍视频| 黑人巨大精品欧美一区二区小视频| 美国黄色小视频| 看全色黄大色大片免费久久久| 欧美日韩综合视频网址| 神马欧美一区二区| 午夜偷拍福利视频| 国产99亚洲| 欧美日韩精品一区二区三区四区 | 久久99青青精品免费观看| 免费黄色a级片| 午夜激情成人网| 亚洲少妇中出一区| 国产精品一区二区三区免费| 无码人妻av免费一区二区三区| 国产精品国产三级国产在线观看| 欧美精品一区二区不卡| 九九热精品国产| 九九热线视频只有这里最精品| 亚洲在线免费播放| 欧美激情一区二区三区在线视频 | 欧美色区777第一页| 黄色一级片av| 国产在线中文字幕| 93久久精品日日躁夜夜躁欧美| 2022国产精品| 国产三级按摩推拿按摩| 日本美女视频一区二区| 欧美在线视频免费播放| 国产精品18p| 欧美日韩亚洲国产精品| 久久久av一区| 美国一级片在线观看| 精品国产一区二区三区| 精品视频在线播放免| 日韩精品一区二区三区高清免费| 日韩精品一区二区三区中文字幕| 欧美日本一区二区三区| 黑森林精品导航| 精品欧美一区二区三区在线观看| 懂色av一区二区三区| 777av视频| sqte在线播放| 香蕉影视欧美成人| 精品国产一区三区| 毛片电影在线| 日韩欧美在线观看视频| 欧美日韩亚洲第一| 性高爱久久久久久久久| 91成人在线免费观看| 午夜精品久久久内射近拍高清| 日韩在线伦理| 91久久精品一区二区| 免费大片在线观看| 少妇精品视频一区二区免费看| 在线观看三级视频欧美| 麻豆三级在线观看| 日韩成人在线一区| 欧美一区国产二区| 乳色吐息在线观看| av毛片精品| 亚洲国产日韩欧美在线图片| 人妻丰满熟妇av无码久久洗澡| 日韩av网址大全| 亚洲美女久久久| 亚洲精品视频网址| 亚洲视频在线免费| 国语自产精品视频在线看| 日韩黄色一级大片| 日韩激情一区二区| 91沈先生作品| 亚洲精品网站在线| 91婷婷韩国欧美一区二区| 区一区二区三区中文字幕| 午夜视频在线观看网站| 亚洲夂夂婷婷色拍ww47 | 老司机精品导航| 国产精品99蜜臀久久不卡二区| 一级黄色a视频| 粉嫩久久99精品久久久久久夜| 精品久久精品久久| av网站无病毒在线| 亚洲愉拍自拍另类高清精品| 秋霞无码一区二区| 视频精品导航| 欧美大片免费久久精品三p| 日韩av在线看免费观看| 亚洲欧美色图| 日韩av电影手机在线| 91丨九色丨丰满| 国产精品亚洲一区二区三区妖精| 美国av一区二区三区| 黄网页免费在线观看| 午夜精品一区在线观看| 一级做a免费视频| 久久草在线视频| 日韩在线精品一区| 黄网在线观看视频| 国产在线精品免费av| 精品一区二区三区视频日产| 免费av在线网址| 一本一道久久a久久精品 | 大胆亚洲人体视频| 亚洲精品9999| 擼擼色在线看观看免费| 欧美一区二区久久| 91激情视频在线观看| 在线欧美不卡| 成人亚洲激情网| 国产福利在线看| 亚洲国产精品欧美一二99| 污视频网站观看| 神马久久影院| 欧美日本在线视频中文字字幕| 午夜精品久久久久久久蜜桃| 成人一区二区在线观看| 亚洲一区二区三区在线观看视频| 欧美私密网站| 欧美成人一区二区三区片免费| 永久免费av无码网站性色av| 中国女人久久久| 波多野结衣成人在线| 一级日本在线| 欧亚一区二区三区| 黄瓜视频污在线观看| 国内成人在线| 成人免费视频网站| 色婷婷在线播放| 日韩视频一区二区在线观看| 亚洲激情图片网| 蜜臀av一区二区| 日韩电影免费观看在| av资源亚洲| 日韩电影免费在线观看中文字幕| 日产欧产va高清| 成人午夜碰碰视频| 欧日韩免费视频| youjizz欧美| 高清视频欧美一级| 日韩专区第一页| 亚洲v精品v日韩v欧美v专区| 91丝袜在线观看| 99精品视频免费观看视频| 国产一区二区三区四区五区加勒比| 一区二区三区伦理| 日韩美女主播在线视频一区二区三区 | 国产亚洲色婷婷久久99精品| 国产寡妇亲子伦一区二区| 欧美少妇一级片| 欧美三级一区| 久久久久久久爱| 天天干,夜夜操| 狠狠躁夜夜躁人人躁婷婷91| 国精产品一区一区三区免费视频 | 成人av综合网| 97香蕉久久超级碰碰高清版| 日韩欧美电影在线观看| 欧美午夜www高清视频| 国产全是老熟女太爽了| 免费人成在线不卡| 天天想你在线观看完整版电影免费| 香蕉成人app| 国内免费精品永久在线视频| 婷婷av一区二区三区| 色综合久久久久网| 精品无码一区二区三区蜜臀| 国产jizzjizz一区二区| 久久精品视频16| 红桃视频在线观看一区二区| 国产精品在线看| 韩国成人免费视频| 亚洲欧美www| 国产精品久久综合青草亚洲AV| 一区二区三区四区高清精品免费观看 | 丁香六月激情综合| 国产精品中文欧美| 久久无码高潮喷水| 婷婷久久综合| 精品久久精品久久| 亚洲黑人在线| 91精品国产高清久久久久久91| 成年人在线观看网站| 日韩精品一区二区三区视频| 91丝袜一区二区三区| 一区二区中文视频| 影音先锋黄色资源| 九色综合狠狠综合久久| 波多野结衣家庭教师在线播放| 精品视频日韩| 国产精品一区二区a| 国产成人久久精品麻豆二区| 久久久久久久久久久免费| 福利片在线观看| 精品国产91洋老外米糕| 一区二区视频网站| 五月激情六月综合| 欧美激情图片小说| 亚洲国产精品成人综合| 中文字幕a在线观看| 久久精品二区亚洲w码| 国产l精品国产亚洲区久久| 一区二区日韩欧美| 色一情一乱一伦一区二区三区 | 久久精品在线| 乱熟女高潮一区二区在线| 日韩国产一区二区三区| 久久久久久九九九九| 9l亚洲国产成人精品一区二三| 国产精品视频在线观看| 婷婷电影在线观看| 欧美国产激情18| 国产原厂视频在线观看| 国产亚洲一级高清| 日本韩国一区| 亚洲国产精品久久久久秋霞蜜臀| 91麻豆一区二区| 欧美在线免费观看视频| 亚洲免费激情视频| 一个色综合网站| 色在线观看视频| 亚洲日本成人在线观看| 国产白丝一区二区三区| 中文在线资源观看网站视频免费不卡| 国内精品久久99人妻无码| 成人自拍视频在线| 精人妻一区二区三区| 国产精品一品二品| 中文字幕在线视频一区二区| 韩国一区二区视频| 污污的视频免费| 麻豆国产91在线播放| 亚洲一区日韩精品| 久久成人综合网| www.com黄色片| 另类专区欧美蜜桃臀第一页| 9久久婷婷国产综合精品性色| 日韩精品乱码免费| 啊啊啊国产视频| 日本少妇一区二区| 婷婷免费在线观看| 蜜臀av一区二区在线观看| 国产高清视频网站| 精品制服美女丁香| 伊人免费视频二| 国产精品主播直播| 精品人妻人人做人人爽夜夜爽| 国产成人福利片| 亚洲国产天堂久久国产91| 免费观看国产精品视频| 韩国av一区| 亚洲国产成人精品无码区99| 亚洲激情另类| 亚洲中文字幕无码中文字| 久久婷婷亚洲| 爱情岛论坛成人| 精品一区免费av| 国产在线a视频| 不卡的av网站| 亚洲黄色小说视频| 亚洲欧洲另类国产综合| 欧美日韩在线视频免费| 亚洲.国产.中文慕字在线| 特级西西444www大精品视频免费看| 日韩欧美福利视频| 一级特黄aaa大片在线观看| 日韩午夜av一区| 色视频在线观看免费| 在线日韩av观看| 羞羞的视频在线观看| 97国产精品视频| 久久久精品一区二区毛片免费看| 91免费视频国产| 日韩a级大片| 亚洲精品无人区| 欧美日韩免费| 国产福利一区视频| 国产成人精品1024| av男人的天堂av| 一区二区三区四区亚洲| 少妇高潮av久久久久久| 欧美一区二区三区婷婷月色| 少妇精品高潮欲妇又嫩中文字幕| 亚洲午夜av久久乱码| 影音先锋男人在线资源| 4p变态网欧美系列| 国产色99精品9i| 久久99精品久久久久久青青日本| 97国产精品| 国产青青在线视频| 久久91精品久久久久久秒播| 亚洲色图14p| 亚洲美女免费在线| japanese国产在线观看| 精品免费99久久| 麻豆tv免费在线观看| 日韩美女主播视频| 国产精品x8x8一区二区| 中文字幕一区二区三区有限公司| 国产视频一区三区| 中文字幕1区2区| 国产精品久久久久久久久图文区| 日韩 欧美 综合| 欧美xxxx老人做受| 日本www在线| 国产成+人+综合+亚洲欧洲 | 欧美日韩一区二区区| 国产无一区二区| 国产网站在线看| 51精品秘密在线观看| 国际av在线| 97香蕉久久超级碰碰高清版| 国产精品久久久久久久久久辛辛| 日韩欧美精品一区二区| 亚洲男女自偷自拍| 国产大学生视频| 一区二区三区精密机械公司| 少妇又紧又色又爽又刺激视频 | 国产成一区二区| 六月丁香久久丫| 97超碰在线人人| 国产成人在线观看免费网站| 91精品少妇一区二区三区蜜桃臀| 欧美丝袜第三区| 可以在线观看的黄色| 欧洲精品在线视频| 无码少妇一区二区三区| 欧美黑人在线观看| 国产91综合一区在线观看| 2021亚洲天堂| 日韩一区二区三| 污污的视频在线观看| 92看片淫黄大片看国产片| 99视频精品全部免费在线视频| 在线看的黄色网址| 国产精品三级av| 国产精品视频一二区| 日韩中文字在线| 国模大尺度视频一区二区| 中国老女人av| 国产电影精品久久禁18| 久久精品一级片| 精品欧美黑人一区二区三区| 国产啊啊啊视频在线观看| 国产女人水真多18毛片18精品| 日韩午夜av| 波多野结衣办公室33分钟| 日韩人在线观看| 国产高清在线看| 91九色蝌蚪国产| 欧美日韩国产综合网| 国产精品无码在线| 91官网在线免费观看| 97最新国自产拍视频在线完整在线看| 国产日韩中文字幕在线| 欧美国产偷国产精品三区| 亚洲一二三不卡| 亚洲午夜精品久久久久久久久| 爽爽视频在线观看| 国产精品欧美一区二区三区奶水| 日韩精品首页| 又黄又爽又色的视频| 五月天精品一区二区三区| 日韩午夜影院| 成人春色激情网| 在线免费高清一区二区三区| 亚洲区自拍偷拍| 6080日韩午夜伦伦午夜伦| 狂野欧美性猛交xxxxx视频| 久久资源av| 老司机免费视频一区二区三区| 9999热视频| 亚洲国内精品视频| 国产精品亚洲一区二区三区在线观看| 99re99热| 不卡一区在线观看| 日本成人一级片| 欧美成人免费播放| 亚洲欧洲色图| 久久精品无码一区二区三区毛片| 天天射综合影视| 国产传媒在线播放| 六十路精品视频| 国模一区二区三区白浆| 国产一级做a爱片久久毛片a|