LangChain 構建向量數據庫和檢索器實戰
隨著大語言模型(LLM)在各類 AI 應用中不斷普及,RAG(Retrieval-Augmented Generation,檢索增強生成)逐漸成為提升回答準確率與上下文關聯性的重要技術路徑。
一、什么是向量數據庫?
在自然語言處理中,文本、圖片、音頻等非結構化數據需要轉化為模型可理解的形式才能參與運算。向量化(Embedding)是把原始數據轉化為定長高維向量的過程,用于計算相似度。比如,“貓” 和 “寵物” 的向量距離很近,而與 “飛機” 的距離較遠。
向量數據庫就是用于存儲這類高維向量,并支持基于相似度的快速檢索。常見的向量庫包括:
- FAISS(Facebook 開源)
- Milvus(Zilliz 開源)
- Weaviate(支持 GraphQL)
- Chroma(輕量級本地數據庫)
LangChain 默認支持這些庫的適配封裝,其中 Chroma 是最適合快速上手與本地調試的。
二、LangChain 是什么?
LangChain 是一個用來構建基于語言模型應用的 Python 框架,它提供了統一接口、模塊封裝、鏈式組合能力,方便開發者快速構建 LLM+Embedding+Retrieval 的復雜工作流。
LangChain 的重要模塊包括:
- LLM:大語言模型接口(如 OpenAI、ChatGLM、Tongyi)
- Embeddings:文本向量化模型
- VectorStore:向量數據庫封裝(Chroma、FAISS 等)
- Retriever:檢索器組件
- Chains:鏈式調用(支持流水線組合)
三、構建一個簡單的向量檢索系統
1. 環境準備
pip install langchain langchain-community chromadb
確保你還安裝了對應的 Embedding 模型(如通義 DashScope)和 LLM(如 Tongyi、OpenAI)。
本文使用的是阿里的通義千問模型
2. 加載依賴
import os
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_community.llms import Tongyi
from langchain_community.vectorstores import Chroma
from langchain_core.documents import Document
3. 初始化模型和數據
# 設置 API Key
os.environ["DASHSCOPE_API_KEY"] = "your-api-key"# 初始化 LLM 和 Embedding
llm = Tongyi()
embedding = DashScopeEmbeddings(model="text-embedding-v1")# 構造原始文檔
documents = [Document(page_content="貓是非常獨立的動物。", metadata={"source": "動物百科"}),Document(page_content="狗是忠誠的伙伴,經常陪伴人類。", metadata={"source": "動物百科"})
]
4. 構建向量數據庫
vector_store = Chroma.from_documents(documents, embedding=embedding)
這一步會自動把文本轉換成向量,并存入內存中的 Chroma 數據庫。
5. 相似度檢索
result = vector_store.similarity_search_with_score("寵物", k=1)for doc, score in result:print(f"內容:{doc.page_content},相似度得分:{score}")
輸出:
6. 封裝為 Retriever(檢索器)組件
from langchain_core.runnables import RunnableLambdaretriever = RunnableLambda(vector_store.similarity_search_with_score).bind(k=1)# 批量查詢
print(retriever.batch(["貓", "忠誠的動物"]))
四、與 RAG 構建結合
當你有了檢索器,就可以把它和 LLM 結合成 RetrievalQA 或 ConversationalRetrievalChain:
from langchain.chains import RetrievalQAqa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=vector_store.as_retriever())
response = qa_chain.invoke("貓有哪些特點?")
print(response)
這段代碼背后自動做了:
- 語義檢索最相關文檔
- 把文檔與問題一起發給 LLM
- 生成最終回答
五、持久化與加載
1. 向量庫保存
vector_store = Chroma.from_documents(documents, embedding=embedding, persist_directory="./chroma_db")
vector_store.persist()
2. 向量庫讀取
vector_store = Chroma(persist_directory="./chroma_db", embedding_function=embedding)
六、非文本數據的處理
如果你需要處理圖像、音頻、視頻等非文本數據,常見做法包括:
- 圖像 → OCR提取文字 或 圖像caption生成
- 音頻 → ASR語音識別成文本
- 視頻 → 拆幀+圖像識別 + 語音轉寫
一旦你將這些內容提取為結構化文本或描述,就可以用上述向量化 → 存儲 → 檢索 → 生成 的流程處理。
七、結語
LangChain + 向量數據庫是一種非常高效的知識管理與智能問答解決方案。通過向量化原始信息、構建數據庫、結合大模型檢索與生成能力,可以快速實現如“智能客服”、“文檔問答”、“知識庫”等實戰項目。