檢索增強生成(Retrieval-augmented Generation,RAG)實戰1-基於LlamaIndex構建第一個RAG應用
本文將介紹如何使用LlamaIndex構建一個非常簡單的RAG應用。透過該案例,可以初步瞭解LlamaIndex構建RAG應用的大體流程。
環境準備
安裝LlamaIndex
安裝LlamaIndex相關包:
pip install llama-index
pip install llama-index-embeddings-huggingface
pip install llama-index-llms-huggingface
llama-index是核心包;llama-index-embeddings-huggingface允許我們使用本地的embedding模型去完成文件的切分和編碼等操作;llama-index-llms-huggingface允許我們使用本地的大模型去開發RAG應用。
安裝完成後,檢查伺服器cuda版本是否與當前安裝的pytorch對應,如果不對應,需要將pytorch版本降低到≤伺服器cuda版本(詳細見搭建一個大模型API服務):
pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2
下載embedding模型權重
使用BAAI開源的中文bge模型作為embedding模型,使用以下命令將模型權重下載到伺服器:
git clone https://huggingface.co/BAAI/bge-base-zh-v1.5
下載大模型權重
使用阿里開源的通義千問大模型,使用以下命令將模型權重下載到伺服器:
git clone https://www.modelscope.cn/qwen/Qwen1.5-14B-Chat.git
構建第一個RAG應用-中醫臨床診療術語證候問答
文件準備
本應用使用的文件是由國家衛生健康委員和會國家中醫藥管理局釋出的中醫臨床診療術語 第2部分:證候。其部分內容展示如下:
3.5.5.5
溼濁蒙竅證 syndrome/pattern of dampness-turbidity clouding orifices
因溼濁壅盛,上蒙清竅所致。臨床以頭重悶脹,眩暈欲僕,噁心,嘔吐唾沫,胸悶,舌苔白厚或垢膩,脈濡緩或滑,可伴見腦鳴、耳脹,聽音不真,或眼球震顫,視物模糊,眼前有灰黃色暗影遮擋,或鼻塞、涕濁,不聞香臭等為特徵的證候。
3.5.5.6
溼濁上泛證 syndrome/pattern of dampness-turbidity flooding in the upper
溼濁蒙上,泌別失職證
溼濁蒙上證
因溼濁內蘊,邪犯清空,泌別失職所致。臨床以頭暈作脹,神志昏蒙、恍惚,噁心、嘔吐,面色晦滯,少尿或無尿,舌質淡,舌苔厚濁,脈沉緩,可伴見脘腹悶脹,不思飲食,皮膚乾燥、瘙癢等為特徵的證候。
3.5.5.7
溼濁衝心證 syndrome/pattern of dampness-turbidity attacking heart
因溼濁內蘊,壅阻心脈,上攻衝心,壅閉心神所致。臨床以胸膺憋悶,心悸、怔忡,或神志恍惚,甚則昏昧,言語時或錯亂,舌苔厚膩,脈弦或緩,可伴見心胸痺痛,面色晦滯,嘔吐、不食等為特徵的證候。
將中醫臨床診療術語證候.txt放入專案根目錄下的document資料夾中。
匯入所需的包
import logging
import sys
import torch
from llama_index.core import PromptTemplate, Settings, SimpleDirectoryReader, VectorStoreIndex, load_index_from_storage, \
StorageContext, QueryBundle
from llama_index.core.schema import MetadataMode
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.core.node_parser import SentenceSplitter
定義日誌配置
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
如果想看到更多的日誌輸出,將level的級別改為logging.DEBUG。
定義System Prompt
SYSTEM_PROMPT = """You are a helpful AI assistant."""
query_wrapper_prompt = PromptTemplate(
"[INST]<<SYS>>\n" + SYSTEM_PROMPT + "<</SYS>>\n\n{query_str}[/INST] "
)
使用llama-index-llms-huggingface構建本地大模型
llm = HuggingFaceLLM(
context_window=4096,
max_new_tokens=2048,
generate_kwargs={"temperature": 0.0, "do_sample": False},
query_wrapper_prompt=query_wrapper_prompt,
tokenizer_name='/yldm0226/models/Qwen1.5-14B-Chat',
model_name='/yldm0226/models/Qwen1.5-14B-Chat',
device_map="auto",
model_kwargs={"torch_dtype": torch.float16},
)
Settings.llm = llm
tokenizer_name和model_name後面的路徑為前面下載的大模型權重的儲存路徑。
使用llama-index-embeddings-huggingface構建本地embedding模型
Settings.embed_model = HuggingFaceEmbedding(
model_name="/yldm0226/RAG/BAAI/bge-base-zh-v1.5"
)
model_name是前面下載的embedding模型權重的儲存路徑。
讀取文件
documents = SimpleDirectoryReader("document").load_data()
對文件進行切分,將切分後的片段轉化為embedding向量,構建向量索引
index = VectorStoreIndex.from_documents(documents, transformations=[SentenceSplitter(chunk_size=256)])
chunk_size可以控制切分片段的大小。
構建查詢引擎
query_engine = index.as_query_engine(similarity_top_k=5)
similarity_top_k決定了我們將檢索出多少個片段用於RAG。
獲得答案
response = query_engine.query("不耐疲勞,口燥、咽乾可能是哪些證候?")
稍作等待後,得到以下輸出:
從中醫的角度來看,口燥、咽乾且不耐疲勞可能與以下幾個證候相關:
-
津液不足證 或 津虧證:由於津液生成不足或者體內燥熱導致津液耗損,表現為口眼喉鼻乾燥,大便乾結,小便少,舌質紅幹,脈細數。
-
津虧熱結證:津液虧乏加上熱邪內結,也可見口燥咽乾,可能伴有便秘。
-
津液虧耗證 或 液乾熱結證:津液虧損可能導致口乾、口渴,皮膚乾燥,甚至影響消化功能(如大便乾結)。
-
津液虧涸證:嚴重的津液虧損會出現口唇乾燥、鼻燥、皮膚乾癟等症狀。
-
燥幹清竅證:長期氣候乾燥或環境因素導致的津液耗損,表現為口鼻咽喉乾燥,眼睛乾澀。
-
津傷化燥證 或 津傷燥熱證:體內燥熱傷津,也會有口乾、舌燥、食多善飢、皮膚乾燥等表現。
綜合以上,這些證候都有可能涉及到口燥咽乾和不耐疲勞的症狀,但具體需要結合病史和全身症狀來確診。建議就診中醫師進行辨證論治。