File size: 2,361 Bytes
c169262
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
from openai import OpenAI
from models.query import Query
import re
from transformers import pipeline
from services.utils import clean_text, encode_and_normalize

intent_recognizer = pipeline(
    "zero-shot-classification", model="facebook/bart-large-mnli")

ner_recognizer = pipeline(
    'ner', model='dbmdz/bert-large-cased-finetuned-conll03-english')

openai_key = os.environ.get("OPENAI_KEY")
openai_client = OpenAI(api_key=openai_key)

# Define regex patterns for entities
patterns = {
    'Product': r'\b(iphone|samsung|macbook|ps5|galaxy|pixel|shoes|shampoo|cellphone|smartphone|tablet|laptop|headphones|console|tv|camera)\b',
    'Brand': r'\b(apple|samsung|google|sony|microsoft|dell|hp|lenovo|asus|nintendo|canon|nikon)\b',
    'Category': r'\b(laptops|dresses|phones|electronics|clothing|footwear|accessories|home appliances|furniture)\b',
    'Color': r'\b(red|black|yellow|blue|green|white|grey|pink|purple|orange|brown)\b',
    'Price Range': r'\b(under \$?\d+|below \$?\d+|less than \$?\d+|more than \$?\d+|above \$?\d+|between \$?\d+ and \$?\d+)\b',
    'Quantity': r'\b(\d+ bottles|\d+ items|\d+ pieces|\d+ units|\d+)\b',
    'Order Number': r'\bB-\d+\b',
    'Issue': r'\b(account help|payment issue|order problem|shipping delay|return request|product complaint|technical support)\b'
}

INTENTS = [
    "search for products",
    "order management",
    "checkout",
    "customer support",
    "account management"
]


def recognize_intent(text):
    cleaned_text = clean_text(text)
    intent = intent_recognizer(cleaned_text, INTENTS)
    return intent['labels'][0]


def recognize_entities(text):
    cleaned_text = clean_text(text)
    entities_from_ner = ner_recognizer(cleaned_text)
    entities_from_re = {entity: re.findall(pattern, text.lower(
    )) for entity, pattern in patterns.items() if re.findall(pattern, text.lower())}

    return entities_from_re


def extract_keywords(text):
    cleaned_text = clean_text(text)
    return cleaned_text.split()


def generate_response(query: Query, context_from_elasticsearch):
    prompt = query.history
    prompt.append({"role": "assistant", "content": str(context_from_elasticsearch)})

    print(prompt)

    response = openai_client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=prompt
    )

    return response.choices[0].message.content