iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0

今天我們終於要來做 RAG 了。我們很快就會看到其實在客服性質裡的場景,RAG 的效果會比 Fine Tune 好上很多。

我們接著來寫程式吧!

  1. 導入必要的套件
from langchain_community.vectorstores import Qdrant
from qdrant_client import QdrantClient
from qdrant_client.http import models
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
from azure_ml_embeddings import AzureMLEndpointEmbeddings
from langchain_community.llms.azureml_endpoint import (
    AzureMLOnlineEndpoint,
    CustomOpenAIContentFormatter,
)

這些套件要特別注意的是 AzureMLOnlineEndpointAzureMLEndpointEmbeddings 是我客製過,可以參考 Day 11 和 Day 23 的文章。

  1. 設定必要的 URL 和 key。這裡我們用Day08 部署的 Llama-3.1-8B-Instruct,而不是 Fine Tune 過後的。
cohere_embed_api_key = "xx"
cohere_embed_url = "https://Cohere-embed-v3-multilingual-yqv.westus3.models.ai.azure.com/embeddings"
qdrant_url = "https://xx.cloud.qdrant.io:6333"
qdrant_api_key = "xx"
llama_url = "https://Meta-Llama-3-1-8B-Instruct-dkdel.westus3.models.ai.azure.com/v1/chat/completions/"
llama_api_key = "xx"

  1. 我們使用前面客製過的 AzureMLOnlineEndpoint 來配置 Azure ML LLM 端點。這個語言模型將用於 RAG 的 G 的部份。
llm = AzureMLOnlineEndpoint(
    endpoint_url=llama_url,
    endpoint_api_type='serverless',
    endpoint_api_key=llama_api_key,
    content_formatter=CustomOpenAIContentFormatter(),
    model_kwargs={"temperature": 0.8},
)
  1. 設置 embedding 模型。我們使用昨天客製過的 AzureMLEndpointEmbeddings,該模型將文本轉換為向量以進行相似度搜索。
embeddings_model = AzureMLEndpointEmbeddings(embed_url=cohere_embed_url, api_key=cohere_embed_api_key)
  1. 我們使用 ChatPromptTemplate 來定義 AI 的 Prompt:
prompt = ChatPromptTemplate.from_template("""你是電子元件公司的客服,請回答依照 context 裡的資訊來回答問題,超過範圍的請不要回答:
<context>
{context}
</context>
Question: {input}""")

  1. 設置 Qdrant client,注意我們昨天已經 embedding 過了,今天就不再重新 embedding。
client = QdrantClient(
    url=qdrant_url, 
    api_key=qdrant_api_key
)

collection_name = "ironman2024"
qdrant = Qdrant(client, collection_name, embeddings_model)
  1. 把 Qdrant 轉換成一個 retriever
retriever = qdrant.as_retriever()
  1. 用 LangChain 內建的 Chain 來完成 RAG 流程。
document_chain = create_stuff_documents_chain(llm, prompt)

retrieval_chain = create_retrieval_chain(retriever, document_chain)

response = retrieval_chain.invoke({"input": "請問MicroBoard MB1000的資訊"})

print(response)
  1. 接著我們就會看到結果如下圖所示。

生成式 AI 時代下的 Azure Machine Learning 教學圖文

我們透過 RAG 的手法,不必再 Fine Tune 模型,而且可以精準地拿到我們所要的答案。

反觀在 Day 18 時,我們使用了 Fine Tune 後的模型,雖然有正確拿到 MB 1000 的資訊,但是卻產生了 MC 1000 和 PB 1000 不在我產品型錄裡的幻覺。

因此建議大家再回去看看 Day 13 談論 Fine Tune 的場景的文章,思考自己的應用是不是用 RAG 可以又快又便宜。


上一篇
Day23-把所有的產品資料用 LangChain 的規格儲存到 Qdrant
下一篇
Day25-談 Azure ML 的新 SDK
系列文
生成式 AI 時代下的 Azure Machine Learning30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言