構建RAG應用-day02: prompt技巧總結 llamaIndex入門

passion2021發表於2024-04-21

常見 prompt 技巧

# 兩個原則
1.明確且具體的指令
    具體的指令不等於短指令,長指令往往能提供更高的清晰度
    1.使用分隔符劃分不同的文字內容
    2.請求模型輸出HTML或者JSON格式
    3.使用類似於異常捕獲的理念,教會模型處理文字中遇到的不同情況
    4.給模型提供少量示例,相當於讓模型模仿著示例來進行任務。

2.給模型時間去思考
    讓更多的計算資源分配到我們想讓模型做的事情上。
    1.對一個複雜任務,將其拆分為多個步驟,這一目的是給模型提供更高的清晰度。對於每個步驟還可以再次細化,直到模型給出理想的結果。
    2.不要讓模型短時間的去下一個結論,而是請求模型在提供最終答案之前進行一系列相關的推理,然後再給出結論。

# 幻覺
模型在訓練過程中接觸了大量的知識,它並沒有完全記住所見的資訊,因此它並不很清楚自己知識的邊界。這意味著它可能會嘗試回答有關晦澀主題的問題,並編造聽起來合理但實際上並不正確的答案。我們稱這些編造的想法為幻覺。
也就是說對於模型不清楚的知識,模型更傾向於一本正經的胡說八道。

# prompt技巧:
結構化輸入:角色 + 場景 + 思維鏈 + 回覆示例

# 少樣本提示
few-shot是普通的禁止指令的上位替代。與其告訴模型不能做什麼,不如提供示例,告訴模型怎麼做。如果一個例子的效果不好,可以嘗試用多個。

# 思維鏈:
相當於把問題的解法給llm
Let's think step by step.

# ReAct 
讓模型去推理,推理的過程中自己決定呼叫哪個工具。再把工具結果告訴模型,模型再次推理下一步。
可以透過某個引數,讓大模型輸出xx內容時,停下來。

# ReAct類比程式設計師的開發過程
需求 寫程式碼 執行程式碼看結果 改程式碼 執行程式碼看結果
think react think react 

llamaIndex

LlamaIndex 是一個框架,用於構建稱為 檢索增強生成 (RAG) 的系統。
構建RAG系統,需要先將文字轉化為向量表示,(這個過程被llamaIndex稱為索引),然後將使用者的問題(query)進行向量相似度計算(這個過程被llamaindex稱為查詢),匹配出和使用者問題最相關的資訊,最後傳入大模型,以提高llm的輸出效果。

入門示例 一篇文章的RAG

安裝: pip install llama-index

import openai
import logging
import sys
import os.path
from llama_index.core import (
    VectorStoreIndex,
    SimpleDirectoryReader,
    StorageContext,
    load_index_from_storage,
)

# https://github.com/chatanywhere/GPT_API_free
openai.base_url = 'https://api.chatanywhere.tech/v1'

# 使用日誌檢視內部詳細行為
logging.basicConfig(stream=sys.stdout, level=logging.INFO)  # INFO/DEBUG
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))

# 檢查是否已經存在儲存空間
PERSIST_DIR = "./storage"
if not os.path.exists(PERSIST_DIR):
    # 載入data目錄下的文章
    documents = SimpleDirectoryReader("data").load_data()
    # 進行embedding
    index = VectorStoreIndex.from_documents(documents)
    # 儲存起來以後使用
    index.storage_context.persist(persist_dir=PERSIST_DIR)
else:
    # 載入現有索引
    storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
    index = load_index_from_storage(storage_context)

# 初始化搜尋引擎
query_engine = index.as_query_engine()
# 搜尋 "作者的成長經歷是什麼?" 這裡向大模型提問了,顯然: 預設情況下,LlamaIndex 帶有一組經過實戰考驗的內建提示
response = query_engine.query("What did the author do growing up?")
# The author worked on writing short stories and programming, particularly on an IBM 1401 computer in 9th grade using an early version of Fortran. Later, with the availability of microcomputers, the author continued programming, eventually getting a TRS-80 computer and writing simple games and a word processor.
# 作者曾寫過短篇小說和程式設計,特別是在9年級的IBM 1401計算機上使用早期版本的Fortran。後來,隨著微型計算機的出現,作者繼續程式設計,最終得到了一臺TRS-80計算機,並編寫了簡單的遊戲和文書處理器。
print(response)

大概有如下步驟:讀取檔案 - 分塊 - 將文字向量化 - 匹配與問題最相關的文字 - 帶著這些文字和gpt聊天

image-20240420234537636

檢視儲存的內容:

image-20240420235404270

相關文章