大型語言模型懂很多東西,但它們不會自動知道我們私有文件、公司文檔、筆記或最近寫的文章里有什么。這正是檢索增強生成(RAG)派上用場的時候。在這個項目里,我搭了一個小型的 RAG 應用,它能讀入文本文檔,把文檔拆成更小的段落,將這些段落轉化為一種叫“嵌入”的數值表示,然后存入 Pinecone。當用戶提問時,它會找到最相關的段落,把它們交給 AI 模型,讓模型給出一個“有根據”的答案——也就是基于檢索到的源材料來回答。
我用了 Python 來寫這個應用,用 LangChain 連接各個步驟,用 OpenAI 的嵌入模型把文字變成數字,用 Pinecone 存儲和搜索這些嵌入,還用 uv 管理整個 Python 項目和依賴。這篇文章我會解釋這個應用是怎么運作的,各個組件怎么配合,以及我在調試過程中學到了什么。
想象一下你在參加一場開卷考試。沒有書的時候,你只能憑記憶作答。你可能知道答案,但也可能忘掉點什么,或者給出錯誤的信息。有了開卷資格,你可以先讀題,翻到相關的那一頁,然后用那上面的內容來寫答案。RAG 應用的工作原理與此類似:語言模型就是答題的人,向量數據庫就像一本可以搜索的書。在回答之前,應用會找到最相關的信息交給模型,模型不需要記住整份文檔,它只收到那些可能包含答案的片段。
一個基本的 RAG 應用有兩個階段。第一階段是“攝取”,也就是把文檔準備好,讓它們以后能被搜索到。流程是:加載文檔,切成小塊,每塊轉成一個嵌入,然后把這些嵌入存進 Pinecone。這個過程通常在添加或更新文檔時運行。第二階段是“檢索與答案生成”,在用戶提問時觸發:先把問題轉成嵌入,到 Pinecone 里搜出相似的文檔塊,把這些塊放進提示詞里,最后讓語言模型作答。把這兩個階段分開,整個應用就更容易理解——攝取負責整理知識,檢索負責用上這些知識。
計算機不能像人那樣直接比較句子之間的意思。嵌入模型的作用就是把文字轉換成一串數字,也就是向量。比如“如何重置我的密碼”和“我忘了密碼該怎么辦”意思很接近,它們對應的向量在數值空間中也會挨得很近。這樣,通過比較向量,系統就能找到語義上相關的段落,哪怕用詞不完全一樣。
調試的時候我用上了 LangSmith,它能讓我看到每個步驟的輸入輸出,幫我定位問題。比如,有一次我發現檢索到的段落和問題根本不沾邊,通過追蹤才發現是文檔切分的粒度不對,導致關鍵信息被切散。改了切分策略之后,檢索質量明顯提升。RAG 確實能減少沒有根據的回答,但它并不能保證每一次回復都正確。模型仍然可能誤解上下文,或者把檢索到的信息拼湊得看似合理卻偏離事實。這就是這個應用留下的一個需要持續留意的地方。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.