Skip to main content

Explain

With our explain-endpoint you can get an explanation of the model's output. In more detail, we return how much the log-probabilites of the already generated completion would change if we suppress individual parts (based on the granularity you chose) of a prompt. Please refer to this part of our documentation if you would like to know more about our explainability method in general.

Code Example Text

from aleph_alpha_client import Client, Prompt, CompletionRequest, ExplanationRequest
import numpy as np
import os
from time import time

client = Client(token=os.getenv("AA_TOKEN"))

MODEL = "luminous-supreme"

prompt_text = """Answer the question based on the context.

Context: According to tradition, on April 21, 753 BC, Romulus and his twin brother Remus founded Rome in the place where they had been suckled as orphans by a she-wolf.

Q: In which month was Rome founded?

A:"""

params = {
"prompt": Prompt.from_text(prompt_text),
"maximum_tokens": 1,
}

request = CompletionRequest(**params)
response = client.complete(request=request, model=MODEL)
completion = response.completions[0].completion

print(f"Prompt:\n{prompt_text}")
print(f"Completion:\n{completion}") #April

exp_req = ExplanationRequest(Prompt.from_text(prompt_text), completion, prompt_granularity="sentence")
response_explain = client.explain(exp_req, model=MODEL)

for explanation in response_explain.explanations:
for item in explanation.items:
for score in item.scores:
start = score.start
end = score.start + score.length
print(f"""EXPLAINED TEXT: {prompt_text[start:end]}
Score: {np.round(score.score, decimals=3)}\n""")

# Prints:
# EXPLAINED TEXT: Answer the question based on the context.
# Score: -0.367

# EXPLAINED TEXT: Context: According to tradition, on April 21, 753 BC, Romulus and his twin brother Remus founded Rome in the place where they had been suckled as orphans by a she-wolf.
# Score: 0.856

# EXPLAINED TEXT: Q: In which month was Rome founded?
# Score: 1.214

# EXPLAINED TEXT: A:
# Score: 1.422

Code Example Image

First we need to define a function that let's us visualize the image with the explanations.

def explain_token(result, token_index, image, original_image_width, original_image_height):
print(f"Explanation for the token '{result.explanations[token_index].target}'")
token_explanation = exp_result.explanations[token_index]

ax = plt.gca()
# Display the image
ax.imshow(image)
for image_token in token_explanation.items[0].scores:
left = image_token.left
top = image_token.top
width = image_token.width
height = image_token.height
score = np.round(image_token.score, decimals=3)
# Create a Rectangle patch

rect = patches.Rectangle((left, top), width, height, linewidth=1, edgecolor='r', alpha=score)

ax.add_patch(rect)

rx, ry = rect.get_xy()
cx = rx + rect.get_width()/2.0
cy = ry + rect.get_height()/2.0
ax.annotate(f"{score}", (cx, cy), color='black', fontsize=6, ha='center', va='center')
plt.axis('off')
plt.show()

Now we can run the actual explanation.

import os
from aleph_alpha_client import (
Client,
Prompt,
Text,
Image,
ExplanationRequest,
CompletionRequest,
ExplanationPostprocessing
)
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np
from PIL import Image as PILImage

client = Client(token=os.getenv("AA_TOKEN"))

image_path = "path/to/your/image"
image = Image.from_image_source(image_path)

prompt_text = "The instrument on the picture is a"
text = Text.from_text(prompt_text)
prompt = Prompt([image, text])

params = {
"prompt": prompt,
"maximum_tokens": 1,
}

request = CompletionRequest(**params)
completion_result = client.complete(request, "luminous-extended")
completion = completion_result.completions[0].completion

print(f"""MODEL COMPLETION: {completion.strip()}""")

explain_params = {
"prompt": prompt,
"target": completion,
"normalize": True,
"postprocessing": ExplanationPostprocessing("absolute")
}
request = ExplanationRequest(**explain_params)

exp_result = client.explain(request, "luminous-extended")
exp_result = exp_result.with_image_prompt_items_in_pixels(prompt)

text_explanations_first_token = exp_result.explanations[0].items[1].scores

for item in text_explanations_first_token:
start = item.start
end = item.start + item.length
print(f"""EXPLAINED TEXT: {prompt_text[start:end]}
Score: {np.round(item.score, decimals=3)}""")

# prints:
# MODEL COMPLETION: guitar
# EXPLAINED TEXT: The
# Score: 0.077
# EXPLAINED TEXT: instrument
# Score: 1.0
# EXPLAINED TEXT: on
# Score: 0.112
# EXPLAINED TEXT: the
# Score: 0.051
# EXPLAINED TEXT: picture
# Score: 0.117
# EXPLAINED TEXT: is
# Score: 0.001
# EXPLAINED TEXT: a
# Score: 0.001

original_image = PILImage.open(image_path)
original_image_width = original_image.width
original_image_height = original_image.height
explain_token(exp_result, 0, original_image, original_image_width, original_image_height)
# outputs:
# Explanation for the token ' guitar'
Room Explained