day25我們進行Kendra的創建以及S3文件的同步,我們可以即時的更新RAG資料,得以讓應用程式去搜尋,傳送給LLM得到精準回應,那麼今天就要進行LangChain與Kendra的串接。
請先確保IAM user有 Kendra權限
並且生成出右邊的access Key
Linux/Mac:
打開Terminate
使用以下命令創建或編輯 AWS 認證文件:
nano ~/.aws/credentials
Windows:
打開文件資源管理器,然後導航到以下路徑:
C:\Users<YourUsername>.aws\
如果文件夾不存在,則手動創建一個 .aws 文件夾。
在 .aws 文件夾中,右鍵點擊並選擇 "新建" > "文字文件",然後命名為 credentials(沒有擴展名)
在 credentials 文件中輸入 AWS IAM的access key ID 還有secret_access_key
確保IAM有Kendra的權限 (AmazonKendraFullAccess)
[default]
aws_access_key_id = 你的訪問密鑰
aws_secret_access_key = 你的秘密密鑰
先安裝CLI
pip install awscli
接著使用configure
aws configure
就會快速地幫你建立好了
記得day25 我們點進去Kendra有個index id,等等會使用到這個
以day21的程式碼為修改範本
最主要修改的程式碼如下
from langchain_community.retrievers import AmazonKendraRetriever
# 2. retriever
retriever = AmazonKendraRetriever(
index_id="你的Kendra index id",
min_score_confidence=0.5)
這裡有個參數叫做min_score_confidence,最低的信心分數,主要是過濾結果,Kendra會為每個檢索結果提供一個信心分數(confidence score),表示與查詢的相關性,只有那些信心分數高於此值的結果才會被返回。
# langChain
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
import os
from langchain_core.output_parsers import StrOutputParser
from langchain_community.retrievers import AmazonKendraRetriever
# 1. Create model
os.environ["OPENAI_API_KEY"] = ""
model = ChatOpenAI(model_name="gpt-4o")
# 2. retriever
retriever = AmazonKendraRetriever(
index_id="",
min_score_confidence=0.5)
# 4. Create chain
template = """你將成為一個雲端架構圖設計師,使用 Python 的 diagrams 函式庫,生成AWS的雲端架構圖。
請依照使用者的需求,設計一個安全、高效的雲端架構,並確保使用相關的雲端服務,如 VPC、負載均衡、Kubernetes、儲存服務、資料庫等。
你可以自由發揮,但每個服務的選擇都需要合理解釋,並考慮擴展性、安全性和效能優化。
以下是一個基本範例,你可以基於此來自訂使用者的需求:
```python
from diagrams import Cluster, Diagram
from diagrams.aws.network import VPC, ElasticLoadBalancing, CloudFront, Route53, ClientVpn
from diagrams.aws.compute import EKS
from diagrams.aws.database import Aurora, RDS, Elasticache
from diagrams.aws.storage import FSx, S3
from diagrams.aws.management import Cloudwatch
from diagrams.aws.security import IAM, KMS, SecurityHub, Shield
from diagrams.onprem.client import Users
# 使用者可調整這個架構設計
with Diagram("Secure Website System Architecture", show=False):
# 定義使用者、網路、計算、資料庫、儲存、運營和安全等模組
# 添加每個服務的設計思路
```
請你自動根據使用者給定的架構需求,進行設計,並解釋每個服務的選擇理由。
有以下簡單的規則請注意
- 將每個雲端服務分別定義,並使用合適的 `Cluster` 來組織它們。
- 每個 `Cluster` 的 `graph_attr` 應該設置顏色。
- 請用 ``` ``` 來包裹程式碼,並確保裡面只有程式碼。
- security這類別是自由的!,不需要連結到其他服務
以下是參考資料:
{context}
最後是重要的使用者要求:
{user_input}
"""
custom_rag_prompt = PromptTemplate.from_template(template)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": retriever | format_docs, "user_input": lambda x: x}
| custom_rag_prompt
| model
| StrOutputParser()
)
rchain_response = rag_chain.invoke("我想要一個保證安全性的網站系統雲端架構圖")
print(rchain_response)
python day26.py
當然,根據你的需求,我們將設計一個安全、高效的AWS雲端架構圖。這個架構將包括以下主要組件:
1. **VPC (Virtual Private Cloud)**: 提供隔離的網路環境。
2. **負載均衡 (ELB)**: 分配流量,提高系統可用性。
3. **Kubernetes (EKS)**: 部署容器化應用。
4. **儲存服務 (S3, FSx)**: 提供持久化儲存。
5. **資料庫 (Aurora, Elasticache)**: 儲存和緩存資料。
6. **安全服務 (Shield, CloudFront, Route53, ClientVpn, Iam, KMS, SecurityHub)**: 提供安全保護和監控。
以下是Python代碼,使用`diagrams`函式庫來生成這個架構圖:
```python
from diagrams import Cluster, Diagram
from diagrams.aws.network import VPC, ElasticLoadBalancing, Route53
from diagrams.aws.compute import EKS
from diagrams.aws.database import Aurora, Elasticache
from diagrams.aws.storage import S3, FSx
from diagrams.aws.management import Cloudwatch
from diagrams.aws.security import IAM, KMS, SecurityHub, Shield
from diagrams.onprem.client import Users
graph_attr = {
"fontsize": "20",
"bgcolor": "white"
}
with Diagram("Secure Website System Architecture", show=False, graph_attr=graph_attr):
user = Users("Users")
with Cluster("Network", graph_attr={"bgcolor": "lightblue"}):
vpc = VPC("VPC")
dns = Route53("Route 53")
with Cluster("Load Balancing", graph_attr={"bgcolor": "orange"}):
elb = ElasticLoadBalancing("ELB")
with Cluster("Compute", graph_attr={"bgcolor": "lightgreen"}):
eks = EKS("EKS Cluster")
with Cluster("Storage", graph_attr={"bgcolor": "lightyellow"}):
s3 = S3("S3")
fsx = FSx("FSx")
with Cluster("Database", graph_attr={"bgcolor": "lightcoral"}):
aurora = Aurora("Aurora")
cache = Elasticache("Elasticache")
with Cluster("Monitoring", graph_attr={"bgcolor": "lightgrey"}):
cloudwatch = Cloudwatch("Cloudwatch")
user >> dns >> elb >> eks
eks >> s3
eks >> fsx
eks >> aurora
eks >> cache
cloudwatch >> eks
with Cluster("Security", graph_attr={"bgcolor": "lightpink"}):
iam = IAM("IAM")
kms = KMS("KMS")
securityhub = SecurityHub("SecurityHub")
shield = Shield("Shield")
# Security services are not connected to other services directly,
# but they ensure the overall security of the architecture.
```
### 解釋每個服務的選擇理由:
1. **VPC**:虛擬私有雲,提供網路隔離,確保內部流量的安全性。
2. **Route 53**:DNS服務,提供高可用的域名解析和路由。
3. **Elastic Load Balancing (ELB)**:分配流量,提高系統的容錯能力和可擴展性。
4. **EKS (Elastic Kubernetes Service)**:管理容器化應用程序,具有高可用性和可擴展性。
5. **S3**:存儲靜態資源和備份數據,提供高可用性和耐久性。
6. **FSx**:高性能文件存儲,適合需要高 IOPS 的應用。
7. **Aurora**:高性能、高可用性的數據庫服務。
8. **Elasticache**:加速數據庫查詢,提高應用程序性能。
9. **Cloudwatch**:監控系統運行情況,提供警報功能。
10. **IAM**:管理用戶和權限,確保資源訪問的安全性。
11. **KMS**:管理加密鍵,確保數據的安全性。
12. **SecurityHub**:提供安全事件管理,統一管理安全警報。
13. **Shield**:防禦DDoS攻擊,確保系統的可用性。
這個架構圖旨在滿足高效、安全和可擴展性的需求。希望這個設計符合您的期望。