Skip to main content

Factuality Detection in Generative AI

This repository contains the source code and plugin configuration for our paper Factuality Detection in Generative AI: A Tool Augmented Framework for Multi-Task and Multi-Domain Scenarios.

Factool is a tool augmented framework for detecting factual errors of texts generated by large language models (e.g., ChatGPT).

Factool now supports 4 tasks:

  • knowledge-based QA: Factool detects factual errors in knowledge-based QA.
  • code generation: Factool detects execution errors in code generation.
  • mathematical reasoning: Factool detects calculation errors in mathematical reasoning.
  • scientific literature review: Factool detects hallucinated scientific literatures.

Installation

conda create -n factool_env python=3.11
conda activate factool_env
pip uninstall factool
pip install git+https://github.com/GAIR-NLP/factool

Quick Start

  1. Install the package.
  2. Create a file called keys.yaml and put your API keys (openai, serper, scraperapi) under it.

General Usage:

from factool  import Factool

# Initialize a Factool instance with the specified keys. foundation_model could be either "gpt-3.5-turbo" or "gpt-4"
factool_instance = Factool("gpt-3.5-turbo")


inputs = [
            {
                "prompt": "Introduce Graham Neubig",
                "response": "Graham Neubig is a professor at MIT",
                "category": "kbqa",
                "entry_point": "answer_question",
            },
]



response_list = factool_instance.run(inputs)

print(response_list)
'''
knowledge-based QA: 
response_list = 
[
    {
        'prompt': prompt_1, 
        'response': response_1, 
        'category': 'kbqa', 
        'claims': [claim_11, claim_12, ..., claims_1n], 
        'queries': [[query_111, query_112], [query_121, query_122], ..[query_1n1, query_1n2]], 
        'evidences': [[evidences_11], [evidences_12], ..., [evidences_1n]], 
        'claim_level_factuality': [{claim_11, reasoning_11, error_11, correction_11, factuality_11}, {claim_12, reasoning_12, error_12, correction_12, factuality_12}, ..., {claim_1n, reasoning_1n, error_1n, correction_1n, factuality_1n}], 
        'response_level_factuality': factuality_1
    },
    {
        'prompt': prompt_2, 
        'response': response_2, 
        'category': 'kbqa',
        'claims': [claim_21, claim_22, ..., claims_2n], 
        'queries': [[query_211, query_212], [query_221, query_222], ..., [query_2n1, query_2n2]], 
        'evidences': [[evidences_21], [evidences_22], ..., [evidences_2n]], 
        'claim_level_factuality': [{claim_21, reasoning_21, error_21, correction_21, factuality_21}, {claim_22, reasoning_22, error_22, correction_22, factuality_22}, ..., {claim_2n, reasoning_2n, error_2n, correction_2n, factuality_2n}],
        'response_level_factuality': factuality_2,
    },
    ...
]

code generation:
response_list = 
[
    {
        'prompt': prompt_1, 
        'response': response_1, 
        'claim': claim_1,
        'category': 'code',
        'testcases_queries': [testcase_query_11, testcase_query_12, testcase_query_13], 
        'potential_solutions_queries': [potential_solution_query_11, potential_solution_query_12, potential_solution_query_13], 
        'exec_results': [[evidences_111, evidences_112, evidences_113, evidences_114], [evidences_121, evidences_122, evidences_123, evidences_124], [evidences_131, evidences_132, evidences_133, evidences_134]], 
        'claim_level_factuality': factuality_1,
        'response_level_factuality': factuality_1,
    },
    {
        'prompt': prompt_2, 
        'response': response_2, 
        'claim': claim_2,
        'category': 'code',
        'testcases_queries': [testcase_query_21, testcase_query_22, testcase_query_23], 
        'potential_solutions_queries': [potential_solution_query_21, potential_solution_query_22, potential_solution_query_23], 
        'exec_results': [[evidences_211, evidences_212, evidences_213, evidences_214], [evidences_221, evidences_222, evidences_223, evidences_224], [evidences_231, evidences_232, evidences_233, evidences_234]], 
        'claim_level_factuality': factuality_2,
        'response_level_factuality': factuality_2,
    },
    ...
]

mathematical problem solving: 
response_list = 
[
    {
        'prompt': prompt_1, 
        'response': response_1, 
        'category': 'math', 
        'claims': [claim_11, claim_12, ..., claims_1n], 
        'queries': [query_11, query_12, ..., query_1n], 
        'execution_results': [exec_result_11, exec_result_12, ..., exec_result_1n],
        'claim_level_factuality': [factuality_11, factuality_12, ..., factuality_1n], 
        'response_level_factuality': factuality_1
    },
    {
        'prompt': prompt_2, 
        'response': response_2, 
        'category': 'math', 
        'claims': [claim_21, claim_22, ..., claims_2n], 
        'queries': [query_21, query_22, ..., query_2n], 
        'execution_results': [exec_result_21, exec_result_22, ..., exec_result_2n],
        'claim_level_factuality': [factuality_21, factuality_22, ..., factuality_2n], 
        'response_level_factuality': factuality_2
    },
    ...
]

scientific literature review:
response_list = 
[
    {
        'prompt': prompt_1, 
        'response': response_1, 
        'category': 'scientific', 
        'claims': [claim_11, claim_12, ..., claims_1n], 
        'queries': [query_11, query_12, ..., query_1n], 
        'evidences': [evidences_11, evidences_12, ..., evidences_1n], 
        'claim_level_factuality': [{claim_11, evidence_11, error_11, factuality_11}, {claim_12, evidence_12, error_12, factuality_12}, ..., {claim_1n, evidence_1n, error_1n, factuality_1n}], 
        'response_level_factuality': factuality_1
    },
    {
        'prompt': prompt_2, 
        'response': response_2, 
        'category': 'scientific', 
        'claims': [claim_21, claim_22, ..., claims_2n], 
        'queries': [query_21, query_22, ..., query_2n],
        'evidences': [evidences_21, evidences_22, ..., evidences_2n], 
        'claim_level_factuality': [{claim_21, evidence_21, error_21, factuality_21}, {claim_22, evidence_22, error_22, factuality_22}, ..., {claim_2n, evidence_2n, error_2n, factuality_2n}], 
        'response_level_factuality': factuality_2
    },
    ...
]

Steps for setting up FACTOOL ChatGPT Plugin:

  1. Install the package: Installation
  2. git clone the repo: git clone https://github.com/GAIR-NLP/factool.git
  3. cd ./factool/plugin_config
  4. Create your keys.yaml
  5. Run the API locally: uvicorn main:app --host 0.0.0.0 --port ${PORT:-5003}
  6. Enter plugin store of ChatGPT Website
  7. Click 'develop your own plugin' then enter the website domain localhost: 5003 under 'domain'.

Experiments:

  1. Experimental results:
  • Exp I: .results/knowledge_QA/RoSE/

  • Exp II: .results/knowledge_QA, .results/code, .results/math, .results/scientific

  • Exp III .results/chat

  1. Get the final results and statistics for fine-grained analysis:
  • Exp I: python ./results/knowledge_QA/RoSE/run_rose_claim_extraction.py

  • Exp II: bash ./results/evaluation.sh

  • Exp III: python ./results/chat/calc_stats.py

  1. Reimplement the experiments:
  • Exp II: bash run_experiments.sh

  • Exp III: bash run_chatbot.sh

Metadata

Release files for factool 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for factool 0.0.1
File Size Uploaded
factool-0.0.1.tar.gz 30.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for factool 0.0.1
File Interpreter ABI Platform
factool-0.0.1-py2.py3-none-any.whl Python 3, Python 2 none any Details

Total release size: 70.7 kB

Release files / factool-0.0.1.tar.gz

Download URL factool-0.0.1.tar.gz
Size 30.9 kB
Tags Source
SHA-256 checksum
How to use checksums
988b962242eb8a3d435973d8d215bbb4f94b5b9befc906c2a143b43119181cde
BLAKE2b-256 checksum
How to use checksums
2b2fdec71ba016fd7974ee279e7da58e80af6e391097ca122c23e572ad681f2b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.8.17

Release files / factool-0.0.1-py2.py3-none-any.whl

Download URL factool-0.0.1-py2.py3-none-any.whl
Size 39.8 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
2b9d48d8d53b4bad42020d6609956f72a48bd8d474cb2b30d5e0e1458dda8f0e
BLAKE2b-256 checksum
How to use checksums
edd633882f681222a38e5c39047361c973d41766b3e9575e165548de117069d9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.8.17

Release history Release notifications | RSS feed

0.1.3

2 release files

0.1.2

2 release files

0.1.0

2 release files

0.0.8

2 release files

0.0.7

2 release files

This release

0.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page