LLM + 最新RAG技術 | 快速建置本地知識庫查詢應用 | 解決生成式AI常見的幻覺問題

Поділитися
Вставка
  • Опубліковано 24 кві 2024
  • 大家好,今天我們將會一起學習如何快速建置一個本地知識庫查詢應用,
    這將使用最新的語言模型技術Llama3和檢索增強生成RAG(Retrieval-Augmented Generation)技術。
    希望透過今天的課程,大家可以學習這些最新的技術,帶回到你的工作職場
    進一步的思考,結合單位內的應用場景,然後進行實作落地。
    同時也替你帶來更大的價值,讓你成為組織內創新開發的領頭羊。
    龍龍 希望讓大家能夠應用新技術,提升競爭力,一起成長、共好~~
    如果你還沒有建置一些環境,建議可以先看這個LLM的首部份
    會帶你安裝ollama,這是可以很快建置相關服務的好平台
    • 連我阿嬤都會 Python + 本地端LLM...
    ***課程清單(快速跳轉)***
    01:03 - Demo原生LLM與結合RAG的使用者體驗
    05:13 - RAG是什麼?
    10:02 - 解決方案架構
    10:50 - 安裝套件
    11:30 - 實操演示
    🔹 小額贊助 龍龍AI與程式實戰
    -------------------------------------------------
    🎉方式一:加入頻道會員 (加入後可觀看會員專區的影片喔) / @changlunglung
    🎉方式二:在 UA-cam 影片右下角點擊「超級感謝」按鈕
    🎉方式三(請 龍龍 喝咖啡):buymeacoffee.com/changlunglung
    -------------------------------------------------
    強力推薦,讓你提升職場競爭力課程,由龍龍與巨匠電腦合作:
    零基礎也能搞定:快速學習打造自己的企業級語音轉文字服務!(手刀下單)
    www.worker360.com.tw/video/Di...
    ChatGPT全方位職場情境應用:強化提詞效率(手刀下單)
    www.worker360.com.tw/video/Di...
    =================================
    🔹與本主題或LLM相關的精選教程
    =================================
    • 實操乾貨 Chat With 不同類型檔案 ...
    • 擁有AI的Reader API 再結合 LL...
    • 創建本地PDF Chatbot with L...
    • 免費線上快速完成第一個客製化LLM模型 | ...
    • 連我阿嬤都會 Python + 本地端LLM...
    • 震撼登場!本地LLM服務全新進化,會說話的A...
    • 2024最新!本地LLM服務驚人進化:連阿嬤...
    • 輕鬆立即搭建本地端Llama3模型 - 使用...
    • 最新OpenAI語音轉文字技術:Whispe...
    • 3分鐘免費完成AI文字轉語音!#文字轉語音 #ai
    🔹 練習用知識QA檔案下載
    docs.google.com/spreadsheets/...
    🔹 使用到的指令
    安裝嵌入模型:ollama pull mxbai-embed-large
    安裝聯發科LLM模型:ollama run ycchen/breeze-7b-instruct-v1_0
    安裝chromadb(向量庫):pip install chromadb
    🔹 程式碼Code
    import streamlit as st # 導入Streamlit庫,用於建立網頁應用
    import ollama # 導入ollama庫,用於自然語言處理
    import chromadb # 導入chromadb庫,用於數據存儲和查詢
    import pandas as pd # 導入pandas庫,用於數據分析和處理
    定義一個初始化函數,用於設置Streamlit的會話狀態
    def initialize():
    檢查'session_state'(會話狀態)中是否已有'already_executed'這個變量
    這個變量用來檢查是否已經進行過一次資料庫初始化操作
    if "already_executed" not in st.session_state:
    st.session_state.already_executed = False # 若不存在,則設置為False
    如果'already_executed'為False,表示還未初始化過資料庫
    if not st.session_state.already_executed:
    setup_database() # 呼叫setup_database函數來進行資料庫的設置和數據加載
    定義設置資料庫的函數
    def setup_database():
    client = chromadb.Client() # 創建一個chromadb的客戶端,用於與資料庫交互
    file_path = 'QA50.xlsx' # 指定Excel文件的路徑和名稱
    documents = pd.read_excel(file_path, header=None) # 使用pandas讀取Excel文件
    使用chromadb客戶端創建或獲取名為'demodocs'的集合
    collection = client.get_or_create_collection(name="demodocs")
    遍歷從Excel文件中讀取的數據,每一行代表一條記錄
    for index, content in documents.iterrows():
    response = ollama.embeddings(model="mxbai-embed-large", prompt=content[0]) # 通過ollama生成該行文本的嵌入向量
    collection.add(ids=[str(index)], embeddings=[response["embedding"]], documents=[content[0]]) # 將文本和其嵌入向量添加到集合中
    st.session_state.already_executed = True # 設置'already_executed'為True,表示已完成初始化
    st.session_state.collection = collection # 將集合保存在會話狀態中,供後續使用
    定義創建新chromadb客戶端的函數,每次需要時創建新的連接
    def create_chromadb_client():
    return chromadb.Client() # 返回一個新的chromadb客戶端實例
    主函數,負責構建UI和處理用戶事件
    def main():
    initialize() # 呼叫初始化函數
    st.title("我的第一個LLM+RAG本地知識問答") # 在網頁應用中設置標題
    user_input = st.text_area("您想問什麼?", "") # 創建一個文本區域供用戶輸入問題
    如果用戶點擊"送出"按鈕
    if st.button("送出"):
    if user_input:
    handle_user_input(user_input, st.session_state.collection) # 處理用戶輸入,進行查詢和回答
    else:
    st.warning("請輸入問題!") # 如果用戶沒有輸入,顯示警告消息
    定義處理用戶輸入的函數
    def handle_user_input(user_input, collection):
    response = ollama.embeddings(prompt=user_input, model="mxbai-embed-large") # 生成用戶輸入的嵌入向量
    results = collection.query(query_embeddings=[response["embedding"]], n_results=3) # 在集合中查詢最相關的三個文檔
    data = results['documents'][0] # 獲取最相關的文檔
    output = ollama.generate(
    model="ycchen/breeze-7b-instruct-v1_0",
    prompt=f"Using this data: {data}. Respond to this prompt and use chinese: {user_input}" # 生成回應
    )
    st.text("回答:") # 顯示"回答:"
    st.write(output['response']) # 將生成的回應顯示在網頁上
    if _name_ == "__main__":
    main() # 如果直接執行此文件,則執行main函數
    ==================
    #OllamaEmbedding #Local #Nomic #OllamaEmbeddings #OllamaNomic #OllamaNomicEmbedding #NomicEmbedding #NomicEmbeddings #NomicOllama #EmbeddingOllama #Embed #Embedding #LocalRAG #OllamaLocalRAG
    #ollama #runollamalocally #howtoinstallollama #ollamaonmacos #installingollama #localllm #mistral7b #installllmlocally #opensource #llms #opensourceLLM #custommodel #localagents #opensourceAI #llmlocal #localAI #llmslocally #opensource #Olama #Mistral #OllamaMistral #Chroma #ChromaDB #LangChain

КОМЕНТАРІ • 39

  • @marklinreading
    @marklinreading Місяць тому +1

    很棒的影片,感谢,关注了~

  • @xueyuandu
    @xueyuandu Місяць тому

    大佬!我看您微调数据和本地知识库的数据都一样。我在什么情况下微调,什么情况下导入本地知识库就可以了呀?

  • @tonyliu5659
    @tonyliu5659 7 днів тому

    感谢您的分享,我有一个问题,您对于大的文档处理时,会有什么好的建议来避免其因为chunk问题而导致的问题吗?或者说我们如何更好的绕过这个难题

  • @caihengsheng
    @caihengsheng 2 місяці тому +1

    非常好!很有用。請問安裝chromadb via pip 未成功,如何解決?是否是環境設定問題?或需要在 conda 上安裝?

    • @changlunglung
      @changlunglung  2 місяці тому

      有什麼錯誤訊息嗎?
      你可以在conda的command命令列(記得用管理者權),pip安裝。
      而不是在一般的cmd的command裝,試試。

    • @caihengsheng
      @caihengsheng 2 місяці тому

      @changlunglung 錯誤訊息 : Downloading rsa-4.9-py3-none-any.whl (34 kB)
      Using cached setuptools-69.5.1-py3-none-any.whl (894 kB)
      Downloading pyasn1-0.6.0-py2.py3-none-any.whl (85 kB)
      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.3/85.3 kB 600.6 kB/s eta 0:00:00
      Building wheels for collected packages: chroma-hnswlib
      Building wheel for chroma-hnswlib (pyproject.toml) ... canceled
      ERROR: Operation cancelled by user 但我并没作anything?

    • @caihengsheng
      @caihengsheng 2 місяці тому

      @@changlunglung 錯誤訊息:Using cached humanfriendly-10.0-py2.py3-none-any.whl (86 kB)
      Downloading pyasn1_modules-0.4.0-py3-none-any.whl (181 kB)
      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 181.2/181.2 kB 1.6 MB/s eta 0:00:00
      Downloading rsa-4.9-py3-none-any.whl (34 kB)
      Using cached setuptools-69.5.1-py3-none-any.whl (894 kB)
      Downloading pyasn1-0.6.0-py2.py3-none-any.whl (85 kB)
      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.3/85.3 kB 600.6 kB/s eta 0:00:00
      Building wheels for collected packages: chroma-hnswlib
      Building wheel for chroma-hnswlib (pyproject.toml) ... canceled
      ERROR: Operation cancelled by user

    • @changlunglung
      @changlunglung  2 місяці тому

      哇哇,這個我也沒遇過,是否重開機後再試試。

  • @WuMichael-zi4hk
    @WuMichael-zi4hk 2 місяці тому +2

    st.session_state has no attribute "already_executed"Did you forget to initialize it? How to fix it?

    • @changlunglung
      @changlunglung  2 місяці тому +1

      變數的定義在這裡有了,先判斷是否有在st.session_state有定義,沒有就新增already_executed並給初始值False
      我想會不會是streamlit的版本關係
       if "already_executed" not in st.session_state:
      st.session_state.already_executed = False # 若不存在,則設置為False
      # 定義一個初始化函數,用於設置Streamlit的會話狀態
      def initialize():
      # 檢查'session_state'(會話狀態)中是否已有'already_executed'這個變量
      # 這個變量用來檢查是否已經進行過一次資料庫初始化操作
      if "already_executed" not in st.session_state:
      st.session_state.already_executed = False # 若不存在,則設置為False
      # 如果'already_executed'為False,表示還未初始化過資料庫
      if not st.session_state.already_executed:
      setup_database() # 呼叫setup_database函數來進行資料庫的設置和數據加載

  • @zmeta8
    @zmeta8 2 місяці тому +1

    有没有方法可以让chromadb同时支援bm25 rank

    • @wei-shunbao9490
      @wei-shunbao9490 2 місяці тому +1

      可以考虑用elasticsearch,embedding和bm25都支持

  • @clusslin
    @clusslin 11 днів тому +1

    請教一下龍龍
    我想在windows 本地微調模型llama3-8B,不想在colab上面運行
    因為我的資料比較隱私,想請教一下
    運行unsloth的code我總會遇到RuntimeError: Failed to find C compiler. Please specify via CC environment variable.
    感覺我就只差這一步了,安裝了vc也無法解決這個問題,請問有什麼好方法嗎

    • @changlunglung
      @changlunglung  11 днів тому +1

      我自已本地環境的關係,我之前也想在window上搞,環境上也遇到些問題,還沒解掉。
      又加上公務上的事,就也先放在那邊。
      後面我有成功,我會在拍支影片分享。

  • @user-vl9in9oj5e
    @user-vl9in9oj5e 12 днів тому

    出現了ResponseError: invalid character 'N' looking for beginning of value
    請問該怎麼辦QQ

  • @BloodShadowTW
    @BloodShadowTW Місяць тому +1

    能給完整程式碼?Streamlit建起來需要設定嗎?目前其他人都連不進來,想請問問題出在哪?多個pdf 也可以像excel這樣載入嗎?再麻煩您幫忙解答,感謝您

    • @changlunglung
      @changlunglung  Місяць тому

      影片說明最下方的,已經是完整的程式碼了喔。
      streamlit執行後,應該別人用ip,或者電腦名稱就可以了。
      如果你是家裡面的話,可能都還是內網,而不是連到外網的ip位置。
      這個每個人環境不一樣,不太好給建議喔。

    • @BloodShadowTW
      @BloodShadowTW 29 днів тому

      @@changlunglung 請問一下喔,使用RAG 用7B Ilm 目的做公司QA系統,您覺得可行嗎?目前使用RAG來做QA回答有時都偏短,有啥可以優化的嗎?

  • @gloudsdu
    @gloudsdu 2 місяці тому +1

    这个RAG能大海捞针吗?漏东西、找错位置的RAG实在不敢用啊

    • @changlunglung
      @changlunglung  2 місяці тому +5

      謝謝您的回應,
      目前要找到百發百中的模型,應該是沒有,若怕找不到或者怕找到和語意不同的檢索,建議繼續觀望。
      畢竟RAG技術主要一部份是用來解決通用型生成式AI的幻覺,embedding技術是一直在推陳出新。
      總是有在提升,至於是否能落地,還是看每個場景或需求的人的定義。
      RAG裡面若要細部探討還有檢索的內容,資料的整理。
      知道RAG原理,所以有可能越多資料放在一個庫,就越有機會不易區分。
      也包括使用者如果下的詞,本來就語意不清,那就更找不到東西
      但程式也可以寫一些判斷,表示使用者可以在多給提示之類的。
      如果有實作,也代表更清楚目前技術的限制與能耐。
      也因為知道原理,所以山不轉路轉,是不是也可以討論,變通一下,
      例如把大知識庫拆成不同的小庫,用獨立庫的方式,優先解決特定知識查詢。
      如果內部討論沒辦法接受,那就真的只能繼續探索了。
      以上建議。

  • @cayoh
    @cayoh 2 місяці тому +1

    用的breeze哪裡有llama3?

    • @changlunglung
      @changlunglung  2 місяці тому

      抱歉更正,本影片重點是RAG,主題已修正,謝謝提醒。
      若需要使用llama3來做最後的整理內容,把llama3拉下來,程式碼中的模型換成llama3就行了。

  • @user-pj3wh3dp4e
    @user-pj3wh3dp4e 17 днів тому +1

    請問若要加temperature要加在程式哪裡?就是若在提供的資料找不到合適的,也不讓大語言模型胡扯。

    • @changlunglung
      @changlunglung  16 днів тому +1

      最快的方式是你有每一次送出時的prompt字串,都固定加額外的指令就行了。像下面的字串
      原來的prompt + 下面的
      "如果內容中沒有與提問相關的資料,就告訴使用者,資料找不到!!!"
      組成字串在送出去。

  • @claireyang497
    @claireyang497 День тому

    感謝分享,想請問生成的輸出出現亂碼?這個可以如何解決
    {
    "model":"ycchen/breeze-7b-instruct-v1_0"
    "created_at":"2024-06-25T06:50:36.324415Z"
    "response":"er▅in t ��������������������������������▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅er▅in t �▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅▅"
    "done":false
    }

    • @changlunglung
      @changlunglung  День тому

      得到的response是簡體字嗎?
      是否先提問用英文試試,是否會一樣!

    • @claireyang497
      @claireyang497 16 годин тому

      @@changlunglung 改用llama3 就正常了🙂

  • @xueyuandu
    @xueyuandu Місяць тому

    大佬!我看您微调数据和本地知识库的数据都一样。我在什么情况下微调,什么情况下导入本地知识库就可以了呀?

  • @xueyuandu
    @xueyuandu Місяць тому +1

    大佬!我看您微调数据和本地知识库的数据都一样。我在什么情况下微调,什么情况下导入本地知识库就可以了呀?

    • @changlunglung
      @changlunglung  Місяць тому +1

      基本上是因為教學方便,如果你的資源(算力)夠、可以花比較多的時間、加上你的資料(訓練集)能做的很好,當然微調是最好的。因為要微調建議還是至少要用8*7B的模型或者llama8b來試。
      再來如果是中文的,也許如大陸的千問來試試,微調後的模型也是要進行很多的測試,確保問與答都是符合的。
      是非常花時間,又要擔心幻覺,所以我才說,有很多時間,才去玩微調。
      如果資源不太夠,而且資料要求的精準度(幻覺要少),那RAG會是首要的選擇。
      也就是寧可從知識庫給東西,就算給錯,也不容許生成幻覺的場景,那就先用RAG來做。
      微調要花更多的時間,無論是訓練或者更多的是資料的前處理、資料集的準備。
      以上提供你參考,希望有回答到問題,謝謝。

    • @xueyuandu
      @xueyuandu Місяць тому

      明白了,非常专业!