Skip to content

Instantly share code, notes, and snippets.

@nbonamy
Created May 3, 2024 17:11
Show Gist options
  • Save nbonamy/5269207c4116bd6244cb2a09f77b3d92 to your computer and use it in GitHub Desktop.
Save nbonamy/5269207c4116bd6244cb2a09f77b3d92 to your computer and use it in GitHub Desktop.
Order Processing Program
import os
import json
from langchain_openai import ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import HuggingFaceEmbeddings
os.environ['TOKENIZERS_PARALLELISM']='false'
os.environ['OPENAI_API_KEY']='YOUR_API_KEY'
input = "I would like to order 10 Garden Hoses, 5 iPhone and 10 Sump Pump."
# our vectorstore
print('Creating vectorstore')
embeddings = HuggingFaceEmbeddings(model_name='all-mpnet-base-v2')
vectorstore=Chroma(
embedding_function=embeddings
)
# load data
print('Loading data')
with open('./products.json') as f:
products = json.load(f)
vectorstore.add_texts([product['description'] for product in products], [{ 'id': product['product_id'] } for product in products])
# erase all files in the output directory
output_dir = './output'
os.makedirs(output_dir, exist_ok=True)
# extract order information
prompt = f"""
You are a helpful sales assistant. Your role is to extract order information from a mail sent by a customer.
You will produce a JSON array made of object reach representing the description provided by the cutomer and the desired quantity.
Example: I want to order 3 apples and 2 oranges.
Response: [ {{ "description": "apple", "quantity": 3 }}, {{ "description": "orange", "quantity": 2 }} ]
Input: {input}
JSON response:"""
# parsing order
print('Parsing order')
llm = ChatOpenAI(model='gpt-3.5-turbo-1106', temperature=0)
response = llm.invoke(prompt)
order_lines = json.loads(response.content)
def find_product_id(text: str):
"""Returns the product_id of the product matching the text provided by the customer"""
results = vectorstore.similarity_search_with_score(text, k=1)
result = results[0]
score = result[1]
return result[0].metadata['id'] if score < 1 else None
def get_stock(product_id: str):
"""Returns the available stock of a product provided the product_id returned by find_product_id"""
for product in products:
if product['product_id'] == product_id:
return product['stock_value']
return 0
print('Processing order')
for order_line in order_lines:
product_id = find_product_id(order_line['description'])
if product_id is None:
order_line['status'] = 'Product not found'
continue
order_line['product_id'] = product_id
stock = get_stock(product_id)
order_line['stock'] = stock
if stock < order_line['quantity']:
order_line['status'] = 'Not enough stock'
else:
order_line['status'] = 'Available'
print('Generating order summary')
prompt = f"""
You are a helpful sales assistant. Your role is to generate an order confirmation letter.
Your input is a list of product made of product_id, description, quantity requested by customer, quantity available in stock and status.
The letter should include a table with the following columns: product_id, description, quantity requested, quantity available, status.
Input: {json.dumps(order_lines)}
Letter:"""
response = llm.invoke(prompt)
print(response.content)
[
{
"product_id": "2353e594-cbef-4183-847f-bbc1b8f474dd",
"description": "Pipe Wrench, 14 inch, Steel",
"stock_value": 6
},
{
"product_id": "ef1784bf-a4d1-4475-b4d9-73ab2b5ef184",
"description": "Cordless Drill, 18V with 2 Batteries",
"stock_value": 10
},
{
"product_id": "f0e1780a-bc9c-4ea1-858d-5529fd85d7be",
"description": "Paint Brush Set, Synthetic Bristles, 5-Piece",
"stock_value": 17
},
{
"product_id": "f0e84315-ff4e-4318-af34-0cff159ec3e1",
"description": "Caulk, Silicone, Waterproof, Clear, 10 oz Tube",
"stock_value": 18
},
{
"product_id": "67e6815d-44fa-4709-9e1a-69ccfaad1cd9",
"description": "Cordless Drill, 18V with 2 Batteries",
"stock_value": 0
},
{
"product_id": "e7675748-7e14-4307-a771-a7582d8af66c",
"description": "LED Light Bulb, 60W Equivalent",
"stock_value": 7
},
{
"product_id": "65ed35e2-7319-48d6-ad3a-471e4cbf4d79",
"description": "Pruning Shears, Bypass, Stainless Steel",
"stock_value": 3
},
{
"product_id": "423a6126-eb8b-4567-ab28-78e58d47bd83",
"description": "Screwdriver Set, Phillips and Flathead, 6-Piece",
"stock_value": 18
},
{
"product_id": "a6eec299-0ef4-456c-b648-f649106f71aa",
"description": "Safety Glasses, Anti-Fog, Clear",
"stock_value": 11
},
{
"product_id": "47f2be58-d049-4503-9f9e-41a25e8d6b1a",
"description": "Ladder, Aluminum, Telescoping, 22 Feet",
"stock_value": 10
},
{
"product_id": "6f3f2f22-9a29-4487-b2ca-418848d25d5a",
"description": "Extension Ladder, Fiberglass, 24 Feet",
"stock_value": 12
},
{
"product_id": "11a7e211-e97b-43cf-94e0-7ddee5ae55de",
"description": "Hammer Drill, Corded, 1/2 Inch Chuck",
"stock_value": 16
},
{
"product_id": "0e557c28-7b72-4fc8-998e-afe2dde0d1da",
"description": "Pipe Wrench, 14 inch, Steel",
"stock_value": 19
},
{
"product_id": "932123d1-3feb-47c9-b8d4-fbd4ed433d01",
"description": "Wall Mount Shelving, 48 inches, White",
"stock_value": 3
},
{
"product_id": "e55d06c7-af2f-408b-a88a-0617e7b2cc8e",
"description": "Garden Hose, 50 feet, Heavy Duty",
"stock_value": 20
},
{
"product_id": "fcdaa40b-e40f-42b5-85b1-8f9e8b09e5c7",
"description": "Caulk, Silicone, Waterproof, Clear, 10 oz Tube",
"stock_value": 17
},
{
"product_id": "43c8e1cf-5d96-412f-b319-d9ae9adc2b83",
"description": "Wall Mount Shelving, 48 inches, White",
"stock_value": 4
},
{
"product_id": "19ffff94-ef0a-4a50-965f-53d6047fbf4a",
"description": "Sump Pump, 1/2 HP, Submersible",
"stock_value": 6
},
{
"product_id": "a7633386-9dce-491e-af03-da79944cf838",
"description": "Extension Cord, Outdoor, 100 feet",
"stock_value": 20
},
{
"product_id": "5949d7ce-1f59-4f6c-ab5e-51356bfa00fa",
"description": "Wood Stain, Exterior, Mahogany, 1 Quart",
"stock_value": 9
},
{
"product_id": "4e4a24b1-7d86-4513-99b2-41c86843685b",
"description": "Extension Cord, Outdoor, 100 feet",
"stock_value": 1
},
{
"product_id": "8444679d-91ae-47a0-912e-8c1f9b1c7bdb",
"description": "Window Air Conditioner, 5000 BTU",
"stock_value": 11
},
{
"product_id": "93b605c1-221d-43af-b303-f318f704424b",
"description": "Pressure Washer, Gas, 3000 PSI",
"stock_value": 13
},
{
"product_id": "3ea2b9a5-fb85-4ae9-a7b2-e80822ec2e5f",
"description": "Smoke Detector, Battery Operated",
"stock_value": 15
},
{
"product_id": "222bfbb0-f051-43be-860b-a5720c5793dd",
"description": "Wall Mount Shelving, 48 inches, White",
"stock_value": 8
},
{
"product_id": "fea4e189-5530-4825-b245-b02777ee8de4",
"description": "Shovel, Round Point, Fiberglass Handle",
"stock_value": 4
},
{
"product_id": "46d34226-1110-447b-abee-1548f3b1edf2",
"description": "Screwdriver Set, Phillips and Flathead, 6-Piece",
"stock_value": 13
},
{
"product_id": "3f39b4ba-a1e6-41ef-8411-6b86c9dc45a6",
"description": "Caulk, Silicone, Waterproof, Clear, 10 oz Tube",
"stock_value": 13
},
{
"product_id": "d65cdcf1-9a4f-45f6-a177-b270b407e628",
"description": "Safety Glasses, Anti-Fog, Clear",
"stock_value": 14
},
{
"product_id": "5fbc453f-87ce-4e4b-bf06-7a86952112f7",
"description": "Mulch, Black, Rubber, 0.8 Cubic Feet Bag",
"stock_value": 16
},
{
"product_id": "bc4d950b-fa85-424b-b204-f3bdc3875646",
"description": "Insulation Roll, Fiberglass, R-30",
"stock_value": 17
},
{
"product_id": "d9504a84-cadb-4b35-ab82-6dd211eda562",
"description": "Level, Laser, Self-Leveling, 50 Foot Range",
"stock_value": 3
},
{
"product_id": "8f00ae9c-7db1-4fad-901c-c00461ce82c5",
"description": "Sump Pump, 1/2 HP, Submersible",
"stock_value": 8
},
{
"product_id": "c9944a24-f28a-4c30-9a7d-53986c0bb45e",
"description": "Wall Mount Shelving, 48 inches, White",
"stock_value": 13
},
{
"product_id": "f49e05ac-b762-4341-aa2b-42675a80d2b4",
"description": "Workbench, Folding, Portable",
"stock_value": 4
},
{
"product_id": "e1dea412-cf73-4022-a71c-0e47119ee0fd",
"description": "Smoke Detector, Battery Operated",
"stock_value": 11
},
{
"product_id": "891830d6-0f28-4564-83ad-519c9b8be7d0",
"description": "Paint Brush Set, Synthetic Bristles, 5-Piece",
"stock_value": 15
},
{
"product_id": "676edafa-d16d-4d27-9372-ff59b2dd55c8",
"description": "Garden Soil, Organic, 2 Cubic Feet Bag",
"stock_value": 0
},
{
"product_id": "e8ea32a4-43d6-4f5c-a6b9-1abfb9244176",
"description": "Sandpaper, Assorted Grits, 20-Pack",
"stock_value": 15
},
{
"product_id": "16e1cb4d-e11e-4ba8-964c-076a7006cdfd",
"description": "Tile Cutter, Manual, 24 inch",
"stock_value": 9
},
{
"product_id": "298c42ba-9361-4e0b-bc00-ca53a6062bf1",
"description": "Window Air Conditioner, 5000 BTU",
"stock_value": 1
},
{
"product_id": "20d7e14d-87af-4c8a-9aa7-8367f7cdf803",
"description": "Window Air Conditioner, 5000 BTU",
"stock_value": 1
},
{
"product_id": "246aa378-3126-4be3-971b-4ba9355a7595",
"description": "Insulation Roll, Fiberglass, R-30",
"stock_value": 6
},
{
"product_id": "af8b8560-c62d-4d5e-9ed6-2440dd429647",
"description": "Caulk, Silicone, Waterproof, Clear, 10 oz Tube",
"stock_value": 18
},
{
"product_id": "c6629cb3-4e0a-4060-aa97-68d716712ff6",
"description": "Shovel, Round Point, Fiberglass Handle",
"stock_value": 6
},
{
"product_id": "190c056a-c356-46a4-92b1-9019372953ee",
"description": "Thermostat, Programmable, 7-Day",
"stock_value": 11
},
{
"product_id": "644cf5fa-89d1-4c8e-8a65-de0b6be721f6",
"description": "Insulation Roll, Fiberglass, R-30",
"stock_value": 6
},
{
"product_id": "fb28cc67-375d-4c04-9850-bf91eec10fbf",
"description": "Smoke Detector, Battery Operated",
"stock_value": 11
},
{
"product_id": "6171e819-21d6-4a85-bc67-1c17edc10b58",
"description": "Screwdriver Set, Phillips and Flathead, 6-Piece",
"stock_value": 18
},
{
"product_id": "bc087d6d-efd0-4a58-b2a3-d523ab1473ac",
"description": "Plywood Sheet, 4x8 Feet, 3/4 Inch Thick",
"stock_value": 14
}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment