ลองใช้งาน sample applications สำหรับตอบคำถามตามข้อมูล User Guide ของ AWS ล่าสุดด้วย Amazon Kendra และ OpenAI

ไปเจอข้อมูลเกี่ยวกับแอปพลิเคชันแชทตัวอย่างที่ใช้ Amazon Kendra และ OpenAI เพื่อให้คำตอบตาม User Guide ของ AWS ล่าสุดที่ AWS Samples ลงไว้เลยอยากเอามาลองทดสอบให้เพื่อนๆได้ดูกันครับ

นี่คือหน้าจอแชทที่ได้ลองใช้จริง โดยได้ถามไปว่า Amazon Kendra รองรับเอกสารประเภทใดบ้าง และระบบได้ตอบ กลับพร้อมกับ URL ของ User Guide ที่อ้างอิงมาด้วย

sample applications จะอยู่ใน repository ดังต่อไปนี้

โดยนอกจาก OpenAI แล้วยังรองรับ AI อื่นๆดังต่อไปนี้ด้วย

  • Hugging Face
  • AI21 Labs
  • Cohere
  • Anthropic
  • OpneAI

นอกจากนี้ยังมีบล็อกของ AWS ที่แนะนำวิธีใช้ sample นี้ด้วย โดยจะอ้างอิงข้อมูลบางส่วนจากบล็อกนี้และลองทดสอบสร้างแอปพลิเคชันครับ

ก่อนอื่นมาทำความเข้าใจกับโครงสร้างของแอปพลิเคชันตัวอย่างก่อนที่จะลองสร้างกันครับ

แผนผังโครงสร้าง

แผนผังโครงสร้าง sample applications ที่สร้างขึ้นในบล็อกนี้จะอ้างอิงมาจากบล็อกของ AWS ครับ

เมื่อผู้ใช้ถามคำถามผ่านการแชท แอปพลิเคชันจะเข้าถึง Amazon Kendra ซึ่งได้นำเข้าข้อมูลจาก User Guide ของ AWS และส่งคำตอบไปยัง OpenAI เพื่อสร้างคำตอบให้กับผู้ใช้

การสร้าง sample applications

มาลองสร้าง sample applications กันครับ

โดยเวอร์ชันซอฟต์แวร์ที่ใช้ในครั้งนี้มีดังนี้

  • Python 3.9.16
  • boto3 1.26.130
  • Streamlit 1.22.0
  • openai 0.27.6
  • langchain 0.0.163

และจะใช้ AWS Cloud9 เป็นสภาพแวดล้อมในการรันแอปพลิเคชัน ซึ่งการตั้งค่าหลักๆจะมีดังนี้
- instance size t2.micro
- Platform Amazon Linux 2

การสร้าง Amazon Kendra

ในครั้งนี้เราจะใช้ Template ของ CloudFormation ในลิ้งค์ด้านล่างในการทดสอบครับ

หลังจากอัปโหลด Template ข้างต้นไปยัง AWS CloudShell แล้ว ให้รันคำสั่งต่อไปนี้

aws cloudformation create-stack \
  --region ap-southeast-1 \
  --stack-name demo-kendora \
  --template-body file://kendra-docs-index.yaml \
  --capabilities CAPABILITY_NAMED_IAM

โดยในการสร้างสภาพแวดล้อมจะใช้เวลาประมาณ 45 นาที

เมื่อการติดตั้งเสร็จสิ้นแล้ว ระบบจะสร้าง IAM Role ที่เกี่ยวข้องกับ Lambda ที่มีการซิงโครไนซ์กับ data source และ index ของ Kendra ขึ้นมา

โดยประเภท data source ของ Kendra จะเป็น WebCrawler connector ซึ่งจะรวบรวมข้อมูลจาก 3 User Guide ของ AWS ดังต่อไปนี้

https://docs.aws.amazon.com/sagemaker/latest/dg/sitemap.xml
https://docs.aws.amazon.com/lex/latest/dg/sitemap.xml
https://docs.aws.amazon.com/kendra/latest/dg/sitemap.xml

สำหรับการซิงโครไนซ์ จะมีข้อมูลบางส่วนขึ้นเครื่องหมายว่า Failed แต่ก็มีข้อมูลไม่น้อยที่เป็น Added

กำหนดการซิงโครไนซ์กับ data source จะถูกตั้งค่าเป็น Run on Demand ซึ่งจะไม่ได้ดำเนินการซิงโครไนซ์เป็นประจำ และการกำหนดค่านี้จำเป็นต้องทำการซิงโครไนซ์ด้วยตนเอง จึงใช้ AWS Lambda เพื่อทำการซิงโครไนซ์ โดยส่วนตัวคิดว่าน่าจะพยายามหลีกเลี่ยงการรวบรวมข้อมูลของเว็บโดยไม่จำเป็น

อย่างไรก็ตาม ตามที่ระบุไว้ในบล็อกของ AWS การขอเพิ่มโควตาของ Amazon Kendora จะช่วยเพิ่มประสบการณ์การใช้งานให้ดีขึ้นได้ แต่ในครั้งนี้เราจะไม่ดำเนินการใดๆ

การสร้าง Web applications

เราจะสร้าง sample Web applications บน AWS Cloud9

Python

บล็อกของ AWS ระบุว่าให้ใช้งานตั้งแต่ Python 3.9 หรือใหม่กว่าในการทดสอบครับ

$ python --version
Python 3.8.16

สามารถตรวจสอบเกี่ยวกับเปลี่ยนเวอร์ชันของ Python บน Cloud9 ได้ผ่านบล็อกต่อไปนี้

จากนั้นทำการติดตั้ง pyenv.

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv

$ ~/.pyenv/bin/pyenv --version
pyenv 2.3.36

$ cat <> ~/.bashrc
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
EOT

$ source ~/.bashrc

$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)


ติดตั้ง Python 3.9.16 และทำการเปลี่ยนเวอร์ชัน

$ sudo yum -y update
$ sudo yum -y install bzip2-devel
$ sudo yum -y install xz-devel

$ pyenv install 3.9.16

$ pyenv versions
* system (set by /home/ec2-user/.pyenv/version)
  3.9.16

$ pyenv global 3.9.16

$ pyenv versions
  system
* 3.9.16 (set by /home/ec2-user/.pyenv/version)

$ python --version
Python 3.9.16

boto3

ติดตั้ง AWS SDK for Python (Boto3)

โดยติดตั้งตามขั้นตอนในลิ้งค์ทางด้านล่าง

จากนั้นทำการอัปเกรด pip

$ /home/ec2-user/.pyenv/versions/3.9.16/bin/python3.9 -m pip install --upgrade pip

ติดตั้ง Boto3

$ pip3 install boto3
$ pip3 list | grep boto3
boto3           1.34.42

Streamlit

ติดตั้ง Streamlit สำหรับสร้าง Web applications ด้วย Python

ติดตั้งตามขั้นตอนในลิ้งค์ทางด้านล่าง

$ pip3 install streamlit
$ streamlit --version
Streamlit, version 1.31.1

และตรวจสอบว่าสามารถดูเว็บไซต์ได้ผ่านคอมพิวเตอร์ได้หรือไม่

$ streamlit hello --server.port 8080

หลังจากรันคำสั่งข้างต้นแล้ว ให้เลือก Preview → Preview Running Application ใน AWS Cloud9 ก็จะสามารถดูข้อมูลได้ตามภาพครับ

โดยก่อนดูรายละเอียดผ่าน Preview ให้ตรวจสอบอีกครั้งว่า inbound ของ security group มีการอนุญาต Port 8080 แล้วหรือไม่ แล้วค่อยเข้า Browser ครับ

โดยสามารถ กด CTRL+C พร้อมกันเพื่อทำหยุดการใช้งาน streamlit ได้ครับ

อนึ่ง Streamlit จะรวบรวมสถิติการใช้งานเมื่อทำการติดตั้ง หากไม่ต้องการเก็บข้อมูลเหล่านั้น สามารถเพิ่มเนื้อหาดังต่อไปนี้ลงในไฟล์การตั้งค่าได้

[browser]
gatherUsageStats = false


ถ้าไม่มีไฟล์ตั้งค่า สามารถใช้คำสั่งต่อไปนี้เพื่อสร้างได้

$ mkdir ~/.streamlit
$ vi ~/.streamlit/config.toml

ในการตั้งค่ายกเลิกการรวบรวมสถิติการใช้งานสามารถตรวจสอบได้จากลิ้งก์ต่อไปนี้

Configuration - Streamlit Docs

OpenAI, LangChain

ติดตั้ง LangChain ตามลิ้งก์ทางด้านล่าง

จากนั้นติดตั้ง OpenAI โดยจะตั้งค่า API key ของตัวแปรในสภาพแวดล้อมในภายหลัง

$ pip3 install openai
$ openai --version
openai 1.12.0


ติดตั้ง LangChain

$ pip3 install langchain
$ pip3 list | grep langchain
langchain        0.1.7

sample applications

ให้รันคำสั่งดังต่อไปนี้

$ pwd
/home/ec2-user

$ git clone https://github.com/aws-samples/amazon-kendra-langchain-extensions.git

$ cd amazon-kendra-langchain-extensions/kendra_retriever_samples/

$ rm requirements.txt

$ cat << EOF > requirements.txt
anthropic==0.16.0
streamlit==1.31.1
langchain==0.1.7
openai==1.12.0
EOF


$ pip3 install -r requirements.txt

ตั้งค่าตัวแปรสภาพแวดล้อม

$ export AWS_REGION="ap-southeast-1"
$ export KENDRA_INDEX_ID="dd6d896b-704e-46f9-9ab6-5adffexample"
$ export OPENAI_API_KEY="..."

REGION จะเป็นการระบุ REGION ที่ใช้งาน Amazon Kendra อยู่ โดยในกรณีนี้จะหมายถึง REGION ที่จะสร้าง stack ของ CloudFormation ที่สร้าง Amazon Kendra ขึ้นมา

KENDRA_INDEX_ID จะเป็นการระบุ ID ของ index ใน Amazon Kendra ซึ่งสามารถตรวจสอบได้จากหน้า Management console หรือคำสั่งต่อไปนี้

$ aws kendra list-indices
{
    "IndexConfigurationSummaryItems": [
        {
            "Status": "ACTIVE",
            "Name": "demo-kendora-Index",
            "Edition": "DEVELOPER_EDITION",
            "UpdatedAt": 1683642249.785,
            "Id": "dd6d896b-704e-46f9-9ab6-5adffexample",
            "CreatedAt": 1683642249.785
        }
    ]
}

OPENAI_API_KEY จะเป็นการระบุ API KEY ของ OpenAI ของแต่ละท่าน

โดยการดึงข้อมูล OPENAI_API_KEY ให้สร้าง account จากเมนู Get Started จากลิ้งค์ดังต่อไปนี้
- https://openai.com/product

จากนั้นให้ไปที่เมนูUsage ตามภาพถ้าสถานะเป็น Available ก็จะสามารถใช้งานได้ในวงเงินไม่เกิน 5.00$ ภายในระยะเวลาที่กำหนดครับ

แต่ถ้าเป็นสถานะด้านล่างจะแสดงเป็น Expired หมายความว่าหมดอายุการใช้งานฟรีแล้ว

จากนั้นไปที่เมนู API Key ทางด้านซ้ายแล้วสร้าง KEY ที่ปุ่ม Create new secret key ก็จะได้ API KEY มาใช้ได้ครับ

ระบุ API KEY แล้วก็มาลองรัน sample applications กันเลย

$ cd /home/ec2-user/amazon-kendra-langchain-extensions/kendra_retriever_samples/
$ streamlit run app.py openai --server.port 8080

จากนั้นเลือกไปที่ Preview → Preview Running Applicaiton ใน AWS Cloud9 แล้วก็จะสามารถค้นหาข้อมูลได้

ที่เหลือก็แค่ลองใช้งานการสอบถามเท่านั้น

ตรวจสอบการใช้งาน

เนื่องจาก Amazon Kendra มีการรวบรวม User Guide บริการของ AWS ไว้อยู่ เลยจะลองถามคำถามที่เกี่ยวข้องดู

  • Amazon Lex
  • Amazon SageMaker
  • Amazon Kendra

ลองถามเกี่ยวกับเอกสารทุกประเภทที่ Amazon Kendra รองรับ

what are all document types supported by amazon kendra

จากข้อมูลที่แสดงขึ้นจากลิ้งค์ที่ 1 เป็นข้อมูลที่ต้องการค้นหา

  • HTML files
  • Microsoft PowerPoint (PPT) presentations
  • MS WORD documents
  • Plain text documents
  • PDFs
  • Comma Separated Values (CSV) files
  • Microsoft Excel (MS EXCEL) files
  • XML files
  • JSON files
  • Markdown Documentation (MD) files
  • Rich Text Format (RTF) files
  • Extensible Stylesheet Language Transformation (XSLT) files

เอกสารอ้างอิง:Types of documents - Amazon Kendra

นอกจากนี้ยังได้ลองสอบถามคำถามอื่นๆเพิ่มเติมดังนี้

what are all document types supported by kendra  
Does kendra support the JSON document type?

what is amazon lex?

what is amazon sagemaker?

which services are related to machine learning search?

how is amazon sagemaker differenct from amazon kendra?

และขอจบการทดลองใช้ sample applications เพียงเท่านี้ครับ

(ข้อมูลเพิ่มเติม) ราคา Amazon Kendra

สามารถตรวจสอบราคา Amazon Kendra ได้ในลิ้งก์ต่อไปนี้

การสร้าง INDEX ด้วย Developer Edition มีค่าบริการ 1.125 USD/ชั่วโมง ซึ่งจะเท่ากับ 27 USD/วัน (24 ชั่วโมง) นอกจากนี้ยังมีค่าบริการเพิ่มเติมสำหรับการซิงค์กับ connector และการสแกนเอกสารอีกด้วย

แนะนำว่าให้ตรวจสอบราคากันก่อนทำการทดสอบด้วยนะครับ

บทความที่เกี่ยวข้อง

บทความต้นฉบับ