RAG檢索增強生成——使用LlamaIndex框架

LlamaIndex 是一個RAG檢索增強生成框架犀勒, 提供了必要的抽象摔笤,可以更輕松地攝取、構(gòu)建和訪問私有或特定領(lǐng)域的數(shù)據(jù)低剔,以便將這些數(shù)據(jù)安全可靠地注入 LLM 中速梗,以實現(xiàn)更準確的文本生成肮塞。

引入新知識時,RAG效果比fine tune好姻锁,可控性更強枕赵。RAG將新知識注入預(yù)訓練的語言模型,通過簡化問題來減少幻覺位隶。

LlamaIndex的優(yōu)勢是自帶向量數(shù)據(jù)庫拷窜。另外兩個RAG框架是LangChain和GroundX。LangChain配合向量數(shù)據(jù)庫PineCone涧黄,所謂的LCPC篮昧。

魔搭社區(qū)提供了一個使用LlamaIndex做檢索增強的栗子,可以免費試用魔搭社區(qū)的免費GPU環(huán)境運行這個栗子笋妥。

Step1: 安裝依賴庫

!pip install llama-index llama-index-llms-huggingface ipywidgets
!pip install transformers -U
import logging
import sys

logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))


from IPython.display import Markdown, display
import torch
from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.core.prompts import PromptTemplate
from modelscope import snapshot_download
from llama_index.core.base.embeddings.base import BaseEmbedding, Embedding
from abc import ABC
from typing import Any, List, Optional, Dict, cast
from llama_index.core import (
    VectorStoreIndex,
    ServiceContext,
    set_global_service_context,
    SimpleDirectoryReader,
)

Step2: 加載大語言模型

#Model names 
qwen2_4B_CHAT = "qwen/Qwen1.5-4B-Chat"

selected_model = snapshot_download(qwen2_4B_CHAT)

SYSTEM_PROMPT = """You are a helpful AI assistant.
"""

query_wrapper_prompt = PromptTemplate(
    "[INST]<<SYS>>\n" + SYSTEM_PROMPT + "<</SYS>>\n\n{query_str}[/INST] "
)

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=selected_model,
    model_name=selected_model,
    device_map="auto",
    # change these settings below depending on your GPU
    model_kwargs={"torch_dtype": torch.float16},
)

Step3: 加載知識庫數(shù)據(jù)文檔懊昨,markdown格式

!mkdir -p 'data/xianjiaoda/'
!wget 'https://modelscope.oss-cn-beijing.aliyuncs.com/resource/rag/xianjiaoda.md' -O 'data/xianjiaoda/xianjiaoda.md'
documents = SimpleDirectoryReader("/mnt/workspace/data/xianjiaoda/").load_data()
documents

Step4: 使用 GTE 模型構(gòu)造 Embedding

embedding_model = "iic/nlp_gte_sentence-embedding_chinese-base"
class ModelScopeEmbeddings4LlamaIndex(BaseEmbedding, ABC):
    embed: Any = None
    model_id: str = "iic/nlp_gte_sentence-embedding_chinese-base"

    def __init__(
            self,
            model_id: str,
            **kwargs: Any,
    ) -> None:
        super().__init__(**kwargs)
        try:
            from modelscope.models import Model
            from modelscope.pipelines import pipeline
            from modelscope.utils.constant import Tasks
            # 使用modelscope的embedding模型(包含下載)
            self.embed = pipeline(Tasks.sentence_embedding, model=self.model_id)

        except ImportError as e:
            raise ValueError(
                "Could not import some python packages." "Please install it with `pip install modelscope`."
            ) from e

    def _get_query_embedding(self, query: str) -> List[float]:
        text = query.replace("\n", " ")
        inputs = {"source_sentence": [text]}
        return self.embed(input=inputs)['text_embedding'][0].tolist()

    def _get_text_embedding(self, text: str) -> List[float]:
        text = text.replace("\n", " ")
        inputs = {"source_sentence": [text]}
        return self.embed(input=inputs)['text_embedding'][0].tolist()

    def _get_text_embeddings(self, texts: List[str]) -> List[List[float]]:
        texts = list(map(lambda x: x.replace("\n", " "), texts))
        inputs = {"source_sentence": texts}
        return self.embed(input=inputs)['text_embedding'].tolist()

    async def _aget_query_embedding(self, query: str) -> List[float]:
        return self._get_query_embedding(query)

Step5: 建立檢索使用的LlamaIndex向量庫索引,需要設(shè)置embeddings和llm

embeddings = ModelScopeEmbeddings4LlamaIndex(model_id=embedding_model)
service_context = ServiceContext.from_defaults(embed_model=embeddings, llm=llm)
set_global_service_context(service_context)

index = VectorStoreIndex.from_documents(documents)

Step6: 最后一步查詢和問答:基于本地知識庫春宣!

query_engine = index.as_query_engine()
response = query_engine.query("西安交大是由哪幾個學校合并的?")
print(response)

參考文檔

魔搭社區(qū)樣例

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酵颁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子月帝,更是在濱河造成了極大的恐慌躏惋,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚷辅,死亡現(xiàn)場離奇詭異簿姨,居然都是意外死亡,警方通過查閱死者的電腦和手機簸搞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門扁位,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攘乒,你說我怎么就攤上這事贤牛。” “怎么了则酝?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長闰集。 經(jīng)常有香客問我沽讹,道長,這世上最難降的妖魔是什么武鲁? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任爽雄,我火速辦了婚禮,結(jié)果婚禮上沐鼠,老公的妹妹穿的比我還像新娘挚瘟。我一直安慰自己叹谁,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布乘盖。 她就那樣靜靜地躺著焰檩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪订框。 梳的紋絲不亂的頭發(fā)上析苫,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音穿扳,去河邊找鬼衩侥。 笑死,一個胖子當著我的面吹牛矛物,可吹牛的內(nèi)容都是我干的茫死。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼履羞,長吁一口氣:“原來是場噩夢啊……” “哼璧榄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吧雹,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤骨杂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雄卷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搓蚪,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年丁鹉,在試婚紗的時候發(fā)現(xiàn)自己被綠了妒潭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡揣钦,死狀恐怖雳灾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冯凹,我是刑警寧澤谎亩,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站宇姚,受9級特大地震影響匈庭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜浑劳,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一阱持、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧魔熏,春花似錦衷咽、人聲如沸鸽扁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桶现。三九已至,卻和暖如春卖词,著一層夾襖步出監(jiān)牢的瞬間巩那,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工此蜈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留即横,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓裆赵,卻偏偏與公主長得像东囚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子战授,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容