code/embedding-function/utilities/common/answer.py (55 lines of code) (raw):
import json
from typing import List, Optional
from .source_document import SourceDocument
class Answer:
def __init__(
self,
question: str,
answer: str,
source_documents: List[SourceDocument] = [],
prompt_tokens: Optional[int] = 0,
completion_tokens: Optional[int] = 0,
):
self.question = question
self.answer = answer
self.source_documents = source_documents
self.prompt_tokens = prompt_tokens
self.completion_tokens = completion_tokens
def __eq__(self, value: object) -> bool:
if not isinstance(value, Answer):
return False
return (
self.question == value.question
and self.answer == value.answer
and self.source_documents == value.source_documents
and self.prompt_tokens == value.prompt_tokens
and self.completion_tokens == value.completion_tokens
)
def to_json(self):
return json.dumps(self, cls=AnswerEncoder)
@classmethod
def from_json(cls, json_string):
return json.loads(json_string, cls=AnswerDecoder)
class AnswerEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Answer):
return {
"question": obj.question,
"answer": obj.answer,
"source_documents": [doc.to_json() for doc in obj.source_documents],
"prompt_tokens": obj.prompt_tokens,
"completion_tokens": obj.completion_tokens,
}
return super().default(obj)
class AnswerDecoder(json.JSONDecoder):
def decode(self, s, **kwargs):
obj = super().decode(s, **kwargs)
return Answer(
question=obj["question"],
answer=obj["answer"],
source_documents=[
SourceDocument.from_json(doc) for doc in obj["source_documents"]
],
prompt_tokens=obj["prompt_tokens"],
completion_tokens=obj["completion_tokens"],
)