1、技術選型
組件 | 推薦方案 | 說明 |
---|---|---|
文本嵌入模型 | sentence-transformers/all-MiniLM-L6-v2 | 輕量級且效果較好的開源模型 |
向量數據庫 | FAISS | 高效的本地向量檢索庫 |
大語言模型 | GPT-3.5/開源LLM(如ChatGLM3) | 根據資源選擇云端或本地模型 |
文檔處理框架 | LangChain | 簡化RAG流程開發 |
2、環境準備
# 安裝核心依賴
pip install langchain sentence-transformers faiss-cpu unstructured python-dotx
3、 RAG 核心流程
1、文檔準備
- 在docs/目錄存放知識文檔(支持.txt/.md/.pdf等格式)
- 示例文檔內容:
特斯拉2023年Q1交付量42.3萬輛,Q2交付46.6萬輛,Q3交付43.5萬輛,Q4交付48.45萬輛。
2、索引(Indexing)
將數據預處理并存儲為向量。
3、檢索生成(Retrieval & Generation):
根據查詢檢索相關上下文,生成回答。
4、 索引實現步驟
a. 加載文檔
-
使用
TextLoader
加載文本文件:from langchain_community.document_loaders import TextLoader loader = TextLoader("introduction.txt") docs = loader.load()
b. 拆分文本
-
使用
RecursiveCharacterTextSplitter
按塊拆分:from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) splits = text_splitter.split_documents(docs)
c. 向量化與存儲
-
初始化 Chroma 向量數據庫,使用 OpenAI Embedding:
from langchain_chroma import Chroma from langchain_openai import OpenAIEmbeddings vectorstore = Chroma( collection_name="ai_learning", embedding_function=OpenAIEmbeddings(), persist_directory="vectordb" ) vectorstore.add_documents(splits)
5、 檢索生成實現步驟
a. 構建 Retriever
-
從向量庫創建檢索器:
retriever = vectorstore.as_retriever(search_type="similarity")
b. 提示詞模板
-
定義系統提示詞,指導模型結合上下文生成答案:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder prompt = ChatPromptTemplate.from_messages([ ("system", """ You are an assistant for question-answering tasks. Use the retrieved context to answer. If unsure, say you don't know. Keep answers concise (≤3 sentences). Context: {context} """), MessagesPlaceholder(variable_name="history"), ("human", "{question}") ])
c. 組裝處理鏈
-
將檢索、上下文格式化、提示詞和大模型串聯:
from operator import itemgetter from langchain_core.runnables import RunnablePassthrough context = itemgetter("question") | retriever | format_docs first_step = RunnablePassthrough.assign(context=context) chain = first_step | prompt | trimmer | model # model為ChatOpenAI實例
6、 核心組件與概念
- DocumentLoader:加載文本、數據庫、網頁等數據源。
- TextSplitter:按語義或結構拆分文檔(如代碼、普通文本)。
- VectorStore:統一接口支持多種向量數據庫(Chroma、Pinecone等)。
- Retriever:抽象檢索邏輯,支持向量搜索、關鍵詞匹配等。
- 提示詞工程:通過模板控制生成邏輯,平衡上下文與簡潔性。
7、 關鍵代碼片段
-
格式化檢索結果:
def format_docs(docs): return "\n\n".join(doc.page_content for doc in docs)
-
動態歷史會話管理:
store = {} def get_session_history(session_id: str) -> BaseChatMessageHistory: if session_id not in store: store[session_id] = InMemoryChatMessageHistory() return store[session_id]
8、總結亮點
- 降本增效:Chroma 無需額外服務,本地持久化降低部署成本。
- 靈活擴展:通過替換
DocumentLoader
、VectorStore
適配不同數據源。 - 工業級實踐:結合 MMR 算法優化檢索多樣性,控制 Token 消耗。
- 實戰價值:可直接復用代碼構建知識庫問答、客服機器人等場景。