63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
# imports
|
|
|
|
import os
|
|
import re
|
|
import math
|
|
import json
|
|
from typing import List
|
|
from openai import OpenAI
|
|
from sentence_transformers import SentenceTransformer
|
|
from datasets import load_dataset
|
|
import chromadb
|
|
from items import Item
|
|
from testing import Tester
|
|
|
|
class FrontierAgent:
|
|
|
|
MODEL = "gpt-4o-mini"
|
|
|
|
def __init__(self, collection):
|
|
self.openai = OpenAI()
|
|
self.collection = collection
|
|
self.model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
|
|
|
|
def make_context(self, similars: List[str], prices: List[float]):
|
|
message = "To provide some context, here are some other items that might be similar to the item you need to estimate.\n\n"
|
|
for similar, price in zip(similars, prices):
|
|
message += f"Potentially related product:\n{similar}\nPrice is ${price:.2f}\n\n"
|
|
return message
|
|
|
|
def messages_for(self, description: str, similars: List[str], prices: List[float]):
|
|
system_message = "You estimate prices of items. Reply only with the price, no explanation"
|
|
user_prompt = self.make_context(similars, prices)
|
|
user_prompt += "And now the question for you:\n\n"
|
|
user_prompt += "How much does this cost?\n\n" + description
|
|
return [
|
|
{"role": "system", "content": system_message},
|
|
{"role": "user", "content": user_prompt},
|
|
{"role": "assistant", "content": "Price is $"}
|
|
]
|
|
|
|
def find_similars(self, description: str):
|
|
vector = self.model.encode([description])
|
|
results = self.collection.query(query_embeddings=vector.astype(float).tolist(), n_results=5)
|
|
documents = results['documents'][0][:]
|
|
prices = [m['price'] for m in results['metadatas'][0][:]]
|
|
return documents, prices
|
|
|
|
def get_price(self, s) -> float:
|
|
s = s.replace('$','').replace(',','')
|
|
match = re.search(r"[-+]?\d*\.\d+|\d+", s)
|
|
return float(match.group()) if match else 0.0
|
|
|
|
def price(self, description: str) -> float:
|
|
documents, prices = self.find_similars(description)
|
|
response = self.openai.chat.completions.create(
|
|
model=self.MODEL,
|
|
messages=self.messages_for(description, documents, prices),
|
|
seed=42,
|
|
max_tokens=5
|
|
)
|
|
reply = response.choices[0].message.content
|
|
return self.get_price(reply)
|
|
|