ollama -v
ollama version 0.6.5
ollama run mistral
langchain
: Framework xây dựng luồng xử lý cho LLMchromadb
: Cơ sở dữ liệu vector để lưu embeddings tài liệusentence-transformers
: Tạo embeddings chất lượng cao cho văn bảnlangchain-ollama
: Tích hợp Ollama với Langchainlangchain-community
sudo dnf install gcc-c++ python3-develpython3 -m venv venvsource venv/bin/activate
requirements.txt
với nội dung:langchainchromadbsentence-transformerslangchain-ollamalangchain-communitylangchain-huggingface
pip install -r requirements.txt
md
, asciidoc
, txt
từ thư mục.# utils/loaders.pyfrom langchain_community.document_loaders import DirectoryLoader, TextLoaderimport os
def load_sop_files(directory: str): allowed_exts = ('.md', '.asciidoc', '.txt') docs = [] for root, _, files in os.walk(directory): for file in files: if file.lower().endswith(allowed_exts): path = os.path.join(root, file) try: loader = TextLoader(path, encoding='utf-8') docs.extend(loader.load()) except Exception as e: print(f"❌ Error loading {path}: {e}") return docs
Mục đích: Lấy tất cả các tài liệu văn bản trong thư mục, chuyển thành dạng đối tượng Document
của langchain để xử lý tiếp.
RecursiveCharacterTextSplitter
để chia nhỏ tài liệu thành các đoạn nhỏ ~500 ký tự, chồng lấp 100 ký tự giúp giữ ngữ cảnh.from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)chunks = splitter.split_documents(docs)
from langchain_community.embeddings import HuggingFaceEmbeddingsfrom langchain_community.vectorstores import Chroma
embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")db = Chroma.from_documents(chunks, embeddings)
Việc tạo embeddings giả lập quá trình "hiểu" nội dung văn bản thành dạng số, là bước quan trọng để có thể tìm kiếm tương đồng nhanh chóng.
RetrievalQA
, tức mém mô hình có thể lấy dữ liệu từ bộ nhớ ngoài (docs) rồi mới trả lời.from langchain.chains import RetrievalQAfrom langchain_ollama import OllamaLLM
retriever = db.as_retriever()llm = OllamaLLM(model="mistral")qa = RetrievalQA.from_chain_type(llm=llm, retriever=retriever, return_source_documents=True)
print("🤖 SOP Assistant ready. Type your question below. Type 'exit' to quit.")while True: query = input("\n📝 You: ") if query.lower() in ("exit", "quit"): print("👋 Bye! Take care.") break result = qa.invoke({"query": query}) print("\n🤖 Assistant:\n", result["result"]) print("\n📎 Sources:") for doc in result["source_documents"]: print(f" - {doc.metadata.get('source')}")
Tệp tin | Công dụng |
---|---|
utils/loaders.py | Tải và chuyển đổi tài liệu văn bản thành Document |
main.py | Chạy toàn bộ quy trình, từ tải tài liệu, tạo embeddings đến xử lý truy vấn chatbot |