cv-chatbot / src /rag.py
hinogi's picture
Upload folder using huggingface_hub
a9d5b70 verified
Raw History Blame Contribute Delete
1.96 kB
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_chroma import Chroma
from anthropic.types import TextBlock
import anthropic
from dotenv import load_dotenv
import os
load_dotenv()
client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
SYSTEM_PROMPT = """
Du bist ein hilfreicher Assistent der Frggen
zu Stefan Schneider's Lebenslauf und beruflichem Profil und seiner Bewerbung beantwortet.
Antworte präzise und freundlich und professionell basierend auf dem bereitgestellten Kontext.
Wenn du etwas nicht weißt oder dir unsicher bist, sag es ehrlich.
Antworte auf Deutsch, wenn die Frage auf Deutsch gestellt wird.
Antworte auf Englisch, wenn die Frage auf Englisch gestellt wird.
"""
def load_vectorstore(persist_dir: str = "./chroma_db"):
embeddings = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-MiniLM-L6-v2"
)
return Chroma(persist_directory=persist_dir, embedding_function=embeddings)
def query(question: str, history: list, vectorstore) -> str:
documents = vectorstore.similarity_search(question, k=8)
context = "\n\n".join([document.page_content for document in documents])
messages = []
for message in history:
if isinstance(message, dict):
messages.append({"role": message["role"], "content": message["content"]})
else:
user, assistant = message
messages.append({"role": "user", "content": user})
messages.append({"role": "assistant", "content": assistant})
messages.append(
{"role": "user", "content": f"Kontext:\n{context}\n\nFrage: {question}"}
)
response = client.messages.create(
model="claude-haiku-4-5-20251001",
max_tokens=1000,
system=SYSTEM_PROMPT,
messages=messages,
)
for block in response.content:
if isinstance(block, TextBlock):
return block.text
return "Keine Antwort erhalten."