File size: 4,215 Bytes
11cc0d3 569e03b 11cc0d3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
import streamlit as st
from fact_checker import FactChecker
from openai import OpenAI
import os
from dotenv import load_dotenv
import csv
from datetime import datetime
load_dotenv()
def store_feedback_csv(claim, result, feedback, csv_file="feedback_log.csv"):
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
row = [
now,
claim,
result.get("verdict", ""),
result.get("confidence", ""),
"|".join(result.get("evidence", [])),
result.get("reasoning", ""),
feedback
]
header = ["datetime", "claim", "verdict", "confidence", "evidence", "reasoning", "feedback"]
# Create file if it doesn't exist
if not os.path.exists(csv_file):
with open(csv_file, "w", newline='', encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(header)
# Append to existing file
with open(csv_file, "a", newline='', encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(row)
def initialize_services():
return FactChecker(
chroma_path="app/chroma_db",
collection_name="pib_titles",
groq_client=OpenAI(
api_key=os.getenv("GROQ_API_KEY"),
base_url="https://api.groq.com/openai/v1"
)
)
def main():
st.title("π Fact Checker")
checker = initialize_services()
# Initialize session state variables
if "feedback_submitted" not in st.session_state:
st.session_state.feedback_submitted = False
if "last_claim" not in st.session_state:
st.session_state.last_claim = ""
if "result" not in st.session_state:
st.session_state.result = None
claim = st.text_area("Enter a claim to verify:", height=150)
confidence_threshold = st.slider("Confidence Threshold", 0.0, 1.0, 0.5, 0.05)
if st.button("Verify Claim"):
if not claim.strip():
st.error("Please enter a claim to verify")
return
with st.spinner("Analyzing..."):
# Store result in session state
st.session_state.result = checker.verify_claim(claim, confidence_threshold)
st.session_state.last_claim = claim
st.session_state.feedback_submitted = False # Reset feedback state for new claim
# Display results from session state
if st.session_state.result:
result = st.session_state.result
if "error" in result:
st.error(f"Error: {result['error']}")
if "raw_response" in result:
with st.expander("Show raw LLM response"):
st.code(result["raw_response"])
else:
# Display verdict
verdict_color = {
"True": "green",
"False": "red",
"Unverifiable": "orange"
}.get(result["verdict"], "gray")
st.markdown(f"**Verdict:** :{verdict_color}[{result['verdict']}]")
# Display confidence score
st.metric("Confidence Score", f"{result.get('confidence', 0):.2f}")
# Display evidence
with st.expander("View Supporting Evidence"):
for idx, evidence in enumerate(result.get("evidence", []), 1):
st.markdown(f"{idx}. {evidence}")
# Display reasoning
st.markdown("**Analysis:**")
st.write(result.get("reasoning", "No reasoning provided"))
# Feedback system
feedback_key = f"feedback_radio_{st.session_state.last_claim}"
if not st.session_state.feedback_submitted:
feedback = st.radio(
"Was this analysis helpful?",
["", "π Yes", "π No"],
horizontal=True,
key=feedback_key
)
if feedback:
store_feedback_csv(st.session_state.last_claim, result, feedback)
st.session_state.feedback_submitted = True
st.rerun() # Use st.rerun() instead of experimental_rerun()
else:
st.success("Thank you for your feedback! Your input helps improve the system.")
if __name__ == "__main__":
main()
|