[{"data":1,"prerenderedAt":2248},["ShallowReactive",2],{"blog-en-/en/blog/aws-bedrock-industrial-generative-ai":3},{"id":4,"title":5,"body":6,"description":2233,"extension":2234,"meta":2235,"navigation":346,"path":2244,"seo":2245,"stem":2246,"__hash__":2247},"en_blog/en/blog/aws-bedrock-industrial-generative-ai.md","Generative AI in Industrial Data with AWS Bedrock",{"type":7,"value":8,"toc":2200},"minimark",[9,14,30,44,48,53,58,163,167,280,284,295,299,303,310,314,824,829,921,925,928,935,939,1232,1236,1239,1242,1246,1538,1542,1546,1553,1911,1915,1919,1983,1987,1993,2006,2011,2017,2023,2027,2031,2098,2103,2117,2121,2126,2153,2159,2167,2171,2196],[10,11,13],"h2",{"id":12},"introduction","Introduction",[15,16,17,21,22,25,26,29],"p",{},[18,19,20],"strong",{},"Generative AI"," is revolutionizing not only chatbots and content generation but also ",[18,23,24],{},"industrial data analysis",". ",[18,27,28],{},"AWS Bedrock"," provides serverless access to advanced foundation models like Claude, Llama, and Amazon Titan without model training.",[15,31,32,33,38,39,43],{},"In this article, we examine how to analyze data from our ",[34,35,37],"a",{"href":36},"/en/products/zma-data-acquisition","ZMA Data Acquisition"," and ",[34,40,42],{"href":41},"/en/products/gdt-digital-transmitter","GDT Digital Transmitter"," devices using AWS Bedrock for predictive maintenance and reporting.",[10,45,47],{"id":46},"what-is-aws-bedrock","What is AWS Bedrock?",[15,49,50,52],{},[18,51,28],{}," is a fully managed service offering access to foundation models (FMs) from leading AI companies via API.",[54,55,57],"h3",{"id":56},"available-models","Available Models",[59,60,61,80],"table",{},[62,63,64],"thead",{},[65,66,67,71,74,77],"tr",{},[68,69,70],"th",{},"Model",[68,72,73],{},"Provider",[68,75,76],{},"Parameters",[68,78,79],{},"Strengths",[81,82,83,100,115,131,147],"tbody",{},[65,84,85,91,94,97],{},[86,87,88],"td",{},[18,89,90],{},"Claude 3.5 Sonnet",[86,92,93],{},"Anthropic",[86,95,96],{},"175B",[86,98,99],{},"Complex reasoning, coding",[65,101,102,107,109,112],{},[86,103,104],{},[18,105,106],{},"Claude 3 Haiku",[86,108,93],{},[86,110,111],{},"20B",[86,113,114],{},"Fast, cost-effective",[65,116,117,122,125,128],{},[86,118,119],{},[18,120,121],{},"Llama 3.1",[86,123,124],{},"Meta",[86,126,127],{},"8B-405B",[86,129,130],{},"Open source, multilingual",[65,132,133,138,141,144],{},[86,134,135],{},[18,136,137],{},"Amazon Titan",[86,139,140],{},"AWS",[86,142,143],{},"-",[86,145,146],{},"Text generation, embedding",[65,148,149,154,157,160],{},[86,150,151],{},[18,152,153],{},"Mistral Large",[86,155,156],{},"Mistral AI",[86,158,159],{},"123B",[86,161,162],{},"Multilingual, specialized",[54,164,166],{"id":165},"bedrock-vs-alternatives","Bedrock vs Alternatives",[59,168,169,184],{},[62,170,171],{},[65,172,173,176,178,181],{},[68,174,175],{},"Feature",[68,177,28],{},[68,179,180],{},"OpenAI API",[68,182,183],{},"Self-Hosted (Ollama)",[81,185,186,202,218,234,249,265],{},[65,187,188,193,196,199],{},[86,189,190],{},[18,191,192],{},"Deployment",[86,194,195],{},"Serverless",[86,197,198],{},"Cloud API",[86,200,201],{},"Local infrastructure",[65,203,204,209,212,215],{},[86,205,206],{},[18,207,208],{},"Data Privacy",[86,210,211],{},"AWS VPC",[86,213,214],{},"Data leaves facility",[86,216,217],{},"Fully local",[65,219,220,225,228,231],{},[86,221,222],{},[18,223,224],{},"Latency",[86,226,227],{},"200-500ms",[86,229,230],{},"300-800ms",[86,232,233],{},"50-200ms",[65,235,236,241,244,246],{},[86,237,238],{},[18,239,240],{},"Cost",[86,242,243],{},"Pay-per-token",[86,245,243],{},[86,247,248],{},"Hardware only",[65,250,251,256,259,262],{},[86,252,253],{},[18,254,255],{},"Model Selection",[86,257,258],{},"10+ models",[86,260,261],{},"5 models",[86,263,264],{},"Limited (7B-13B)",[65,266,267,272,275,277],{},[86,268,269],{},[18,270,271],{},"Fine-tuning",[86,273,274],{},"✅ Supported",[86,276,274],{},[86,278,279],{},"⚠️ Manual",[10,281,283],{"id":282},"system-architecture","System Architecture",[285,286,291],"pre",{"className":287,"code":289,"language":290},[288],"language-text","┌───────────────────────────────────────────────┐\n│           Factory Network                     │\n│                                               │\n│  ┌─────────┐   Modbus   ┌──────────────┐     │\n│  │ ZMA/GDT │───────────►│  IoT Gateway │     │\n│  │ Devices │            └──────┬───────┘     │\n└────────────────────────────────┼─────────────┘\n                                 │ MQTT/TLS\n                                 ▼\n                    ┌────────────────────────┐\n                    │      AWS Cloud         │\n                    │                        │\n                    │  ┌──────────────────┐  │\n                    │  │   IoT Core       │  │\n                    │  └────────┬─────────┘  │\n                    │           │            │\n                    │  ┌────────▼─────────┐  │\n                    │  │   Timestream     │  │\n                    │  │   (Raw Data)     │  │\n                    │  └────────┬─────────┘  │\n                    │           │            │\n                    │  ┌────────▼─────────┐  │\n                    │  │   Lambda         │  │\n                    │  │   (Processor)    │  │\n                    │  └────────┬─────────┘  │\n                    │           │            │\n                    │  ┌────────▼─────────┐  │\n                    │  │  AWS Bedrock     │  │\n                    │  │                  │  │\n                    │  │  • Claude 3.5    │  │\n                    │  │  • Llama 3.1     │  │\n                    │  │  • Titan         │  │\n                    │  └────────┬─────────┘  │\n                    │           │            │\n                    │  ┌────────▼─────────┐  │\n                    │  │   S3 Bucket      │  │\n                    │  │   (Reports)      │  │\n                    │  └──────────────────┘  │\n                    └────────────────────────┘\n","text",[292,293,289],"code",{"__ignoreMap":294},"",[10,296,298],{"id":297},"application-1-anomaly-detection-with-ai","Application 1: Anomaly Detection with AI",[54,300,302],{"id":301},"scenario","Scenario",[15,304,305,306,309],{},"Detect abnormal patterns in loadcell data from ",[34,307,308],{"href":41},"GDT"," that might indicate tank tilt or sensor failure.",[54,311,313],{"id":312},"lambda-function-with-claude","Lambda Function with Claude",[285,315,319],{"className":316,"code":317,"language":318,"meta":294,"style":294},"language-python shiki shiki-themes github-light github-dark","import boto3\nimport json\nfrom datetime import datetime, timedelta\n\nbedrock = boto3.client('bedrock-runtime', region_name='eu-west-1')\ntimestream = boto3.client('timestream-query', region_name='eu-west-1')\n\ndef lambda_handler(event, context):\n    # Query last hour's data from Timestream\n    tank_id = event['tank_id']\n    query = f\"\"\"\n        SELECT\n            time,\n            measure_value::double as weight\n        FROM\n            \"FactoryData\".\"TankWeights\"\n        WHERE\n            tank_id = '{tank_id}'\n            AND time > ago(1h)\n        ORDER BY\n            time DESC\n    \"\"\"\n\n    result = timestream.query(QueryString=query)\n    weights = [float(row['Data'][1]['ScalarValue'])\n               for row in result['Rows']]\n\n    # Create prompt for Claude\n    prompt = f\"\"\"\nYou are an industrial automation expert analyzing loadcell data.\n\nTank {tank_id} weight measurements (last hour, newest first):\n{json.dumps(weights[:20], indent=2)}\n\nStatistical summary:\n- Mean: {sum(weights)/len(weights):.2f} kg\n- Min: {min(weights):.2f} kg\n- Max: {max(weights):.2f} kg\n- Std Dev: {(sum([(x-sum(weights)/len(weights))**2 for x in weights])/len(weights))**0.5:.2f} kg\n\nAnalyze this data and respond in JSON format:\n{{\n  \"anomaly_detected\": true/false,\n  \"anomaly_type\": \"sudden_drop|gradual_drift|oscillation|normal\",\n  \"severity\": \"low|medium|high|critical\",\n  \"probable_cause\": \"explanation\",\n  \"recommended_action\": \"specific action\",\n  \"confidence\": 0.0-1.0\n}}\n\"\"\"\n\n    # Call Claude 3 Haiku (cost-effective)\n    response = bedrock.invoke_model(\n        modelId='anthropic.claude-3-haiku-20240307-v1:0',\n        contentType='application/json',\n        accept='application/json',\n        body=json.dumps({\n            \"anthropic_version\": \"bedrock-2023-05-31\",\n            \"max_tokens\": 1000,\n            \"messages\": [\n                {\n                    \"role\": \"user\",\n                    \"content\": prompt\n                }\n            ]\n        })\n    )\n\n    # Parse response\n    response_body = json.loads(response['body'].read())\n    analysis = json.loads(response_body['content'][0]['text'])\n\n    # Send SNS alert if critical\n    if analysis['severity'] in ['high', 'critical']:\n        sns = boto3.client('sns')\n        sns.publish(\n            TopicArn='arn:aws:sns:eu-west-1:xxx:factory-alerts',\n            Subject=f\"Critical Anomaly: Tank {tank_id}\",\n            Message=json.dumps(analysis, indent=2)\n        )\n\n    return {\n        'statusCode': 200,\n        'body': json.dumps(analysis)\n    }\n","python",[292,320,321,329,335,341,348,354,360,365,371,377,383,389,395,401,407,413,419,425,431,437,443,449,455,460,466,472,478,483,489,495,501,506,512,518,523,529,535,541,547,553,558,564,570,576,582,588,594,600,606,612,618,623,629,635,641,647,653,659,665,671,677,683,689,695,701,707,713,719,724,730,736,742,747,753,759,765,771,777,783,789,795,800,806,812,818],{"__ignoreMap":294},[322,323,326],"span",{"class":324,"line":325},"line",1,[322,327,328],{},"import boto3\n",[322,330,332],{"class":324,"line":331},2,[322,333,334],{},"import json\n",[322,336,338],{"class":324,"line":337},3,[322,339,340],{},"from datetime import datetime, timedelta\n",[322,342,344],{"class":324,"line":343},4,[322,345,347],{"emptyLinePlaceholder":346},true,"\n",[322,349,351],{"class":324,"line":350},5,[322,352,353],{},"bedrock = boto3.client('bedrock-runtime', region_name='eu-west-1')\n",[322,355,357],{"class":324,"line":356},6,[322,358,359],{},"timestream = boto3.client('timestream-query', region_name='eu-west-1')\n",[322,361,363],{"class":324,"line":362},7,[322,364,347],{"emptyLinePlaceholder":346},[322,366,368],{"class":324,"line":367},8,[322,369,370],{},"def lambda_handler(event, context):\n",[322,372,374],{"class":324,"line":373},9,[322,375,376],{},"    # Query last hour's data from Timestream\n",[322,378,380],{"class":324,"line":379},10,[322,381,382],{},"    tank_id = event['tank_id']\n",[322,384,386],{"class":324,"line":385},11,[322,387,388],{},"    query = f\"\"\"\n",[322,390,392],{"class":324,"line":391},12,[322,393,394],{},"        SELECT\n",[322,396,398],{"class":324,"line":397},13,[322,399,400],{},"            time,\n",[322,402,404],{"class":324,"line":403},14,[322,405,406],{},"            measure_value::double as weight\n",[322,408,410],{"class":324,"line":409},15,[322,411,412],{},"        FROM\n",[322,414,416],{"class":324,"line":415},16,[322,417,418],{},"            \"FactoryData\".\"TankWeights\"\n",[322,420,422],{"class":324,"line":421},17,[322,423,424],{},"        WHERE\n",[322,426,428],{"class":324,"line":427},18,[322,429,430],{},"            tank_id = '{tank_id}'\n",[322,432,434],{"class":324,"line":433},19,[322,435,436],{},"            AND time > ago(1h)\n",[322,438,440],{"class":324,"line":439},20,[322,441,442],{},"        ORDER BY\n",[322,444,446],{"class":324,"line":445},21,[322,447,448],{},"            time DESC\n",[322,450,452],{"class":324,"line":451},22,[322,453,454],{},"    \"\"\"\n",[322,456,458],{"class":324,"line":457},23,[322,459,347],{"emptyLinePlaceholder":346},[322,461,463],{"class":324,"line":462},24,[322,464,465],{},"    result = timestream.query(QueryString=query)\n",[322,467,469],{"class":324,"line":468},25,[322,470,471],{},"    weights = [float(row['Data'][1]['ScalarValue'])\n",[322,473,475],{"class":324,"line":474},26,[322,476,477],{},"               for row in result['Rows']]\n",[322,479,481],{"class":324,"line":480},27,[322,482,347],{"emptyLinePlaceholder":346},[322,484,486],{"class":324,"line":485},28,[322,487,488],{},"    # Create prompt for Claude\n",[322,490,492],{"class":324,"line":491},29,[322,493,494],{},"    prompt = f\"\"\"\n",[322,496,498],{"class":324,"line":497},30,[322,499,500],{},"You are an industrial automation expert analyzing loadcell data.\n",[322,502,504],{"class":324,"line":503},31,[322,505,347],{"emptyLinePlaceholder":346},[322,507,509],{"class":324,"line":508},32,[322,510,511],{},"Tank {tank_id} weight measurements (last hour, newest first):\n",[322,513,515],{"class":324,"line":514},33,[322,516,517],{},"{json.dumps(weights[:20], indent=2)}\n",[322,519,521],{"class":324,"line":520},34,[322,522,347],{"emptyLinePlaceholder":346},[322,524,526],{"class":324,"line":525},35,[322,527,528],{},"Statistical summary:\n",[322,530,532],{"class":324,"line":531},36,[322,533,534],{},"- Mean: {sum(weights)/len(weights):.2f} kg\n",[322,536,538],{"class":324,"line":537},37,[322,539,540],{},"- Min: {min(weights):.2f} kg\n",[322,542,544],{"class":324,"line":543},38,[322,545,546],{},"- Max: {max(weights):.2f} kg\n",[322,548,550],{"class":324,"line":549},39,[322,551,552],{},"- Std Dev: {(sum([(x-sum(weights)/len(weights))**2 for x in weights])/len(weights))**0.5:.2f} kg\n",[322,554,556],{"class":324,"line":555},40,[322,557,347],{"emptyLinePlaceholder":346},[322,559,561],{"class":324,"line":560},41,[322,562,563],{},"Analyze this data and respond in JSON format:\n",[322,565,567],{"class":324,"line":566},42,[322,568,569],{},"{{\n",[322,571,573],{"class":324,"line":572},43,[322,574,575],{},"  \"anomaly_detected\": true/false,\n",[322,577,579],{"class":324,"line":578},44,[322,580,581],{},"  \"anomaly_type\": \"sudden_drop|gradual_drift|oscillation|normal\",\n",[322,583,585],{"class":324,"line":584},45,[322,586,587],{},"  \"severity\": \"low|medium|high|critical\",\n",[322,589,591],{"class":324,"line":590},46,[322,592,593],{},"  \"probable_cause\": \"explanation\",\n",[322,595,597],{"class":324,"line":596},47,[322,598,599],{},"  \"recommended_action\": \"specific action\",\n",[322,601,603],{"class":324,"line":602},48,[322,604,605],{},"  \"confidence\": 0.0-1.0\n",[322,607,609],{"class":324,"line":608},49,[322,610,611],{},"}}\n",[322,613,615],{"class":324,"line":614},50,[322,616,617],{},"\"\"\"\n",[322,619,621],{"class":324,"line":620},51,[322,622,347],{"emptyLinePlaceholder":346},[322,624,626],{"class":324,"line":625},52,[322,627,628],{},"    # Call Claude 3 Haiku (cost-effective)\n",[322,630,632],{"class":324,"line":631},53,[322,633,634],{},"    response = bedrock.invoke_model(\n",[322,636,638],{"class":324,"line":637},54,[322,639,640],{},"        modelId='anthropic.claude-3-haiku-20240307-v1:0',\n",[322,642,644],{"class":324,"line":643},55,[322,645,646],{},"        contentType='application/json',\n",[322,648,650],{"class":324,"line":649},56,[322,651,652],{},"        accept='application/json',\n",[322,654,656],{"class":324,"line":655},57,[322,657,658],{},"        body=json.dumps({\n",[322,660,662],{"class":324,"line":661},58,[322,663,664],{},"            \"anthropic_version\": \"bedrock-2023-05-31\",\n",[322,666,668],{"class":324,"line":667},59,[322,669,670],{},"            \"max_tokens\": 1000,\n",[322,672,674],{"class":324,"line":673},60,[322,675,676],{},"            \"messages\": [\n",[322,678,680],{"class":324,"line":679},61,[322,681,682],{},"                {\n",[322,684,686],{"class":324,"line":685},62,[322,687,688],{},"                    \"role\": \"user\",\n",[322,690,692],{"class":324,"line":691},63,[322,693,694],{},"                    \"content\": prompt\n",[322,696,698],{"class":324,"line":697},64,[322,699,700],{},"                }\n",[322,702,704],{"class":324,"line":703},65,[322,705,706],{},"            ]\n",[322,708,710],{"class":324,"line":709},66,[322,711,712],{},"        })\n",[322,714,716],{"class":324,"line":715},67,[322,717,718],{},"    )\n",[322,720,722],{"class":324,"line":721},68,[322,723,347],{"emptyLinePlaceholder":346},[322,725,727],{"class":324,"line":726},69,[322,728,729],{},"    # Parse response\n",[322,731,733],{"class":324,"line":732},70,[322,734,735],{},"    response_body = json.loads(response['body'].read())\n",[322,737,739],{"class":324,"line":738},71,[322,740,741],{},"    analysis = json.loads(response_body['content'][0]['text'])\n",[322,743,745],{"class":324,"line":744},72,[322,746,347],{"emptyLinePlaceholder":346},[322,748,750],{"class":324,"line":749},73,[322,751,752],{},"    # Send SNS alert if critical\n",[322,754,756],{"class":324,"line":755},74,[322,757,758],{},"    if analysis['severity'] in ['high', 'critical']:\n",[322,760,762],{"class":324,"line":761},75,[322,763,764],{},"        sns = boto3.client('sns')\n",[322,766,768],{"class":324,"line":767},76,[322,769,770],{},"        sns.publish(\n",[322,772,774],{"class":324,"line":773},77,[322,775,776],{},"            TopicArn='arn:aws:sns:eu-west-1:xxx:factory-alerts',\n",[322,778,780],{"class":324,"line":779},78,[322,781,782],{},"            Subject=f\"Critical Anomaly: Tank {tank_id}\",\n",[322,784,786],{"class":324,"line":785},79,[322,787,788],{},"            Message=json.dumps(analysis, indent=2)\n",[322,790,792],{"class":324,"line":791},80,[322,793,794],{},"        )\n",[322,796,798],{"class":324,"line":797},81,[322,799,347],{"emptyLinePlaceholder":346},[322,801,803],{"class":324,"line":802},82,[322,804,805],{},"    return {\n",[322,807,809],{"class":324,"line":808},83,[322,810,811],{},"        'statusCode': 200,\n",[322,813,815],{"class":324,"line":814},84,[322,816,817],{},"        'body': json.dumps(analysis)\n",[322,819,821],{"class":324,"line":820},85,[322,822,823],{},"    }\n",[15,825,826],{},[18,827,828],{},"Example Output:",[285,830,834],{"className":831,"code":832,"language":833,"meta":294,"style":294},"language-json shiki shiki-themes github-light github-dark","{\n  \"anomaly_detected\": true,\n  \"anomaly_type\": \"sudden_drop\",\n  \"severity\": \"high\",\n  \"probable_cause\": \"Weight dropped 450 kg in 2 minutes, indicating possible valve opening or leak\",\n  \"recommended_action\": \"Inspect Tank 2 outlet valve and piping for leaks. Check flow meter readings.\",\n  \"confidence\": 0.89\n}\n","json",[292,835,836,842,857,870,882,894,906,916],{"__ignoreMap":294},[322,837,838],{"class":324,"line":325},[322,839,841],{"class":840},"sVt8B","{\n",[322,843,844,848,851,854],{"class":324,"line":331},[322,845,847],{"class":846},"sj4cs","  \"anomaly_detected\"",[322,849,850],{"class":840},": ",[322,852,853],{"class":846},"true",[322,855,856],{"class":840},",\n",[322,858,859,862,864,868],{"class":324,"line":337},[322,860,861],{"class":846},"  \"anomaly_type\"",[322,863,850],{"class":840},[322,865,867],{"class":866},"sZZnC","\"sudden_drop\"",[322,869,856],{"class":840},[322,871,872,875,877,880],{"class":324,"line":343},[322,873,874],{"class":846},"  \"severity\"",[322,876,850],{"class":840},[322,878,879],{"class":866},"\"high\"",[322,881,856],{"class":840},[322,883,884,887,889,892],{"class":324,"line":350},[322,885,886],{"class":846},"  \"probable_cause\"",[322,888,850],{"class":840},[322,890,891],{"class":866},"\"Weight dropped 450 kg in 2 minutes, indicating possible valve opening or leak\"",[322,893,856],{"class":840},[322,895,896,899,901,904],{"class":324,"line":356},[322,897,898],{"class":846},"  \"recommended_action\"",[322,900,850],{"class":840},[322,902,903],{"class":866},"\"Inspect Tank 2 outlet valve and piping for leaks. Check flow meter readings.\"",[322,905,856],{"class":840},[322,907,908,911,913],{"class":324,"line":362},[322,909,910],{"class":846},"  \"confidence\"",[322,912,850],{"class":840},[322,914,915],{"class":846},"0.89\n",[322,917,918],{"class":324,"line":367},[322,919,920],{"class":840},"}\n",[10,922,924],{"id":923},"application-2-natural-language-querying","Application 2: Natural Language Querying",[54,926,302],{"id":927},"scenario-1",[15,929,930,931],{},"Operations manager asks: ",[932,933,934],"em",{},"\"Which tank had the highest fill rate yesterday?\"",[54,936,938],{"id":937},"text-to-sql-with-claude","Text-to-SQL with Claude",[285,940,942],{"className":316,"code":941,"language":318,"meta":294,"style":294},"def natural_language_to_sql(question, table_schema):\n    \"\"\"Convert natural language to Timestream SQL\"\"\"\n\n    prompt = f\"\"\"\nYou are an expert in AWS Timestream SQL. Convert the user's question to a valid SQL query.\n\nDatabase Schema:\nTable: FactoryData.TankWeights\nColumns:\n- tank_id (VARCHAR): Tank identifier (1, 2, 3, etc.)\n- time (TIMESTAMP): Measurement timestamp\n- measure_name (VARCHAR): Metric name\n- measure_value (DOUBLE): Metric value\n\nUser Question: \"{question}\"\n\nRequirements:\n1. Use Timestream-specific functions (ago(), bin(), etc.)\n2. Return only the SQL query, no explanations\n3. Use appropriate time filters\n\nSQL Query:\n\"\"\"\n\n    response = bedrock.invoke_model(\n        modelId='anthropic.claude-3-sonnet-20240229-v1:0',\n        body=json.dumps({\n            \"anthropic_version\": \"bedrock-2023-05-31\",\n            \"max_tokens\": 500,\n            \"messages\": [{\"role\": \"user\", \"content\": prompt}]\n        })\n    )\n\n    sql_query = json.loads(response['body'].read())['content'][0]['text']\n    return sql_query.strip()\n\n# Example usage\nquestion = \"Which tank had the highest fill rate yesterday?\"\nsql = natural_language_to_sql(question, schema)\n\nprint(sql)\n# Output:\n# WITH hourly_avg AS (\n#   SELECT\n#     tank_id,\n#     bin(time, 1h) as hour_bin,\n#     AVG(measure_value::double) as avg_weight\n#   FROM \"FactoryData\".\"TankWeights\"\n#   WHERE time BETWEEN ago(48h) AND ago(24h)\n#   GROUP BY tank_id, bin(time, 1h)\n# )\n# SELECT\n#   tank_id,\n#   MAX(avg_weight) - MIN(avg_weight) as total_fill\n# FROM hourly_avg\n# GROUP BY tank_id\n# ORDER BY total_fill DESC\n# LIMIT 1\n\n# Execute the generated SQL\nresult = timestream.query(QueryString=sql)\n",[292,943,944,949,954,958,962,967,971,976,981,986,991,996,1001,1006,1010,1015,1019,1024,1029,1034,1039,1043,1048,1052,1056,1060,1065,1069,1073,1078,1083,1087,1091,1095,1100,1105,1109,1114,1119,1124,1128,1133,1138,1143,1148,1153,1158,1163,1168,1173,1178,1183,1188,1193,1198,1203,1208,1213,1218,1222,1227],{"__ignoreMap":294},[322,945,946],{"class":324,"line":325},[322,947,948],{},"def natural_language_to_sql(question, table_schema):\n",[322,950,951],{"class":324,"line":331},[322,952,953],{},"    \"\"\"Convert natural language to Timestream SQL\"\"\"\n",[322,955,956],{"class":324,"line":337},[322,957,347],{"emptyLinePlaceholder":346},[322,959,960],{"class":324,"line":343},[322,961,494],{},[322,963,964],{"class":324,"line":350},[322,965,966],{},"You are an expert in AWS Timestream SQL. Convert the user's question to a valid SQL query.\n",[322,968,969],{"class":324,"line":356},[322,970,347],{"emptyLinePlaceholder":346},[322,972,973],{"class":324,"line":362},[322,974,975],{},"Database Schema:\n",[322,977,978],{"class":324,"line":367},[322,979,980],{},"Table: FactoryData.TankWeights\n",[322,982,983],{"class":324,"line":373},[322,984,985],{},"Columns:\n",[322,987,988],{"class":324,"line":379},[322,989,990],{},"- tank_id (VARCHAR): Tank identifier (1, 2, 3, etc.)\n",[322,992,993],{"class":324,"line":385},[322,994,995],{},"- time (TIMESTAMP): Measurement timestamp\n",[322,997,998],{"class":324,"line":391},[322,999,1000],{},"- measure_name (VARCHAR): Metric name\n",[322,1002,1003],{"class":324,"line":397},[322,1004,1005],{},"- measure_value (DOUBLE): Metric value\n",[322,1007,1008],{"class":324,"line":403},[322,1009,347],{"emptyLinePlaceholder":346},[322,1011,1012],{"class":324,"line":409},[322,1013,1014],{},"User Question: \"{question}\"\n",[322,1016,1017],{"class":324,"line":415},[322,1018,347],{"emptyLinePlaceholder":346},[322,1020,1021],{"class":324,"line":421},[322,1022,1023],{},"Requirements:\n",[322,1025,1026],{"class":324,"line":427},[322,1027,1028],{},"1. Use Timestream-specific functions (ago(), bin(), etc.)\n",[322,1030,1031],{"class":324,"line":433},[322,1032,1033],{},"2. Return only the SQL query, no explanations\n",[322,1035,1036],{"class":324,"line":439},[322,1037,1038],{},"3. Use appropriate time filters\n",[322,1040,1041],{"class":324,"line":445},[322,1042,347],{"emptyLinePlaceholder":346},[322,1044,1045],{"class":324,"line":451},[322,1046,1047],{},"SQL Query:\n",[322,1049,1050],{"class":324,"line":457},[322,1051,617],{},[322,1053,1054],{"class":324,"line":462},[322,1055,347],{"emptyLinePlaceholder":346},[322,1057,1058],{"class":324,"line":468},[322,1059,634],{},[322,1061,1062],{"class":324,"line":474},[322,1063,1064],{},"        modelId='anthropic.claude-3-sonnet-20240229-v1:0',\n",[322,1066,1067],{"class":324,"line":480},[322,1068,658],{},[322,1070,1071],{"class":324,"line":485},[322,1072,664],{},[322,1074,1075],{"class":324,"line":491},[322,1076,1077],{},"            \"max_tokens\": 500,\n",[322,1079,1080],{"class":324,"line":497},[322,1081,1082],{},"            \"messages\": [{\"role\": \"user\", \"content\": prompt}]\n",[322,1084,1085],{"class":324,"line":503},[322,1086,712],{},[322,1088,1089],{"class":324,"line":508},[322,1090,718],{},[322,1092,1093],{"class":324,"line":514},[322,1094,347],{"emptyLinePlaceholder":346},[322,1096,1097],{"class":324,"line":520},[322,1098,1099],{},"    sql_query = json.loads(response['body'].read())['content'][0]['text']\n",[322,1101,1102],{"class":324,"line":525},[322,1103,1104],{},"    return sql_query.strip()\n",[322,1106,1107],{"class":324,"line":531},[322,1108,347],{"emptyLinePlaceholder":346},[322,1110,1111],{"class":324,"line":537},[322,1112,1113],{},"# Example usage\n",[322,1115,1116],{"class":324,"line":543},[322,1117,1118],{},"question = \"Which tank had the highest fill rate yesterday?\"\n",[322,1120,1121],{"class":324,"line":549},[322,1122,1123],{},"sql = natural_language_to_sql(question, schema)\n",[322,1125,1126],{"class":324,"line":555},[322,1127,347],{"emptyLinePlaceholder":346},[322,1129,1130],{"class":324,"line":560},[322,1131,1132],{},"print(sql)\n",[322,1134,1135],{"class":324,"line":566},[322,1136,1137],{},"# Output:\n",[322,1139,1140],{"class":324,"line":572},[322,1141,1142],{},"# WITH hourly_avg AS (\n",[322,1144,1145],{"class":324,"line":578},[322,1146,1147],{},"#   SELECT\n",[322,1149,1150],{"class":324,"line":584},[322,1151,1152],{},"#     tank_id,\n",[322,1154,1155],{"class":324,"line":590},[322,1156,1157],{},"#     bin(time, 1h) as hour_bin,\n",[322,1159,1160],{"class":324,"line":596},[322,1161,1162],{},"#     AVG(measure_value::double) as avg_weight\n",[322,1164,1165],{"class":324,"line":602},[322,1166,1167],{},"#   FROM \"FactoryData\".\"TankWeights\"\n",[322,1169,1170],{"class":324,"line":608},[322,1171,1172],{},"#   WHERE time BETWEEN ago(48h) AND ago(24h)\n",[322,1174,1175],{"class":324,"line":614},[322,1176,1177],{},"#   GROUP BY tank_id, bin(time, 1h)\n",[322,1179,1180],{"class":324,"line":620},[322,1181,1182],{},"# )\n",[322,1184,1185],{"class":324,"line":625},[322,1186,1187],{},"# SELECT\n",[322,1189,1190],{"class":324,"line":631},[322,1191,1192],{},"#   tank_id,\n",[322,1194,1195],{"class":324,"line":637},[322,1196,1197],{},"#   MAX(avg_weight) - MIN(avg_weight) as total_fill\n",[322,1199,1200],{"class":324,"line":643},[322,1201,1202],{},"# FROM hourly_avg\n",[322,1204,1205],{"class":324,"line":649},[322,1206,1207],{},"# GROUP BY tank_id\n",[322,1209,1210],{"class":324,"line":655},[322,1211,1212],{},"# ORDER BY total_fill DESC\n",[322,1214,1215],{"class":324,"line":661},[322,1216,1217],{},"# LIMIT 1\n",[322,1219,1220],{"class":324,"line":667},[322,1221,347],{"emptyLinePlaceholder":346},[322,1223,1224],{"class":324,"line":673},[322,1225,1226],{},"# Execute the generated SQL\n",[322,1228,1229],{"class":324,"line":679},[322,1230,1231],{},"result = timestream.query(QueryString=sql)\n",[10,1233,1235],{"id":1234},"application-3-automated-maintenance-reports","Application 3: Automated Maintenance Reports",[54,1237,302],{"id":1238},"scenario-2",[15,1240,1241],{},"Generate weekly maintenance report summarizing all tanks' status.",[54,1243,1245],{"id":1244},"report-generation-with-claude","Report Generation with Claude",[285,1247,1249],{"className":316,"code":1248,"language":318,"meta":294,"style":294},"def generate_maintenance_report(start_date, end_date):\n    \"\"\"Generate comprehensive weekly report\"\"\"\n\n    # Collect data from multiple sources\n    tank_data = get_tank_statistics(start_date, end_date)\n    alarms = get_alarm_history(start_date, end_date)\n    calibrations = get_calibration_log(start_date, end_date)\n\n    prompt = f\"\"\"\nGenerate a professional weekly maintenance report for a milk processing facility.\n\nData Summary:\n{json.dumps(tank_data, indent=2)}\n\nAlarms:\n{json.dumps(alarms, indent=2)}\n\nCalibrations:\n{json.dumps(calibrations, indent=2)}\n\nReport Structure:\n1. Executive Summary\n2. Tank-by-Tank Status\n3. Anomalies and Alarms\n4. Maintenance Activities\n5. Recommendations for Next Week\n\nFormat as HTML for email distribution.\n\"\"\"\n\n    response = bedrock.invoke_model(\n        modelId='anthropic.claude-3-sonnet-20240229-v1:0',\n        body=json.dumps({\n            \"anthropic_version\": \"bedrock-2023-05-31\",\n            \"max_tokens\": 4000,\n            \"messages\": [{\"role\": \"user\", \"content\": prompt}]\n        })\n    )\n\n    report_html = json.loads(response['body'].read())['content'][0]['text']\n\n    # Save to S3\n    s3 = boto3.client('s3')\n    s3.put_object(\n        Bucket='factory-reports',\n        Key=f'maintenance/weekly_{start_date}.html',\n        Body=report_html,\n        ContentType='text/html'\n    )\n\n    # Email report\n    ses = boto3.client('ses')\n    ses.send_email(\n        Source='reports@factory.com',\n        Destination={'ToAddresses': ['maintenance@factory.com']},\n        Message={\n            'Subject': {'Data': f'Weekly Report: {start_date}'},\n            'Body': {'Html': {'Data': report_html}}\n        }\n    )\n\n    return report_html\n",[292,1250,1251,1256,1261,1265,1270,1275,1280,1285,1289,1293,1298,1302,1307,1312,1316,1321,1326,1330,1335,1340,1344,1349,1354,1359,1364,1369,1374,1378,1383,1387,1391,1395,1399,1403,1407,1412,1416,1420,1424,1428,1433,1437,1442,1447,1452,1457,1462,1467,1472,1476,1480,1485,1490,1495,1500,1505,1510,1515,1520,1525,1529,1533],{"__ignoreMap":294},[322,1252,1253],{"class":324,"line":325},[322,1254,1255],{},"def generate_maintenance_report(start_date, end_date):\n",[322,1257,1258],{"class":324,"line":331},[322,1259,1260],{},"    \"\"\"Generate comprehensive weekly report\"\"\"\n",[322,1262,1263],{"class":324,"line":337},[322,1264,347],{"emptyLinePlaceholder":346},[322,1266,1267],{"class":324,"line":343},[322,1268,1269],{},"    # Collect data from multiple sources\n",[322,1271,1272],{"class":324,"line":350},[322,1273,1274],{},"    tank_data = get_tank_statistics(start_date, end_date)\n",[322,1276,1277],{"class":324,"line":356},[322,1278,1279],{},"    alarms = get_alarm_history(start_date, end_date)\n",[322,1281,1282],{"class":324,"line":362},[322,1283,1284],{},"    calibrations = get_calibration_log(start_date, end_date)\n",[322,1286,1287],{"class":324,"line":367},[322,1288,347],{"emptyLinePlaceholder":346},[322,1290,1291],{"class":324,"line":373},[322,1292,494],{},[322,1294,1295],{"class":324,"line":379},[322,1296,1297],{},"Generate a professional weekly maintenance report for a milk processing facility.\n",[322,1299,1300],{"class":324,"line":385},[322,1301,347],{"emptyLinePlaceholder":346},[322,1303,1304],{"class":324,"line":391},[322,1305,1306],{},"Data Summary:\n",[322,1308,1309],{"class":324,"line":397},[322,1310,1311],{},"{json.dumps(tank_data, indent=2)}\n",[322,1313,1314],{"class":324,"line":403},[322,1315,347],{"emptyLinePlaceholder":346},[322,1317,1318],{"class":324,"line":409},[322,1319,1320],{},"Alarms:\n",[322,1322,1323],{"class":324,"line":415},[322,1324,1325],{},"{json.dumps(alarms, indent=2)}\n",[322,1327,1328],{"class":324,"line":421},[322,1329,347],{"emptyLinePlaceholder":346},[322,1331,1332],{"class":324,"line":427},[322,1333,1334],{},"Calibrations:\n",[322,1336,1337],{"class":324,"line":433},[322,1338,1339],{},"{json.dumps(calibrations, indent=2)}\n",[322,1341,1342],{"class":324,"line":439},[322,1343,347],{"emptyLinePlaceholder":346},[322,1345,1346],{"class":324,"line":445},[322,1347,1348],{},"Report Structure:\n",[322,1350,1351],{"class":324,"line":451},[322,1352,1353],{},"1. Executive Summary\n",[322,1355,1356],{"class":324,"line":457},[322,1357,1358],{},"2. Tank-by-Tank Status\n",[322,1360,1361],{"class":324,"line":462},[322,1362,1363],{},"3. Anomalies and Alarms\n",[322,1365,1366],{"class":324,"line":468},[322,1367,1368],{},"4. Maintenance Activities\n",[322,1370,1371],{"class":324,"line":474},[322,1372,1373],{},"5. Recommendations for Next Week\n",[322,1375,1376],{"class":324,"line":480},[322,1377,347],{"emptyLinePlaceholder":346},[322,1379,1380],{"class":324,"line":485},[322,1381,1382],{},"Format as HTML for email distribution.\n",[322,1384,1385],{"class":324,"line":491},[322,1386,617],{},[322,1388,1389],{"class":324,"line":497},[322,1390,347],{"emptyLinePlaceholder":346},[322,1392,1393],{"class":324,"line":503},[322,1394,634],{},[322,1396,1397],{"class":324,"line":508},[322,1398,1064],{},[322,1400,1401],{"class":324,"line":514},[322,1402,658],{},[322,1404,1405],{"class":324,"line":520},[322,1406,664],{},[322,1408,1409],{"class":324,"line":525},[322,1410,1411],{},"            \"max_tokens\": 4000,\n",[322,1413,1414],{"class":324,"line":531},[322,1415,1082],{},[322,1417,1418],{"class":324,"line":537},[322,1419,712],{},[322,1421,1422],{"class":324,"line":543},[322,1423,718],{},[322,1425,1426],{"class":324,"line":549},[322,1427,347],{"emptyLinePlaceholder":346},[322,1429,1430],{"class":324,"line":555},[322,1431,1432],{},"    report_html = json.loads(response['body'].read())['content'][0]['text']\n",[322,1434,1435],{"class":324,"line":560},[322,1436,347],{"emptyLinePlaceholder":346},[322,1438,1439],{"class":324,"line":566},[322,1440,1441],{},"    # Save to S3\n",[322,1443,1444],{"class":324,"line":572},[322,1445,1446],{},"    s3 = boto3.client('s3')\n",[322,1448,1449],{"class":324,"line":578},[322,1450,1451],{},"    s3.put_object(\n",[322,1453,1454],{"class":324,"line":584},[322,1455,1456],{},"        Bucket='factory-reports',\n",[322,1458,1459],{"class":324,"line":590},[322,1460,1461],{},"        Key=f'maintenance/weekly_{start_date}.html',\n",[322,1463,1464],{"class":324,"line":596},[322,1465,1466],{},"        Body=report_html,\n",[322,1468,1469],{"class":324,"line":602},[322,1470,1471],{},"        ContentType='text/html'\n",[322,1473,1474],{"class":324,"line":608},[322,1475,718],{},[322,1477,1478],{"class":324,"line":614},[322,1479,347],{"emptyLinePlaceholder":346},[322,1481,1482],{"class":324,"line":620},[322,1483,1484],{},"    # Email report\n",[322,1486,1487],{"class":324,"line":625},[322,1488,1489],{},"    ses = boto3.client('ses')\n",[322,1491,1492],{"class":324,"line":631},[322,1493,1494],{},"    ses.send_email(\n",[322,1496,1497],{"class":324,"line":637},[322,1498,1499],{},"        Source='reports@factory.com',\n",[322,1501,1502],{"class":324,"line":643},[322,1503,1504],{},"        Destination={'ToAddresses': ['maintenance@factory.com']},\n",[322,1506,1507],{"class":324,"line":649},[322,1508,1509],{},"        Message={\n",[322,1511,1512],{"class":324,"line":655},[322,1513,1514],{},"            'Subject': {'Data': f'Weekly Report: {start_date}'},\n",[322,1516,1517],{"class":324,"line":661},[322,1518,1519],{},"            'Body': {'Html': {'Data': report_html}}\n",[322,1521,1522],{"class":324,"line":667},[322,1523,1524],{},"        }\n",[322,1526,1527],{"class":324,"line":673},[322,1528,718],{},[322,1530,1531],{"class":324,"line":679},[322,1532,347],{"emptyLinePlaceholder":346},[322,1534,1535],{"class":324,"line":685},[322,1536,1537],{},"    return report_html\n",[10,1539,1541],{"id":1540},"application-4-rag-for-operation-manuals","Application 4: RAG for Operation Manuals",[54,1543,1545],{"id":1544},"retrieval-augmented-generation-rag","Retrieval Augmented Generation (RAG)",[15,1547,1548,1549,1552],{},"Use ",[18,1550,1551],{},"Knowledge Bases for Amazon Bedrock"," to create a chatbot answering questions from operation manuals.",[285,1554,1556],{"className":316,"code":1555,"language":318,"meta":294,"style":294},"def setup_knowledge_base():\n    \"\"\"Create knowledge base from PDF manuals\"\"\"\n\n    bedrock_agent = boto3.client('bedrock-agent')\n\n    # Create knowledge base\n    kb_response = bedrock_agent.create_knowledge_base(\n        name='FactoryOperationManuals',\n        roleArn='arn:aws:iam::xxx:role/BedrockKBRole',\n        knowledgeBaseConfiguration={\n            'type': 'VECTOR',\n            'vectorKnowledgeBaseConfiguration': {\n                'embeddingModelArn': 'arn:aws:bedrock:eu-west-1::foundation-model/amazon.titan-embed-text-v1'\n            }\n        },\n        storageConfiguration={\n            'type': 'OPENSEARCH_SERVERLESS',\n            'opensearchServerlessConfiguration': {\n                'collectionArn': 'arn:aws:aoss:eu-west-1:xxx:collection/factory-kb',\n                'vectorIndexName': 'factory-docs',\n                'fieldMapping': {\n                    'vectorField': 'vector',\n                    'textField': 'text',\n                    'metadataField': 'metadata'\n                }\n            }\n        }\n    )\n\n    kb_id = kb_response['knowledgeBase']['knowledgeBaseId']\n\n    # Add data source (S3 bucket with PDFs)\n    bedrock_agent.create_data_source(\n        knowledgeBaseId=kb_id,\n        name='OperationManualsPDF',\n        dataSourceConfiguration={\n            'type': 'S3',\n            's3Configuration': {\n                'bucketArn': 'arn:aws:s3:::factory-manuals'\n            }\n        }\n    )\n\n    return kb_id\n\ndef query_knowledge_base(kb_id, question):\n    \"\"\"Query operation manuals\"\"\"\n\n    bedrock_agent_runtime = boto3.client('bedrock-agent-runtime')\n\n    response = bedrock_agent_runtime.retrieve_and_generate(\n        input={'text': question},\n        retrieveAndGenerateConfiguration={\n            'type': 'KNOWLEDGE_BASE',\n            'knowledgeBaseConfiguration': {\n                'knowledgeBaseId': kb_id,\n                'modelArn': 'arn:aws:bedrock:eu-west-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0'\n            }\n        }\n    )\n\n    answer = response['output']['text']\n    sources = response['citations']\n\n    return answer, sources\n\n# Example\nanswer, sources = query_knowledge_base(\n    kb_id='ABCD1234',\n    question='How do I calibrate the GDT-410M loadcell transmitter?'\n)\n\nprint(answer)\n# \"To calibrate the GDT-410M: 1) Enter calibration mode by pressing...\"\n# Sources: [GDT_Manual_v2.3.pdf, page 45-47]\n",[292,1557,1558,1563,1568,1572,1577,1581,1586,1591,1596,1601,1606,1611,1616,1621,1626,1631,1636,1641,1646,1651,1656,1661,1666,1671,1676,1680,1684,1688,1692,1696,1701,1705,1710,1715,1720,1725,1730,1735,1740,1745,1749,1753,1757,1761,1766,1770,1775,1780,1784,1789,1793,1798,1803,1808,1813,1818,1823,1828,1832,1836,1840,1844,1849,1854,1858,1863,1867,1872,1877,1882,1887,1892,1896,1901,1906],{"__ignoreMap":294},[322,1559,1560],{"class":324,"line":325},[322,1561,1562],{},"def setup_knowledge_base():\n",[322,1564,1565],{"class":324,"line":331},[322,1566,1567],{},"    \"\"\"Create knowledge base from PDF manuals\"\"\"\n",[322,1569,1570],{"class":324,"line":337},[322,1571,347],{"emptyLinePlaceholder":346},[322,1573,1574],{"class":324,"line":343},[322,1575,1576],{},"    bedrock_agent = boto3.client('bedrock-agent')\n",[322,1578,1579],{"class":324,"line":350},[322,1580,347],{"emptyLinePlaceholder":346},[322,1582,1583],{"class":324,"line":356},[322,1584,1585],{},"    # Create knowledge base\n",[322,1587,1588],{"class":324,"line":362},[322,1589,1590],{},"    kb_response = bedrock_agent.create_knowledge_base(\n",[322,1592,1593],{"class":324,"line":367},[322,1594,1595],{},"        name='FactoryOperationManuals',\n",[322,1597,1598],{"class":324,"line":373},[322,1599,1600],{},"        roleArn='arn:aws:iam::xxx:role/BedrockKBRole',\n",[322,1602,1603],{"class":324,"line":379},[322,1604,1605],{},"        knowledgeBaseConfiguration={\n",[322,1607,1608],{"class":324,"line":385},[322,1609,1610],{},"            'type': 'VECTOR',\n",[322,1612,1613],{"class":324,"line":391},[322,1614,1615],{},"            'vectorKnowledgeBaseConfiguration': {\n",[322,1617,1618],{"class":324,"line":397},[322,1619,1620],{},"                'embeddingModelArn': 'arn:aws:bedrock:eu-west-1::foundation-model/amazon.titan-embed-text-v1'\n",[322,1622,1623],{"class":324,"line":403},[322,1624,1625],{},"            }\n",[322,1627,1628],{"class":324,"line":409},[322,1629,1630],{},"        },\n",[322,1632,1633],{"class":324,"line":415},[322,1634,1635],{},"        storageConfiguration={\n",[322,1637,1638],{"class":324,"line":421},[322,1639,1640],{},"            'type': 'OPENSEARCH_SERVERLESS',\n",[322,1642,1643],{"class":324,"line":427},[322,1644,1645],{},"            'opensearchServerlessConfiguration': {\n",[322,1647,1648],{"class":324,"line":433},[322,1649,1650],{},"                'collectionArn': 'arn:aws:aoss:eu-west-1:xxx:collection/factory-kb',\n",[322,1652,1653],{"class":324,"line":439},[322,1654,1655],{},"                'vectorIndexName': 'factory-docs',\n",[322,1657,1658],{"class":324,"line":445},[322,1659,1660],{},"                'fieldMapping': {\n",[322,1662,1663],{"class":324,"line":451},[322,1664,1665],{},"                    'vectorField': 'vector',\n",[322,1667,1668],{"class":324,"line":457},[322,1669,1670],{},"                    'textField': 'text',\n",[322,1672,1673],{"class":324,"line":462},[322,1674,1675],{},"                    'metadataField': 'metadata'\n",[322,1677,1678],{"class":324,"line":468},[322,1679,700],{},[322,1681,1682],{"class":324,"line":474},[322,1683,1625],{},[322,1685,1686],{"class":324,"line":480},[322,1687,1524],{},[322,1689,1690],{"class":324,"line":485},[322,1691,718],{},[322,1693,1694],{"class":324,"line":491},[322,1695,347],{"emptyLinePlaceholder":346},[322,1697,1698],{"class":324,"line":497},[322,1699,1700],{},"    kb_id = kb_response['knowledgeBase']['knowledgeBaseId']\n",[322,1702,1703],{"class":324,"line":503},[322,1704,347],{"emptyLinePlaceholder":346},[322,1706,1707],{"class":324,"line":508},[322,1708,1709],{},"    # Add data source (S3 bucket with PDFs)\n",[322,1711,1712],{"class":324,"line":514},[322,1713,1714],{},"    bedrock_agent.create_data_source(\n",[322,1716,1717],{"class":324,"line":520},[322,1718,1719],{},"        knowledgeBaseId=kb_id,\n",[322,1721,1722],{"class":324,"line":525},[322,1723,1724],{},"        name='OperationManualsPDF',\n",[322,1726,1727],{"class":324,"line":531},[322,1728,1729],{},"        dataSourceConfiguration={\n",[322,1731,1732],{"class":324,"line":537},[322,1733,1734],{},"            'type': 'S3',\n",[322,1736,1737],{"class":324,"line":543},[322,1738,1739],{},"            's3Configuration': {\n",[322,1741,1742],{"class":324,"line":549},[322,1743,1744],{},"                'bucketArn': 'arn:aws:s3:::factory-manuals'\n",[322,1746,1747],{"class":324,"line":555},[322,1748,1625],{},[322,1750,1751],{"class":324,"line":560},[322,1752,1524],{},[322,1754,1755],{"class":324,"line":566},[322,1756,718],{},[322,1758,1759],{"class":324,"line":572},[322,1760,347],{"emptyLinePlaceholder":346},[322,1762,1763],{"class":324,"line":578},[322,1764,1765],{},"    return kb_id\n",[322,1767,1768],{"class":324,"line":584},[322,1769,347],{"emptyLinePlaceholder":346},[322,1771,1772],{"class":324,"line":590},[322,1773,1774],{},"def query_knowledge_base(kb_id, question):\n",[322,1776,1777],{"class":324,"line":596},[322,1778,1779],{},"    \"\"\"Query operation manuals\"\"\"\n",[322,1781,1782],{"class":324,"line":602},[322,1783,347],{"emptyLinePlaceholder":346},[322,1785,1786],{"class":324,"line":608},[322,1787,1788],{},"    bedrock_agent_runtime = boto3.client('bedrock-agent-runtime')\n",[322,1790,1791],{"class":324,"line":614},[322,1792,347],{"emptyLinePlaceholder":346},[322,1794,1795],{"class":324,"line":620},[322,1796,1797],{},"    response = bedrock_agent_runtime.retrieve_and_generate(\n",[322,1799,1800],{"class":324,"line":625},[322,1801,1802],{},"        input={'text': question},\n",[322,1804,1805],{"class":324,"line":631},[322,1806,1807],{},"        retrieveAndGenerateConfiguration={\n",[322,1809,1810],{"class":324,"line":637},[322,1811,1812],{},"            'type': 'KNOWLEDGE_BASE',\n",[322,1814,1815],{"class":324,"line":643},[322,1816,1817],{},"            'knowledgeBaseConfiguration': {\n",[322,1819,1820],{"class":324,"line":649},[322,1821,1822],{},"                'knowledgeBaseId': kb_id,\n",[322,1824,1825],{"class":324,"line":655},[322,1826,1827],{},"                'modelArn': 'arn:aws:bedrock:eu-west-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0'\n",[322,1829,1830],{"class":324,"line":661},[322,1831,1625],{},[322,1833,1834],{"class":324,"line":667},[322,1835,1524],{},[322,1837,1838],{"class":324,"line":673},[322,1839,718],{},[322,1841,1842],{"class":324,"line":679},[322,1843,347],{"emptyLinePlaceholder":346},[322,1845,1846],{"class":324,"line":685},[322,1847,1848],{},"    answer = response['output']['text']\n",[322,1850,1851],{"class":324,"line":691},[322,1852,1853],{},"    sources = response['citations']\n",[322,1855,1856],{"class":324,"line":697},[322,1857,347],{"emptyLinePlaceholder":346},[322,1859,1860],{"class":324,"line":703},[322,1861,1862],{},"    return answer, sources\n",[322,1864,1865],{"class":324,"line":709},[322,1866,347],{"emptyLinePlaceholder":346},[322,1868,1869],{"class":324,"line":715},[322,1870,1871],{},"# Example\n",[322,1873,1874],{"class":324,"line":721},[322,1875,1876],{},"answer, sources = query_knowledge_base(\n",[322,1878,1879],{"class":324,"line":726},[322,1880,1881],{},"    kb_id='ABCD1234',\n",[322,1883,1884],{"class":324,"line":732},[322,1885,1886],{},"    question='How do I calibrate the GDT-410M loadcell transmitter?'\n",[322,1888,1889],{"class":324,"line":738},[322,1890,1891],{},")\n",[322,1893,1894],{"class":324,"line":744},[322,1895,347],{"emptyLinePlaceholder":346},[322,1897,1898],{"class":324,"line":749},[322,1899,1900],{},"print(answer)\n",[322,1902,1903],{"class":324,"line":755},[322,1904,1905],{},"# \"To calibrate the GDT-410M: 1) Enter calibration mode by pressing...\"\n",[322,1907,1908],{"class":324,"line":761},[322,1909,1910],{},"# Sources: [GDT_Manual_v2.3.pdf, page 45-47]\n",[10,1912,1914],{"id":1913},"cost-optimization","Cost Optimization",[54,1916,1918],{"id":1917},"pricing-claude-3-models","Pricing (Claude 3 Models)",[59,1920,1921,1936],{},[62,1922,1923],{},[65,1924,1925,1927,1930,1933],{},[68,1926,70],{},[68,1928,1929],{},"Input",[68,1931,1932],{},"Output",[68,1934,1935],{},"Use Case",[81,1937,1938,1953,1968],{},[65,1939,1940,1944,1947,1950],{},[86,1941,1942],{},[18,1943,90],{},[86,1945,1946],{},"$0.003/1K tokens",[86,1948,1949],{},"$0.015/1K tokens",[86,1951,1952],{},"Complex analysis",[65,1954,1955,1959,1962,1965],{},[86,1956,1957],{},[18,1958,106],{},[86,1960,1961],{},"$0.00025/1K tokens",[86,1963,1964],{},"$0.00125/1K tokens",[86,1966,1967],{},"Fast, simple tasks",[65,1969,1970,1975,1977,1980],{},[86,1971,1972],{},[18,1973,1974],{},"Claude 3 Opus",[86,1976,1949],{},[86,1978,1979],{},"$0.075/1K tokens",[86,1981,1982],{},"Most advanced",[54,1984,1986],{"id":1985},"cost-example","Cost Example",[15,1988,1989,1992],{},[18,1990,1991],{},"Scenario:"," Hourly anomaly detection for 10 tanks",[1994,1995,1996,2000,2003],"ul",{},[1997,1998,1999],"li",{},"Prompt: ~500 tokens (data + instructions)",[1997,2001,2002],{},"Response: ~200 tokens (JSON)",[1997,2004,2005],{},"Total: 700 tokens/check",[15,2007,2008],{},[18,2009,2010],{},"Monthly Cost:",[285,2012,2015],{"className":2013,"code":2014,"language":290},[288],"10 tanks × 24 checks/day × 30 days = 7,200 checks\n7,200 × 700 tokens = 5,040,000 tokens (~5M)\n\nUsing Claude 3 Haiku:\nInput:  5M × 0.5 = 2.5M tokens × $0.00025 = $0.625\nOutput: 5M × 0.2 = 1.0M tokens × $0.00125 = $1.250\nTOTAL: ~$1.90/month\n",[292,2016,2014],{"__ignoreMap":294},[15,2018,2019,2022],{},[18,2020,2021],{},"Compare to hiring data scientist:"," $5,000+/month",[10,2024,2026],{"id":2025},"guardrails-for-safety","Guardrails for Safety",[54,2028,2030],{"id":2029},"prevent-harmful-outputs","Prevent Harmful Outputs",[285,2032,2034],{"className":316,"code":2033,"language":318,"meta":294,"style":294},"bedrock_config = {\n    \"guardrailIdentifier\": \"factory-ai-guardrails\",\n    \"guardrailVersion\": \"1\",\n    \"trace\": \"enabled\"\n}\n\nresponse = bedrock.invoke_model(\n    modelId='anthropic.claude-3-sonnet-20240229-v1:0',\n    body=json.dumps({\n        \"messages\": [{\"role\": \"user\", \"content\": prompt}],\n        **bedrock_config\n    })\n)\n",[292,2035,2036,2041,2046,2051,2056,2060,2064,2069,2074,2079,2084,2089,2094],{"__ignoreMap":294},[322,2037,2038],{"class":324,"line":325},[322,2039,2040],{},"bedrock_config = {\n",[322,2042,2043],{"class":324,"line":331},[322,2044,2045],{},"    \"guardrailIdentifier\": \"factory-ai-guardrails\",\n",[322,2047,2048],{"class":324,"line":337},[322,2049,2050],{},"    \"guardrailVersion\": \"1\",\n",[322,2052,2053],{"class":324,"line":343},[322,2054,2055],{},"    \"trace\": \"enabled\"\n",[322,2057,2058],{"class":324,"line":350},[322,2059,920],{},[322,2061,2062],{"class":324,"line":356},[322,2063,347],{"emptyLinePlaceholder":346},[322,2065,2066],{"class":324,"line":362},[322,2067,2068],{},"response = bedrock.invoke_model(\n",[322,2070,2071],{"class":324,"line":367},[322,2072,2073],{},"    modelId='anthropic.claude-3-sonnet-20240229-v1:0',\n",[322,2075,2076],{"class":324,"line":373},[322,2077,2078],{},"    body=json.dumps({\n",[322,2080,2081],{"class":324,"line":379},[322,2082,2083],{},"        \"messages\": [{\"role\": \"user\", \"content\": prompt}],\n",[322,2085,2086],{"class":324,"line":385},[322,2087,2088],{},"        **bedrock_config\n",[322,2090,2091],{"class":324,"line":391},[322,2092,2093],{},"    })\n",[322,2095,2096],{"class":324,"line":397},[322,2097,1891],{},[15,2099,2100],{},[18,2101,2102],{},"Guardrail Rules:",[1994,2104,2105,2108,2111,2114],{},[1997,2106,2107],{},"Block PII data in responses",[1997,2109,2110],{},"Filter toxic content",[1997,2112,2113],{},"Enforce output format (JSON only)",[1997,2115,2116],{},"Content filtering for accuracy",[10,2118,2120],{"id":2119},"conclusion","Conclusion",[15,2122,2123,2125],{},[18,2124,28],{}," brings enterprise-grade AI to industrial applications without ML expertise:",[15,2127,2128,2129,2132,2133,2136,2137,2140,2141,2136,2143,2146,2147,2136,2149,2152],{},"✅ ",[18,2130,2131],{},"Anomaly detection"," without model training",[2134,2135],"br",{},"\n✅ ",[18,2138,2139],{},"Natural language SQL"," for business users",[2134,2142],{},[18,2144,2145],{},"Automated reporting"," saving hours of manual work",[2134,2148],{},[18,2150,2151],{},"RAG chatbots"," for instant manual lookups",[15,2154,2155,2156,2158],{},"Cost-effective with models like ",[18,2157,106],{}," (~$2/month for 10 devices).",[15,2160,2161,2162,2166],{},"For data privacy-sensitive applications, consider our ",[34,2163,2165],{"href":2164},"/en/blog/on-premise-ai-solutions-with-ollama","On-Premise AI with Ollama"," solution.",[54,2168,2170],{"id":2169},"related-resources","Related Resources",[1994,2172,2173,2178,2184,2190],{},[1997,2174,2175],{},[34,2176,2177],{"href":2164},"On-Premise AI Solutions with Ollama",[1997,2179,2180],{},[34,2181,2183],{"href":2182},"/en/blog/industrial-data-collection-with-aws-iot-core","Industrial Data Collection with AWS IoT Core",[1997,2185,2186],{},[34,2187,2189],{"href":2188},"/en/blog/time-series-data-management-amazon-timestream","Time Series Data Management with Timestream",[1997,2191,2192],{},[34,2193,2195],{"href":2194},"/en/solutions/cloud-iot-data-collection","Cloud & IoT Data Collection",[2197,2198,2199],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":294,"searchDepth":331,"depth":331,"links":2201},[2202,2203,2207,2208,2212,2216,2220,2223,2227,2230],{"id":12,"depth":331,"text":13},{"id":46,"depth":331,"text":47,"children":2204},[2205,2206],{"id":56,"depth":337,"text":57},{"id":165,"depth":337,"text":166},{"id":282,"depth":331,"text":283},{"id":297,"depth":331,"text":298,"children":2209},[2210,2211],{"id":301,"depth":337,"text":302},{"id":312,"depth":337,"text":313},{"id":923,"depth":331,"text":924,"children":2213},[2214,2215],{"id":927,"depth":337,"text":302},{"id":937,"depth":337,"text":938},{"id":1234,"depth":331,"text":1235,"children":2217},[2218,2219],{"id":1238,"depth":337,"text":302},{"id":1244,"depth":337,"text":1245},{"id":1540,"depth":331,"text":1541,"children":2221},[2222],{"id":1544,"depth":337,"text":1545},{"id":1913,"depth":331,"text":1914,"children":2224},[2225,2226],{"id":1917,"depth":337,"text":1918},{"id":1985,"depth":337,"text":1986},{"id":2025,"depth":331,"text":2026,"children":2228},[2229],{"id":2029,"depth":337,"text":2030},{"id":2119,"depth":331,"text":2120,"children":2231},[2232],{"id":2169,"depth":337,"text":2170},"Leveraging foundation models (Claude, Llama, Titan) for industrial applications: Anomaly detection, natural language querying, automated maintenance reports.","md",{"date":2236,"author":2237,"readTime":379,"tags":2238},"2025-12-29","Amazeng Technical Team",[28,20,2239,2240,2241,2242,2243],"Claude","Llama","Industrial AI","Foundation Models","LLM","/en/blog/aws-bedrock-industrial-generative-ai",{"title":5,"description":2233},"en/blog/aws-bedrock-industrial-generative-ai","humil45aPfBKklHG0uussEnV7CilkPCZhAF3yAAe528",1778229658566]