Skip to content
Rain Hu's Workspace
Go back

基於 Ollama 和 LangChain 的 Naive RAG 實作(搭配 streamlit UI)

Rain Hu

在此為確保程式碼的可執行性,使用了免費的模型,若要求性能,可以使用替代方案。

完整程式碼

Basic Moves

1. 載入文件

loader = WebBaseLoader(urls_list)
documents = loader.load()

2. 分割文件

pythonCopytext_splitter = CharacterTextSplitter.from_tiktoken_encoder(chunk_size=7500, chunk_overlap=100)
doc_splits = text_splitter.split_documents(documents)

3. 選擇 embedding 模型

pythonCopyembeddings = OllamaEmbeddings(model="mistral")

4. 創建向量資料庫

pythonCopyvector_store = Chroma.from_documents(
    documents = doc_splits,
    embedding = embeddings,
    collection_name = "rag-chroma",
)

5. 建立 Retriever Interface

retriever = vector_store.as_retriever()

6. 執行 RAG

rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

7. 查詢

return rag_chain.invoke(question)

Advanced Moves

加入 metadata 並進行篩選:

loader = WebBaseLoader(urls_list)
loader.requests_kwargs = {'verify':False}
docs = loader.load()
docs = [Document(page_content=doc.page_content, metadata={"source": doc.metadata['source']}) for doc in docs]

# 在檢索時使用 metadata 篩選
retriever = vector_store.as_retriever(search_kwargs={"filter": {"source": "特定URL"}})

加入 pre/post retrieval 處理:

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor

compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=retriever
)

加入 rerank 提升回答的加權:

from langchain.retrievers import EnsembleRetriever

bm25_retriever = BM25Retriever.from_documents(documents)
ensemble_retriever = EnsembleRetriever(
    retrievers=[retriever, bm25_retriever],
    weights=[0.5, 0.5]
)

改變 naive RAG 為 graph RAG:

from langchain.graphs import NetworkxEntityGraph
from langchain.indexes import GraphIndexCreator

graph_creator = GraphIndexCreator(
    graph_type=NetworkxEntityGraph,
    include_embeddings=True
)
graph = graph_creator.from_documents(documents)

# 使用 graph RAG
retrieved_nodes = graph.get_relevant_nodes(query)

Share this post on:

Previous
[IT] 拯救 react
Next
[Swift] UI Challenge