.env
với các thông tin như URI Zilliz Cloud, token truy cập, tên collection, thông tin AWS, OpenAI API key,...git clone https://github.com/benitomartin/embeddings-aws-circlecicd embeddings-aws-circleci
uv sync --all-extrassource .venv/bin/activate
.env
Trường | Kiểu dữ liệu | Chú thích |
---|---|---|
id | INT64 (primary key) | Khóa chính tự tạo |
pdf_text | VARCHAR | Nội dung văn bản trích xuất |
my_vector | FLOAT_VECTOR (1536-d) | Embeddings vector từ OpenAI |
pymilvus
để tạo collection và index tìm kiếm theo cosine similarity.from pymilvus import MilvusClient, DataType
def create_schema(dimension=1536): schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=True) schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True) schema.add_field(field_name="pdf_text", datatype=DataType.VARCHAR, max_length=65535) schema.add_field(field_name="my_vector", datatype=DataType.FLOAT_VECTOR, dim=dimension) return schema
uv run src/create_collection.py
uv run src/drop_collection.py
PyPDFLoader
từ LangChain để đọc PDF và CharacterTextSplitter
để chia đoạn nội dung thành từng khối nhỏ, tránh tràn ký tự khi tạo embedding.from langchain_community.document_loaders import PyPDFLoaderfrom langchain_openai import OpenAIEmbeddingsfrom langchain_text_splitters import CharacterTextSplitterfrom pymilvus import MilvusClientimport os
def insert_documents(pdf_path): loader = PyPDFLoader(pdf_path) documents = loader.load() splitter = CharacterTextSplitter(chunk_size=512, chunk_overlap=100) chunks = splitter.split_documents(documents)
embeddings = OpenAIEmbeddings() client = MilvusClient(uri=os.getenv("ZILLIZ_CLOUD_URI"), token=os.getenv("ZILLIZ_TOKEN"))
data = [] for chunk in chunks: vec = embeddings.embed_documents([chunk.page_content])[0] data.append({"pdf_text": chunk.page_content, "my_vector": vec})
client.insert(os.getenv("COLLECTION_NAME"), data)
uv run src/insert_documents.py
AWSLambdaExecute
.scripts/create_roles.sh
aws iam create-role --role-name your-role-name --assume-role-policy-document file://trust-policy.jsonaws iam attach-role-policy --role-name your-role-name --policy-arn arn:aws:iam::aws:policy/AWSLambdaExecute
import boto3import osfrom langchain_community.document_loaders import PyPDFLoaderfrom langchain_openai import OpenAIEmbeddingsfrom langchain_text_splitters import CharacterTextSplitterfrom pymilvus import MilvusClient
def lambda_handler(event, context): # Parse S3 event # Download file # Process PDF # Generate embeddings # Insert to Milvus # Xử lý lỗi và log chi tiết
aws_lambda
.requirements.txt
tương thích cho Lambdascripts/create_image.sh
scripts/create_lambda.sh
đảm nhận tạo hoặc cập nhật Lambda với image chứa code, cấu hình biến môi trường và thiết lập trigger từ S3 bucket:aws lambda create-function --function-name your-lambda-name --package-type Image --code ImageUri=...aws lambda add-permission --function-name your-lambda-name --principal s3.amazonaws.com --action lambda:InvokeFunction --source-arn arn:aws:s3:::your-bucketaws s3api put-bucket-notification-configuration --bucket your-bucket --notification-configuration ...
uv run pytest
uv run ruff check . --fix --exit-non-zero-on-fixuv run mypy
.circleci/config.yml
version: 2.1
orbs: aws-cli: circleci/[email protected] docker: circleci/[email protected]
jobs: build-deploy: docker: - image: cimg/python:3.12 steps: - checkout - run: curl -LsSf https://astral.sh/uv/install.sh | sh - run: uv sync --all-extras - run: uv run ruff check . --fix --exit-non-zero-on-fix - run: uv run mypy - run: uv run pytest - run: chmod +x scripts/build_deploy.sh - run: ./scripts/build_deploy.sh
workflows: version: 2 deploy: jobs: - build-deploy
build_deploy.sh