2025-02-11 23:43:42 +05:30
|
|
|
# pip install -q -U google-genai to use gemini as a client
|
|
|
|
|
|
|
|
import os
|
|
|
|
import numpy as np
|
|
|
|
from google import genai
|
|
|
|
from google.genai import types
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
from lightrag.utils import EmbeddingFunc
|
|
|
|
from lightrag import LightRAG, QueryParam
|
|
|
|
from sentence_transformers import SentenceTransformer
|
2025-03-03 18:33:42 +08:00
|
|
|
from lightrag.kg.shared_storage import initialize_pipeline_status
|
|
|
|
|
|
|
|
import asyncio
|
|
|
|
import nest_asyncio
|
2025-03-03 18:40:03 +08:00
|
|
|
|
2025-03-03 18:33:42 +08:00
|
|
|
# Apply nest_asyncio to solve event loop issues
|
|
|
|
nest_asyncio.apply()
|
2025-02-11 23:43:42 +05:30
|
|
|
|
|
|
|
load_dotenv()
|
|
|
|
gemini_api_key = os.getenv("GEMINI_API_KEY")
|
|
|
|
|
|
|
|
WORKING_DIR = "./dickens"
|
|
|
|
|
|
|
|
if os.path.exists(WORKING_DIR):
|
|
|
|
import shutil
|
|
|
|
|
|
|
|
shutil.rmtree(WORKING_DIR)
|
|
|
|
|
|
|
|
os.mkdir(WORKING_DIR)
|
|
|
|
|
|
|
|
|
|
|
|
async def llm_model_func(
|
|
|
|
prompt, system_prompt=None, history_messages=[], keyword_extraction=False, **kwargs
|
|
|
|
) -> str:
|
|
|
|
# 1. Initialize the GenAI Client with your Gemini API Key
|
|
|
|
client = genai.Client(api_key=gemini_api_key)
|
|
|
|
|
|
|
|
# 2. Combine prompts: system prompt, history, and user prompt
|
|
|
|
if history_messages is None:
|
|
|
|
history_messages = []
|
|
|
|
|
|
|
|
combined_prompt = ""
|
|
|
|
if system_prompt:
|
|
|
|
combined_prompt += f"{system_prompt}\n"
|
|
|
|
|
|
|
|
for msg in history_messages:
|
|
|
|
# Each msg is expected to be a dict: {"role": "...", "content": "..."}
|
|
|
|
combined_prompt += f"{msg['role']}: {msg['content']}\n"
|
|
|
|
|
|
|
|
# Finally, add the new user prompt
|
|
|
|
combined_prompt += f"user: {prompt}"
|
|
|
|
|
|
|
|
# 3. Call the Gemini model
|
|
|
|
response = client.models.generate_content(
|
|
|
|
model="gemini-1.5-flash",
|
|
|
|
contents=[combined_prompt],
|
2025-02-11 23:49:56 +05:30
|
|
|
config=types.GenerateContentConfig(max_output_tokens=500, temperature=0.1),
|
2025-02-11 23:43:42 +05:30
|
|
|
)
|
|
|
|
|
|
|
|
# 4. Return the response text
|
|
|
|
return response.text
|
|
|
|
|
2025-02-11 23:49:56 +05:30
|
|
|
|
2025-02-11 23:43:42 +05:30
|
|
|
async def embedding_func(texts: list[str]) -> np.ndarray:
|
2025-02-11 23:49:56 +05:30
|
|
|
model = SentenceTransformer("all-MiniLM-L6-v2")
|
2025-02-11 23:43:42 +05:30
|
|
|
embeddings = model.encode(texts, convert_to_numpy=True)
|
|
|
|
return embeddings
|
|
|
|
|
2025-02-11 23:49:56 +05:30
|
|
|
|
2025-03-03 18:33:42 +08:00
|
|
|
async def initialize_rag():
|
|
|
|
rag = LightRAG(
|
|
|
|
working_dir=WORKING_DIR,
|
|
|
|
llm_model_func=llm_model_func,
|
|
|
|
embedding_func=EmbeddingFunc(
|
|
|
|
embedding_dim=384,
|
|
|
|
max_token_size=8192,
|
|
|
|
func=embedding_func,
|
|
|
|
),
|
|
|
|
)
|
|
|
|
|
|
|
|
await rag.initialize_storages()
|
|
|
|
await initialize_pipeline_status()
|
2025-03-03 18:40:03 +08:00
|
|
|
|
2025-03-03 18:33:42 +08:00
|
|
|
return rag
|
2025-02-11 23:43:42 +05:30
|
|
|
|
2025-03-03 18:40:03 +08:00
|
|
|
|
2025-03-03 18:33:42 +08:00
|
|
|
def main():
|
|
|
|
# Initialize RAG instance
|
|
|
|
rag = asyncio.run(initialize_rag())
|
|
|
|
file_path = "story.txt"
|
|
|
|
with open(file_path, "r") as file:
|
|
|
|
text = file.read()
|
2025-02-11 23:43:42 +05:30
|
|
|
|
2025-03-03 18:33:42 +08:00
|
|
|
rag.insert(text)
|
|
|
|
|
|
|
|
response = rag.query(
|
|
|
|
query="What is the main theme of the story?",
|
|
|
|
param=QueryParam(mode="hybrid", top_k=5, response_type="single line"),
|
|
|
|
)
|
2025-02-11 23:43:42 +05:30
|
|
|
|
2025-03-03 18:33:42 +08:00
|
|
|
print(response)
|
2025-02-11 23:43:42 +05:30
|
|
|
|
2025-03-03 18:40:03 +08:00
|
|
|
|
2025-03-03 18:33:42 +08:00
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|