Spaces:
Sleeping
Sleeping
from pymilvus import connections, Collection, utility | |
from sentence_transformers import SentenceTransformer | |
from langchain_openai import ChatOpenAI # Updated import | |
from langchain_core.prompts import ChatPromptTemplate | |
from langchain_core.output_parsers import StrOutputParser | |
from langchain_core.messages import HumanMessage, SystemMessage, AIMessage | |
import os | |
# Milvus connection details | |
MILVUS_HOST = 'localhost' | |
MILVUS_PORT = '19530' | |
COLLECTION_NAME = 'document_collection' | |
def load_api_key(): | |
"""Loads the API key from the .env file or the environment.""" | |
from dotenv import load_dotenv | |
load_dotenv() | |
return os.environ.get("OPENAI_API_KEY") | |
# Embedding model | |
model = SentenceTransformer('all-MiniLM-L6-v2') | |
def retrieve_relevant_documents(query, top_k=5): | |
""" | |
Retrieves the most relevant documents from Milvus based on the query. | |
""" | |
print(f"Connecting to Milvus at {MILVUS_HOST}:{MILVUS_PORT}...") | |
connections.connect(host=MILVUS_HOST, port=MILVUS_PORT) | |
if utility.has_collection(COLLECTION_NAME): | |
collection = Collection(COLLECTION_NAME) | |
collection.load() | |
query_vector = model.encode([query]).tolist() | |
print(f"Encoded Query Vector: {query_vector}") | |
search_params = { | |
"metric_type": "L2", | |
"params": {"nprobe": 16} | |
} | |
search_results = collection.search( | |
data=query_vector, | |
anns_field="content_vector", | |
param=search_params, | |
limit=top_k, | |
expr=None, | |
output_fields=["path"] | |
) | |
relevant_docs = [] | |
for hit in search_results[0]: | |
doc_path = hit.entity.get("path") | |
relevant_docs.append(doc_path) | |
print(f"Relevant Docs: {relevant_docs}") | |
connections.disconnect(alias='default') | |
else: | |
print(f"Collection {COLLECTION_NAME} does not exist.") | |
relevant_docs = [] | |
return relevant_docs | |
def generate_response_with_gpt(query, relevant_docs, system_prompt): | |
""" | |
Generates a response using OpenAI's GPT model, based on the query, relevant documents, and system prompt. | |
""" | |
api_key = load_api_key() | |
if not api_key: | |
raise ValueError("OpenAI API key not set. Please set it in the .env file or environment variables.") | |
print(f"Using OpenAI API Key: {api_key[:5]}...") # Partial key for debugging | |
chat = ChatOpenAI(temperature=0.7, openai_api_key=api_key, model_name="gpt-3.5-turbo") | |
messages = [SystemMessage(content=system_prompt)] | |
if relevant_docs: | |
doc_content = "" | |
for doc_path in relevant_docs: | |
if os.path.isfile(doc_path): | |
try: | |
with open(doc_path, "r", encoding="utf-8") as f: | |
doc_content += f.read() + "\n" | |
except Exception as e: | |
print(f"Error reading document {doc_path}: {e}") | |
if doc_content: | |
messages.append(HumanMessage(content=f"Relevant documents:\n{doc_content}")) | |
messages.append(HumanMessage(content=query)) | |
print(f"Messages sent to OpenAI API: {messages}") | |
try: | |
response = chat.invoke(messages) | |
print(f"OpenAI API Response: {response.content}") | |
print("Type OpenAI API Response",type(response.content)) | |
return response.content | |
except Exception as e: | |
print(f"Error during OpenAI API call: {e}") | |
return "Error generating response. Please try again later." | |
def query_project(query, system_prompt): | |
""" | |
Queries the project using a RAG approach with specified system prompt. | |
""" | |
relevant_docs = retrieve_relevant_documents(query) | |
print(" Starting the query:") | |
print(query) | |
response = generate_response_with_gpt(query, relevant_docs, system_prompt) | |
print(f"Query Response: {response}") | |
print("Type response",type(response)) | |
return response |