huggingface-transformersnlp-question-answering

How do I create a question answering model in Huggingfaces that answers questions about my data?


I would like to develop a question-answering model with hugging interfaces that answers questions about my input data. Unfortunately, I'm quite new to Python and also to transformers, so I need some basic help.

What I have tried

I have made a few attempts in Python, unfortunately not entirely successfully. For example, I converted my data into a small continuous text, but the answers provided by the model are incorrect:

# Create loader
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
import torch

tokenizer = AutoTokenizer.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")
model = AutoModelForQuestionAnswering.from_pretrained("bert-large-uncased-whole-word-masking-finetuned-squad")

text = """
2011 wurden in Deutschland 1.296.349 Euro für Forschung und Entwicklung in Architektur- und Ingenieurbüros sowie für technische Untersuchungen ausgegeben. 1987 gab es im gesamten Wirtschaftssektor 295.332 Vollzeitäquivalente (VZÄ) im Bereich Forschung und Entwicklung. 2016 wurden im Sektor der freiberuflichen, wissenschaftlichen und technischen Dienstleistungen 47.551 VZÄ gezählt. Im Bergbau und in der Steingewinnung wurden im selben Jahr 21.318 Tausend Euro für interne Forschungs- und Entwicklungsarbeiten ausgegeben. Im Maschinenbau wurden 2017 49.323 VZÄ im Bereich Forschung und Entwicklung verzeichnet. 2004 betrugen die internen Forschungs- und Entwicklungsausgaben im gesamten Wirtschaftssektor 38.363.000 Tausend Euro.

2014 wurden in der Architektur und verwandten Bereichen 84.855 Tausend Euro für externe Forschungs- und Entwicklungsaufwendungen ausgegeben. 2016 wurden im Luft- und Raumfahrzeugbau 1.732.000 Tausend Euro für interne Forschung und Entwicklung aufgewendet. In den Finanz- und Versicherungsdienstleistungen wurden 2014 318.000 Tausend Euro und 2010 in der Herstellung von Glas, Keramik sowie in der Verarbeitung von Steinen 285.334 Tausend Euro für interne Forschung und Entwicklung verzeichnet.
"""

questions = [
    "Wie hoch waren die Ausgaben für Forschung und Entwicklung in Architektur- und Ingenieurbüros im Jahr 2011?",
    "Wie viele VZÄ wurden 2017 im Maschinenbau verzeichnet?",
]

for question in questions:
    inputs = tokenizer.encode_plus(question, text, add_special_tokens=True, return_tensors="pt")
    input_ids = inputs["input_ids"].tolist()[0]

    outputs = model(**inputs)
    answer_start_scores, answer_end_scores = outputs.start_logits, outputs.end_logits

    answer_start = torch.argmax(answer_start_scores)
    answer_end = torch.argmax(answer_end_scores) + 1

    if answer_end > answer_start and answer_start != 0:  # Zusätzliche Überprüfung hier
        answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(input_ids[answer_start:answer_end]))
    else:
        answer = "No clear answer found."

    print(f"Question: {question}")
    print(f"Answer: {answer}\n")

What I would like to achieve

I have this data.

As I said, I would like to build a chatbot that answers my questions about this data, e.g:

Question: Wie Hoch waren die Aufwendungen für FuE-Personal im Bereich "H.v. DV-Geräten, elektronischen u. opt. Erzeugnissen" im Jahr 2011?

Answer: 54647 VZÄ

or

Question: Wie Hoch waren die Aufwendungen für FuE-Personal im Bereich "H.v. elektrischen Ausrüstungen" im Jahr 2017?

Answer: 19534 VZÄ

(The relevant lines are highlighted in orange in the xlsx.-file)

I would be very grateful for a short example that helps me!


Solution

  • Your question is hard to answer as there are several things to consider. The simplest thing to do would be:

    import ollama
    MODEL_ID = "llama3.1:8b-instruct-q4_0"
    ollama.pull(MODEL_ID)
    
    text = """
    2011 wurden in Deutschland 1.296.349 Euro für Forschung und Entwicklung in Architektur- und Ingenieurbüros sowie für technische Untersuchungen ausgegeben. 1987 gab es im gesamten Wirtschaftssektor 295.332 Vollzeitäquivalente (VZÄ) im Bereich Forschung und Entwicklung. 2016 wurden im Sektor der freiberuflichen, wissenschaftlichen und technischen Dienstleistungen 47.551 VZÄ gezählt. Im Bergbau und in der Steingewinnung wurden im selben Jahr 21.318 Tausend Euro für interne Forschungs- und Entwicklungsarbeiten ausgegeben. Im Maschinenbau wurden 2017 49.323 VZÄ im Bereich Forschung und Entwicklung verzeichnet. 2004 betrugen die internen Forschungs- und Entwicklungsausgaben im gesamten Wirtschaftssektor 38.363.000 Tausend Euro.
    
    2014 wurden in der Architektur und verwandten Bereichen 84.855 Tausend Euro für externe Forschungs- und Entwicklungsaufwendungen ausgegeben. 2016 wurden im Luft- und Raumfahrzeugbau 1.732.000 Tausend Euro für interne Forschung und Entwicklung aufgewendet. In den Finanz- und Versicherungsdienstleistungen wurden 2014 318.000 Tausend Euro und 2010 in der Herstellung von Glas, Keramik sowie in der Verarbeitung von Steinen 285.334 Tausend Euro für interne Forschung und Entwicklung verzeichnet.
    """
    
    questions = [
        "Wie hoch waren die Ausgaben für Forschung und Entwicklung in Architektur- und Ingenieurbüros im Jahr 2011?",
        "Wie viele VZÄ wurden 2017 im Maschinenbau verzeichnet?",
    ]
    
    system_prompt = f"Du bist ein Deutsch sprechender AI assistent der Nutzern Fragen über folgenden Inhalt beantwortet: \n{text}\n Antworte kurz und immer auf Deutsch!."
    
    answers = []
    for question in questions:
        messages = [{"role": "user", "content": system_prompt},{"role": "user", "content": question}]
        response = ollama.chat(model=MODEL_ID, messages=messages, options={'temperature': 0.1, 'num_predict': 256, "top_p": 0.9})
        answers.append(response['message']['content'])
    print(answers)
    

    Output:

    [
    'Die Ausgaben für Forschung und Entwicklung in Architektur- und Ingenieurbüros beliefen sich im Jahr 2011 auf 1.296.349 Euro.', 
    '49.323 Vollzeitäquivalente (VZÄ) wurden 2017 im Bereich Forschung und Entwicklung im Maschinenbau verzeichnet.'
    ]
    

    If this does not work, change MODEL_ID to "llama3.1:8b-instruct-fp16", this will require more RAM. And to build a fully fledged Q&A chatbot, you might need a RAG pipeline to prefilter your "text".