File size: 2,927 Bytes
2284ae0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
986615a
2284ae0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import numpy as np
import pandas as pd
import openai
from haystack.schema import Document
import streamlit as st
from tenacity import retry, stop_after_attempt, wait_random_exponential
from huggingface_hub import InferenceClient


# Get openai API key
hf_token = os.environ["HF_API_KEY"]

# define a special function for putting the prompt together (as we can't use haystack)
def get_prompt(context, label):
  base_prompt="Summarize the following context efficiently in bullet points, the less the better - but keep concrete goals. \
  Summarize only elements of the context that address vulnerability of "+label+" to climate change. \
  If there is no mention of "+label+" in the context, return: 'No clear references to vulnerability of "+label+" found'.  \
  Do not include an introduction sentence, just the bullet points as per below. \
  Formatting example: \
    - Bullet point 1 \
    - Bullet point 2 \
  "

  prompt = base_prompt+"; Context: "+context+"; Answer:"

  return prompt


# # exception handling for issuing multiple API calls to openai (exponential backoff)
# @retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6))
# def completion_with_backoff(**kwargs):
#     return openai.ChatCompletion.create(**kwargs)

class ChatCompletionResult:
    def __init__(self):
        self.content = ""

    def add_content(self, text):
        self.content += text

    def get_full_content(self):
        return self.content.strip()

def run_query(context, label, model_sel_name):
    '''
    Summarize provided test
    '''
    chatbot_role = """You are an analyst specializing in climate change impact assessments and producing insights from policy documents."""
    messages = [{"role": "system", "content": chatbot_role},{"role": "user", "content": get_prompt(context, label)}]
    
    # Initialize the client, pointing it to one of the available models
    client = InferenceClient(model_sel_name, token=hf_token)
    
    # Instantiate ChatCompletion as a generator object (stream is set to True)
    chat_completion = client.chat.completions.create(
        messages=messages,
        stream=True
    )

    # Create an object to store the full chat completion
    completion_result = ChatCompletionResult()
    res_box = st.empty()

    # Iterate through the streamed output
    for chunk in chat_completion:
        # Extract the object containing the text
        if chunk.choices is not None:
            chunk_message = chunk.choices[0].delta
            if 'content' in chunk_message:
                completion_result.add_content(chunk_message['content'])  # Store the message
                # Add the latest text and merge it with all previous
                result = completion_result.get_full_content()
                res_box.success(result)  # Output to response text box

    # Return the stored chat completion object for later use
    return completion_result