精品欧美一区二区三区在线观看 _久久久久国色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网| 国产欧美一区二区精品忘忧草| 欧美成人精品三级在线观看| 女人扒开双腿让男人捅| 国产美女高潮在线观看| 国产三级一区二区| 97人人模人人爽人人少妇| 国产精品第9页| 色男人天堂综合再现| 日韩精品一区二区三区蜜臀| 东京热加勒比无码少妇| 久久综合之合合综合久久| 成人免费高清视频| 国产精品久久久久久影视| 久久久精品人妻一区二区三区四| 蜜桃视频欧美| 精品国产自在久精品国产| 各处沟厕大尺度偷拍女厕嘘嘘| 免费在线看黄| 久久青草国产手机看片福利盒子| 1区1区3区4区产品乱码芒果精品| 麻豆精品久久久久久久99蜜桃| 天天影视欧美综合在线观看| 日韩精品在线私人| 免费欧美一级片| 亚洲a∨精品一区二区三区导航| 一二三四社区欧美黄| 色综合666| 亚洲欧美日韩精品永久在线| 国产一区二区三区精品视频| 国产精品www色诱视频| 国产精品成人久久| 午夜精品视频| 久久久精品免费| 日本人亚洲人jjzzjjz| 国产图片一区| 日韩美女主播在线视频一区二区三区 | 91精品短视频| 欧美色手机在线观看| 国产性xxxx18免费观看视频| 高端美女服务在线视频播放| 一区二区三区久久| 91视频成人免费| 免费在线毛片网站| 国产精品欧美一级免费| 日本婷婷久久久久久久久一区二区| 丰满少妇被猛烈进入| 精品一区二区免费看| 国产精品激情av在线播放| 国产三级av片| 国产一区91| 97在线精品视频| 国产乡下妇女做爰视频| 国内精品久久久久久久影视麻豆| 欧美www在线| 91高清免费观看| 一区二区电影在线观看| 久久久精品免费视频| 538任你躁在线精品视频网站| 91日韩欧美| 久久精品91久久香蕉加勒比| 国产又色又爽又高潮免费| 成人vr资源| 俺也去精品视频在线观看| 99热这里只有精品4| 99精品视频在线观看免费播放| 亚洲天堂成人在线视频| 国产1区2区在线观看| 日韩精品永久网址| xxxxxxxxx欧美| 波多野结衣亚洲色图| 国内精品久久久久国产盗摄免费观看完整版 | 激情小说欧美色图| 大桥未久女教师av一区二区| 亚洲精品不卡在线| 成人免费av片| 成人亚洲一区| 久精品免费视频| 国产69精品久久久久久久久久| 亚洲一级在线| 国产精品一区二区久久久久| 国产视频第二页| 风间由美性色一区二区三区| 开心色怡人综合网站| av大片在线播放| 亚洲精品欧美在线| 好吊妞无缓冲视频观看| 日韩欧美一区二区三区免费观看 | 岳的好大精品一区二区三区| 中文字幕在线成人| 亚洲av鲁丝一区二区三区| 136国产福利精品导航网址| 欧美孕妇性xx| 夜夜嗨av禁果av粉嫩avhd| 国产成人午夜精品5599| 欧美日韩一区综合| 黄色网在线播放| 天天操天天综合网| jizzzz日本| 久久男人av| 日韩中文综合网| 日本三级视频在线| 日本成人中文字幕在线视频| 成人av影视在线| avtt亚洲| 五月天国产精品| 99国产精品久久久久久| 日韩高清一级| 久久99久国产精品黄毛片入口 | 337p亚洲精品色噜噜噜| 日韩综合第一页| 国产精品久久久久久久免费观看 | 91在线视频观看| 国产成年人在线观看| 亚洲人体视频| 欧美成人高清电影在线| 国产黄色大片免费看| 亚洲精选成人| 亚洲最大av在线| jizz亚洲| 色噜噜久久综合| 高清中文字幕mv的电影| 婷婷久久一区| 国产精品久在线观看| 日本免费一区视频| 亚洲免费观看视频| mm131国产精品| 国产精品密蕾丝视频下载 | 黄频视频在线观看| 欧美大电影免费观看| 亚洲高清久久网| 中文字幕手机在线观看| 精品无人区卡一卡二卡三乱码免费卡| 久久精品国产精品国产精品污 | 成人一区二区电影| 福利在线播放| 91国偷自产一区二区开放时间 | 午夜激情一区| 91中文字幕一区| 免费的黄网站在线观看| 欧美午夜精品久久久久久超碰| 风间由美一二三区av片| 亚洲激情女人| 国产伦理一区二区三区| 日本在线视频www鲁啊鲁| 欧美一区二区高清| 亚洲不卡在线播放| 久久 天天综合| 一区二区不卡在线观看| 久久91超碰青草在哪里看| 一本色道久久综合亚洲精品小说 | h色网站在线观看| 黄页网站大全一区二区| 最新精品视频| 国产高清日韩| 欧美福利在线观看| 免费看av毛片| 天天操天天综合网| 无码国产69精品久久久久同性| 亚洲一区二区三区高清| 欧美成人免费在线| 亚洲1234区| 日韩一区二区精品视频| 国产伦理一区二区| 依依成人综合视频| 污片免费在线观看| 亚洲精品乱码久久久久久蜜桃麻豆| 国产日韩欧美精品| 中文字幕在线高清| 在线日韩精品视频| 国产精品系列视频| 亚洲午夜视频在线| 亚洲熟妇无码av| 老司机精品视频导航| 天天操天天干天天玩| 超碰成人在线免费| 日韩av片电影专区| 大地资源网3页在线观看| 在线成人高清不卡| 亚欧洲精品在线视频| 91网站在线播放| 日韩精品视频一二三| 欧美精品自拍| 欧美精品在线一区| 亚洲成人精品综合在线| 久久久久久久999| 你懂的视频在线| 91精品啪在线观看国产60岁| 日韩欧美a级片| 国产精品美女久久久久av爽李琼 | 国产精品久久久久久户外露出| 奇米777在线视频| 国产亚洲精品bv在线观看| 日韩精品欧美一区二区三区| 韩国三级成人在线| 91精品国产91久久久久福利| av播放在线| 日韩精品免费在线播放| 97精品人妻一区二区三区香蕉| 亚洲影视在线播放| 免费黄在线观看| 成人动漫在线一区| 黄色小视频免费网站| 最新国产乱人伦偷精品免费网站| 亚洲精品电影在线一区| youjizzjizz亚洲| 国产日韩在线精品av| 亚洲十八**毛片| 欧美人在线视频| 午夜在线视频| 亚洲色图美腿丝袜| 日本免费一区视频| 日韩一卡二卡三卡四卡| 亚洲精品无码久久久久| 亚洲成a人v欧美综合天堂下载| 婷婷国产成人精品视频| 久久久久99精品国产片| 少妇伦子伦精品无吗| 久久99久久精品| 国产免费人做人爱午夜视频| 国一区二区在线观看| 色中文字幕在线观看| 欧美人与拘性视交免费看| 国产精品一码二码三码在线| 国产精品国产三级在线观看| 国产精品久久久久免费a∨| 黑人巨大精品欧美一区二区桃花岛| 欧美极品在线播放| 99视频免费在线观看| 色黄久久久久久| 成人在线免费公开观看视频| 亚洲精品一区二区三区婷婷月| 亚洲精品.www| 欧美一二三四在线| 99精品视频免费看| 欧美日韩高清不卡| 中文字幕日韩经典| 欧美在线免费视屏| 69视频免费看| 91成人网在线| 日本成人一级片| 欧美亚洲综合一区| 亚洲毛片一区二区三区| 色综合久久久久综合99| 久久国产精品免费看| 五月婷婷另类国产| 日韩经典在线观看| 婷婷综合另类小说色区| 日韩精品成人在线| 日韩欧美高清在线视频| 综合网在线观看| 一本大道久久a久久综合婷婷 | 久久亚洲二区| 欧美一级片中文字幕| 久久黄色影院| 手机在线免费观看毛片| 毛片不卡一区二区| 亚洲va在线va天堂va偷拍| 久久99这里只有精品| 成人高清在线观看视频| 国产98色在线|日韩| 午夜不卡久久精品无码免费| 99国产一区二区三精品乱码| 欧美色图亚洲激情| 中文字幕欧美国产| 尤物在线免费视频| 亚洲国产毛片aaaaa无费看| 日韩精品久久久久久久酒店| 色哟哟一区二区| 一级黄色片在线看| 日韩欧美精品在线视频| 污视频在线免费| 国产一区二区免费| 国产精品va在线观看视色| 欧美日本中文字幕| 波多野结衣亚洲| 成人激情视频在线| 久9re热视频这里只有精品| 欧美一区二区三区四区五区六区 | 久久久久久综合| 精品视频第一页| 一区二区三区欧美日韩| 天天操天天操天天操天天| 欧美日韩在线亚洲一区蜜芽| 国产www视频| 亚洲毛茸茸少妇高潮呻吟| 日本在线免费播放| 国内精品久久久久伊人av | 999视频在线观看| 免费av一区| 久久天天东北熟女毛茸茸| 免费日韩av| 可以看的av网址| 国产色产综合色产在线视频| 青娱乐在线视频免费观看| 欧美午夜xxx| aaa国产视频| 亚洲午夜久久久影院| 女子免费在线观看视频www| 国产成人精品免高潮在线观看 | 另类小说视频一区二区| 特级特黄刘亦菲aaa级| 欧美激情综合五月色丁香| 久久久久久久久久久久久久免费看| 色综合久久88色综合天天| 精品黑人一区二区三区在线观看| 亚洲色图国产精品| av日韩中文| 91在线视频导航| 欧美男同视频网| 久久久性生活视频| 精品亚洲porn| 91导航在线观看| 福利视频一区二区| 精品国产av鲁一鲁一区| 在线中文字幕日韩| 蜜桃视频m3u8在线观看| 97人人干人人| 亚洲美女视频| 污污网站免费看| 国产亚洲欧美激情| 日本熟妇色xxxxx日本免费看| 在线播放/欧美激情| 成人精品一区| 欧美最顶级丰满的aⅴ艳星| 一区二区三区欧洲区| 在线免费一区| 美女视频一区在线观看| 舐め犯し波多野结衣在线观看| 亚洲成国产人片在线观看| 国产丰满果冻videossex| 日韩在线视频网站| 国产一区一一区高清不卡| 免费看国产精品一二区视频| 伊人久久久大香线蕉综合直播 | 精品国产免费av| av在线免费不卡| 日本三级免费看| 亚洲精品电影网站| 国产精品—色呦呦| 国产98在线|日韩| 亚洲婷婷在线| 亚洲av成人片无码| 亚洲国产aⅴ成人精品无吗| 亚洲美女福利视频| 欧美激情一区二区久久久| 日韩中文一区二区| 97超碰在线视| 成人免费视频一区| 日本免费一二三区| 日韩高清人体午夜| 老司机2019福利精品视频导航| 久久精品日韩精品| 老司机午夜精品视频在线观看| 醉酒壮男gay强迫野外xx| 日本乱码高清不卡字幕| av小片在线| 成人国内精品久久久久一区| 亚洲综合色站| 一本色道久久hezyo无码| 婷婷开心久久网| 欧美日韩伦理片| 国产精品亚洲自拍| 91成人精品| 精品伦一区二区三区| 午夜激情一区二区三区| 青青操在线视频| 国产精品视频网址| 一区二区免费不卡在线| www.男人天堂| 色婷婷精品久久二区二区蜜臂av | 亚洲AV无码乱码国产精品牛牛| 欧美激情精品久久久久久蜜臀| 久久aimee| 亚洲男人天堂色| 亚洲人成网站精品片在线观看| 成人免费视频国产免费麻豆| 欧美中文字幕视频在线观看| 欧美亚洲激情| aaa黄色大片| 色哟哟精品一区| av在线免费观看网址| 国产在线资源一区| 麻豆国产欧美日韩综合精品二区| 日韩女优一区二区| 国产网站欧美日韩免费精品在线观看 | 成人羞羞网站| 久草视频福利在线| 精品视频一区 二区 三区| 色黄网站在线观看| 欧洲一区二区日韩在线视频观看免费 | 98精品国产高清在线xxxx天堂| 欧美理论视频| 中文字幕18页| 欧美色男人天堂| 不卡的av影片| 亚洲一区二区在线免费观看| 懂色av中文字幕一区二区三区| 亚洲av人无码激艳猛片服务器| 欧美激情乱人伦|