MarktAnalyst / rag_agent.py
tet-ana's picture
Upload 3 files
bf5412e verified
from langchain_core.documents import Document
from langchain_core.messages import HumanMessage, AIMessage
from typing import Dict, List
from langchain_chroma import Chroma
from langchain_google_genai import GoogleGenerativeAIEmbeddings
import chromadb
import os
from langchain.tools import Tool
from langgraph.prebuilt import create_react_agent
from langchain.chat_models import init_chat_model
# 🤖 Web-Agent mit Gemini 2.0 Flash
gemini_model = init_chat_model("gemini-2.0-flash", model_provider="google_genai")
persistent_client = chromadb.PersistentClient(path="chroma/")
embeddings = GoogleGenerativeAIEmbeddings(model="models/text-embedding-004", google_api_key=os.getenv("GOOGLE_API_KEY"))
vector_store = Chroma(
client=persistent_client,
collection_name="big_tech_financial_reports",
embedding_function=embeddings,
)
# Функция: отвечает на финансовый запрос с цитированием источников
def answer_financial_query(query: str) -> str:
# Используем глобальные vector_store и llm
global vector_store, gemini_model
query_embedding = embeddings.embed_query(query)
retrieved_docs = vector_store.similarity_search_by_vector(query_embedding, k=5)
context = "\n\n".join([
f"[{doc.metadata['company']}, {doc.metadata['year']}, {doc.metadata['type']}, {doc.metadata['source']}]:\n{doc.page_content}"
for doc in retrieved_docs
])
prompt = f"""
You are a financial assistant. Based only on the following financial report excerpts, answer the user's query.
Use a clear and concise tone and cite the company, year, document type, and source for any fact.
User Query: {query}
Documents:
{context}
Answer:
"""
response = gemini_model([HumanMessage(content=prompt)])
return response.content
financial_rag_tool = Tool(
name="analyze_financial_report",
func=answer_financial_query,
description=(
"Beantworte Fragen zu Finanzberichten, Bilanzen, Quartalszahlen und Jahresabschlüssen "
"von Apple, Microsoft, Google, NVIDIA und Meta in den letzten fünf Jahren. "
"Die Antworten enthalten genaue Quellenangaben zum Bericht."
)
)
financial_rag_agent = create_react_agent(
model=gemini_model,
tools=[financial_rag_tool],
name="financial_rag_agent",
prompt=(
"Du bist ein spezialisierter Finanzassistent.\n"
"Du beantwortest ausschließlich Fragen zu den Finanzberichten von Apple, Microsoft, Google, NVIDIA und Meta.\n"
"Nutze ausschließlich das Tool 'analyze_financial_report', um Informationen aus diesen Quellen zu beziehen.\n"
"Gib stets eine präzise Antwort mit Angabe der Quelle (Unternehmen, Jahr, Berichtstyp, Dateiname)."
)
)