Spaces:
Build error
Build error
import os | |
import requests | |
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings | |
from llama_index.llms.huggingface import HuggingFaceLLM | |
from llama_index.embeddings.huggingface import HuggingFaceEmbedding | |
from llama_index.core.tools import QueryEngineTool, ToolMetadata | |
from transformers import AutoTokenizer, AutoModelForCausalLM | |
from llama_index.llms.llama_cpp import LlamaCPP | |
import os | |
from huggingface_hub import login | |
# Get the Hugging Face API token from the environment | |
hf_token = os.getenv("HUGGINGFACEHUB_API_TOKEN") | |
# Log in to Hugging Face using the token | |
login(token=hf_token) | |
# ==== 1. Set up Hugging Face Embedding Model ==== | |
# Use HuggingFaceEmbedding from llama_index directly | |
Settings.embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L6-v2") | |
# ==== 2. Load Hugging Face LLM (Locally Installed or Remote Hosted) ==== | |
#llm = HuggingFaceLLM( | |
# model_name="unsloth/Mistral-Small-3.1-24B-Instruct-2503-GGUF", # You must have access! | |
# tokenizer_name="unsloth/Mistral-Small-3.1-24B-Instruct-2503-GGUF", | |
# context_window=2048, | |
# max_new_tokens=512, | |
# generate_kwargs={"temperature": 0.1}, | |
# tokenizer_kwargs={"padding_side": "left"}, | |
# device_map="auto" # Automatically assign model layers to available devices | |
# | |
#) | |
llm = LlamaCPP( | |
model_path="/path/to/your/model.gguf", | |
temperature=0.1, | |
max_new_tokens=512, | |
context_window=4096, | |
generate_kwargs={"stop": ["</s>"]}, | |
model_kwargs={"n_threads": 4}, # adjust for your CPU | |
) | |
Settings.llm = llm # Apply to global settings | |
# ==== 3. Validate & Download ArXiv PDFs (if needed) ==== | |
def download_pdf(arxiv_id, save_dir="kb"): | |
url = f"https://arxiv.org/pdf/{arxiv_id}.pdf" | |
response = requests.get(url) | |
if "application/pdf" in response.headers.get("Content-Type", ""): | |
os.makedirs(save_dir, exist_ok=True) | |
file_path = os.path.join(save_dir, f"{arxiv_id}.pdf") | |
with open(file_path, "wb") as f: | |
f.write(response.content) | |
print(f"✅ Downloaded {file_path}") | |
else: | |
print(f"❌ Failed to download PDF for {arxiv_id}: Not a valid PDF") | |
# Example: download_pdf("2312.03840") | |
# ==== 4. Load Knowledge Base ==== | |
documents = SimpleDirectoryReader("kb", required_exts=[".pdf"]).load_data() | |
index = VectorStoreIndex.from_documents(documents) | |
# ==== 5. Create Query Engine ==== | |
query_engine = index.as_query_engine() | |
# ==== 6. Wrap as a Tool ==== | |
rag_tool = QueryEngineTool( | |
query_engine=query_engine, | |
metadata=ToolMetadata(name="RAGSearch", description="Answers from a local HF-based RAG system.") | |
) | |
# ==== 7. Basic Agent ==== | |
class BasicAgent: | |
def __init__(self): | |
self.tool = rag_tool | |
def __call__(self, question: str) -> str: | |
print(f"🧠 RAG Agent received: {question}") | |
response = self.tool.query_engine.query(question) | |
return str(response) | |