LinuxGPT / llm.py
jaynopponep's picture
adding non large files
fd5f784
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_community.vectorstores import FAISS
from langchain.chains import create_history_aware_retriever
from langchain.chains import create_retrieval_chain
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains import create_retrieval_chain
from dotenv import load_dotenv
import os
CHROMA_PATH = "chroma"
load_dotenv()
API_KEY = os.getenv("OPEN_AI_KEY")
def build_rag_chain(api_key):
embed = OpenAIEmbeddings(
api_key=api_key,
model="text-embedding-3-large"
)
db = Chroma(
collection_name="linux_funds",
embedding_function=embed,
persist_directory=CHROMA_PATH
)
retriever = db.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={"k": 4, "score_threshold": 0.3},
)
model = ChatOpenAI(api_key=api_key, model="gpt-4o")
# docs = retriever.invoke(test_query)
# print("\n--- RELEVANT DOCUMENTS ---")
# for i, doc in enumerate(docs, 1):
# print(f"Document {i}:\n{doc.page_content}\n")
# if doc.metadata:
# print(f"Source: {doc.metadata.get('source', 'Unknown')}\n")
context = (
"Given a chat history and the latest user question "
"which might reference context in the chat history, "
"formulate a standalone question which can be understood "
"without the chat history. Do NOT answer the question, just "
"reformulate it if needed and otherwise return it as is."
)
context_with_history = ChatPromptTemplate(
[
("system", context),
MessagesPlaceholder("chat_history"),
("human", "{input}"),
]
)
history_aware_retriever = create_history_aware_retriever(
model, retriever, context_with_history
)
main_query = (
"You are an assistant for question-answering tasks. Use"
"the following pieces of retrieved context to answer the "
"question. If you don't know the answer, just say "
"you don't know. Use 10 sentences maximum and keep the answer "
"concise. You will most likely have to write bash scripts, so make"
" this presentable on HuggingFace in markdown if needed."
"\n\n"
"{context}"
)
prompt = ChatPromptTemplate(
[
("system", main_query),
MessagesPlaceholder("chat_history"),
("human", "{input}"),
]
)
qna_chain = create_stuff_documents_chain(model, prompt)
rag_chain = create_retrieval_chain(history_aware_retriever, qna_chain)
return rag_chain
def chat():
print("Start asking about the Theory of Computation. Type 'exit' to end the conversation.")
chat_history = []
while True:
query = input("You: ")
if query.lower() == "exit":
break
rag_chain = build_rag_chain(API_KEY)
result = rag_chain.invoke({"input": query, "chat_history": chat_history})
print(f"AI: {result['answer']}")
chat_history.append(HumanMessage(content=query))
chat_history.append(SystemMessage(content=result["answer"]))
# ABOVE IS FOR LOCAL TESTING ONLY ^ ONLY KEEPING IT FOR FUTURE USE
# messages = [
# SystemMessage(content="You are a helpful assistant."),
# HumanMessage(content=query_input),
# ]
#
# result = model.invoke(messages)
#
# print("\n--- Generated Response ---")
# print("Result:")
# print(result)
# print("Content only:")
# print(result.content)
if __name__ == "__main__":
chat()