Status: True
Assertion
An octopus has blue blood.
Results
The subject being discussed (octopuses) belongs to the class Cephalopoda, which includes animals with copper-based hemocyanin. This is factually correct as octopuses are indeed a part of the Cephalopoda class and do have copper-based hemocyanin for oxygen transportation: The statement accurately reflects the classification of octopuses within the Cephalopoda class and their physiological trait, copper-based hemocyanin.
– True: Hemocyanin is an oxygen transport protein found in some mollusks and arthropods. This statement is true; hemocyanin serves as an oxygen carrier, akin to the role of hemoglobin in vertebrates but differs in composition (copper-based vs. iron-based): The statement correctly describes the function and composition differences between copper-based hemocyanin and iron-based hemoglobin.
– True: Octopuses are marine organisms living in various environments where their specific physiological adaptations enable them to survive efficiently, including the use of copper-based hemocyanin for oxygen
Assumptions
– The subject being discussed (octopuses) belongs to the class Cephalopoda, which includes animals with copper-based hemocyanin.
– Hemocyanin is an oxygen transport protein found in some mollusks and arthropods.
– Octopuses are marine organisms living in various environments where their specific physiological adaptations enable them to survive efficiently, including the use of copper-based hemocyanin for oxygen transportation.
– The statement contrasts octopuses’ copper-based hemocyanin with iron-based hemoglobin found in most vertebrates, emphasizing their physiological differences.
– There is a scientific consensus on the color of oxygenated hemocyanin and its function in oxygen transport within these species.
Fact Checker Output
<|assistant|> – True: The subject being discussed (octopuses) belongs to the class Cephalopoda, which includes animals with copper-based hemocyanin. This is factually correct as octopuses are indeed a part of the Cephalopoda class and do have copper-based hemocyanin for oxygen transportation.
– True: Hemocyanin is an oxygen transport protein found in some mollusks and arthropods. This statement is true; hemocyanin serves as an oxygen carrier, akin to the role of hemoglobin in vertebrates but differs in composition (copper-based vs. iron-based).
– True: Octopuses are marine organisms living in various environments where their specific physiological adaptations enable them to survive efficiently, including the use of copper-based hemocyanin for oxygen transportation. This is true as octopuses do inhabit diverse marine habitats and have copper-based hemocyanin which aids in oxygen transport.
– True: The statement contrasts octopuses’ copper-based hemocyanin with iron-based hemog
Model Used
microsoft/Phi-3-mini-4k-instruct-gguf
Script Name
fact_checker_mongodb.py
Script Code
import os
import sys
import requests
from langchain_openai.llms import OpenAI
from langchain.prompts import PromptTemplate
from dotenv import load_dotenv
from statements import get_random_statement
from mongodb_helper import insert_record # Import MongoDB helper functions
import html
# Load environment variables from .env file
load_dotenv()
# Define category IDs
CATEGORY_IDS = {
"True": 2,
"False": 3,
"Debatable": 4,
"Unknown": 6
}
def create_wordpress_post(title, content, category):
data = {
"title": title,
"content": content,
"status": "publish",
"categories": [CATEGORY_IDS[category]]
}
response = requests.post(
os.getenv("WORDPRESS_POSTS_URL"),
json=data,
auth=(os.getenv("WORDPRESS_USERNAME"), os.getenv("WORDPRESS_PASSWORD"))
)
if response.status_code == 201:
print("Blog post created successfully.")
else:
print(f"Failed to create blog post: {response.status_code} - {response.text}")
def fact_check(assertion):
llm = OpenAI(temperature=0.7, model=os.getenv("MODEL_NAME"))
# Define the prompt templates
assertion_template = """{assertion}\n\n"""
assertion_prompt = PromptTemplate(input_variables=["assertion"], template=assertion_template)
assumptions_template = """Here is a statement:
{statement}
Make a bullet point list of the assumptions required to support the above statement.\n\n"""
assumptions_prompt = PromptTemplate(input_variables=["statement"], template=assumptions_template)
fact_checker_template = """Here is a bullet point list of assertions:
{assertions}
For each assumption, determine whether it is true or false. Explain your reasoning.\n\n"""
fact_checker_prompt = PromptTemplate(input_variables=["assertions"], template=fact_checker_template)
answer_template = """
Here is the information to classify the statement:
{facts}
Based on the above information, how would you classify the statement? Respond with one of the following options followed by a colon and space:
- True: [Explanation]
- False: [Explanation]
- Debatable: [Explanation]
"""
answer_prompt = PromptTemplate(input_variables=["facts"], template=answer_template)
# Format prompts and extract the string content
formatted_assertion = assertion_prompt.format_prompt(assertion=assertion).text
assertion_output = llm.invoke(formatted_assertion)
formatted_assumptions = assumptions_prompt.format_prompt(statement=assertion_output).text
assumptions_output = llm.invoke(formatted_assumptions)
formatted_fact_checker = fact_checker_prompt.format_prompt(assertions=assumptions_output).text
fact_checker_output = llm.invoke(formatted_fact_checker)
formatted_answer = answer_prompt.format_prompt(facts=fact_checker_output).text
final_output = llm.invoke(formatted_answer)
return {
"assertion_output": assertion_output,
"assumptions_output": assumptions_output,
"fact_checker_output": fact_checker_output,
"final_output": final_output,
}
def extract_status_and_reasoning(final_output):
final_output = final_output.strip()
if "True:" in final_output:
status_start = final_output.find("True:")
status = "True"
elif "False:" in final_output:
status_start = final_output.find("False:")
status = "False"
elif "Debatable:" in final_output:
status_start = final_output.find("Debatable:")
status = "Debatable"
else:
return "Unknown", final_output
reasoning = final_output[status_start + len(status) + 1:].strip()
return status, reasoning
if __name__ == "__main__":
if len(sys.argv) > 1:
assertion = sys.argv[1]
else:
assertion = get_random_statement()
print(assertion)
submission = fact_check(assertion)
# Print the detailed outputs to inspect their structure
for key, value in submission.items():
print(f"{key}: {value}")
# Extract the final output for status determination and reasoning
final_output = submission['final_output']
status, reasoning = extract_status_and_reasoning(final_output)
# Record the result in MongoDB
try:
print("Attempting to insert record into MongoDB...")
insert_record(
script_name="fact_checker_mongodb.py",
script_code=html.escape(open(__file__).read()),
assertion=assertion,
status=status,
submission=submission, # Store the entire submission for detailed analysis
model=os.getenv("MODEL_NAME")
)
print("Record inserted into MongoDB successfully.")
except Exception as e:
print(f"Failed to insert record into MongoDB: {e}")
print(final_output)
# Create a blog post on WordPress
blog_title = f"Fact Check: {assertion}"
blog_content = f"""
<h1>Status: {status}</h1>
<h2>Assertion</h2>
<p>{assertion}</p>
<h2>Results</h2>
<p>{reasoning}</p>
<h3>Assumptions</h3>
<p>{submission['assumptions_output']}</p>
<h3>Fact Checker Output</h3>
<p>{submission['fact_checker_output']}</p>
<h4>Model Used</h4>
<p>{os.getenv("MODEL_NAME")}</p>
<h4>Script Name</h4>
<p>fact_checker_mongodb.py</p>
<h4>Script Code</h4>
<pre>{html.escape(open(__file__).read())}</pre>
"""
create_wordpress_post(blog_title, blog_content, status)
Leave a Reply