0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Xây dựng AI Agent sẵn sàng cho sản xuất với Strands và Amazon Bedrock

Đăng vào 4 ngày trước

• 6 phút đọc

Giới thiệu

Trong bài viết này, chúng ta sẽ khám phá cách xây dựng một AI Agent sẵn sàng cho sản xuất bằng cách sử dụng Strands Agents và triển khai trên Amazon Bedrock AgentCore. Strands Agents thực hiện một triết lý dựa trên mô hình giúp mã nguồn của chúng ta trở nên sạch sẽ và dễ bảo trì hơn, nhờ vào việc cho phép khả năng của mô hình điều khiển hành vi của agent. Hãy cùng bắt đầu!

Mục tiêu

Mục tiêu của chúng ta là tạo ra một AI Agent có thể ghi nhớ các thông tin từ cuộc trò chuyện trước đó và sử dụng chúng trong các phiên tiếp theo, nhờ vào hệ thống bộ nhớ của AgentCore.

Cài đặt môi trường phát triển

Trước tiên, chúng ta cần clone kho mã nguồn từ GitHub:

bash Copy
git clone https://github.com/danilop/agentcore-multi-framework-examples.git
cd agentcore-multi-framework-examples

Tiếp theo, thiết lập dự án Strands Agents:

bash Copy
cd agentcore-strands-agents
uv sync
source .venv/bin/activate

Các phụ thuộc trong dự án

Dự án này bao gồm các phụ thuộc sau:

  • strands-agents: Framework chính để xây dựng agent
  • strands-agents-tools: Các công cụ cộng đồng như máy tính
  • bedrock-agentcore: SDK để tích hợp với dịch vụ AgentCore
  • bedrock-agentcore-starter-toolkit: Công cụ CLI để triển khai

Tạo và cấu hình bộ nhớ AgentCore

Trước khi xây dựng agent, chúng ta cần thiết lập bộ nhớ của AgentCore. Dịch vụ này sẽ lưu trữ các cuộc trò chuyện của agent và trích xuất thông tin có ý nghĩa.

Hiểu các chiến lược bộ nhớ

AgentCore Memory cung cấp ba chiến lược tích hợp sẵn:

  1. Thích nghi của người dùng: Ghi lại các mẫu hành vi của người dùng.
  2. Thực tế ngữ nghĩa: Lưu giữ thông tin và sự kiện liên quan.
  3. Tóm tắt phiên: Tạo ra các tóm tắt ngắn gọn về cuộc trò chuyện.

Tạo instance bộ nhớ

Chúng ta sẽ sử dụng một script để tạo một instance bộ nhớ với tất cả ba chiến lược:

bash Copy
cd scripts
uv sync
uv run create-memory

Script này sẽ tạo một instance mới của AgentCore Memory và cấu hình với tất cả ba chiến lược. Cấu hình bộ nhớ sẽ được lưu tại ../config/memory-config.json.

Thêm bộ nhớ mẫu

Chúng ta sẽ thêm một sự kiện bộ nhớ mẫu để kiểm tra:

bash Copy
uv run add-sample-memory

Sự kiện này sẽ lưu lại một thông điệp đơn giản từ người dùng: "Tôi thích táo nhưng không thích chuối".

Xây dựng agent với hooks

Bây giờ chúng ta sẽ xây dựng agent. Kiến trúc sử dụng hệ thống hook của Strands để tách biệt việc quản lý bộ nhớ khỏi logic chính của agent.

Hiểu hệ thống hook

Hệ thống hook cho phép chúng ta đăng ký các sự kiện và mở rộng chức năng của agent mà không làm phức tạp logic cốt lõi. Tôi đã tạo hai hook bổ sung cho việc quản lý bộ nhớ:

Hook 1: Bộ nhớ ngắn hạn (ShortMemoryHook)

python Copy
class ShortMemoryHook(HookProvider):
    def register_hooks(self, registry: HookRegistry) -> None:
        registry.add_callback(AgentInitializedEvent, self.on_agent_initialized)
        registry.add_callback(MessageAddedEvent, self.on_message_added)

    def on_agent_initialized(self, event: AgentInitializedEvent) -> None:
        # Tải lịch sử cuộc trò chuyện khi agent khởi động
        conversations = self.memory_client.get_last_k_turns(
            memory_id=self.memory_id,
            actor_id=event.agent.state.get("actor_id"),
            session_id=event.agent.state.get("session_id"),
            k=100  # Tải tối đa 100 lượt trò chuyện trước
        )

        if conversations:
            # Định dạng lịch sử cuộc trò chuyện cho ngữ cảnh
            context_messages = []
            for turn in reversed(conversations):
                for message in turn:
                    context_messages.append(f"{message['role']}: {message['content']}")

            # Chèn vào prompt của agent
            event.agent.system_prompt += f"\n\nCuộc trò chuyện gần đây:\n{'\n'.join(context_messages)}"

Hook 2: Bộ nhớ dài hạn (LongTermMemoryHook)

python Copy
class LongTermMemoryHook(HookProvider):
    def register_hooks(self, registry: HookRegistry) -> None:
        registry.add_callback(BeforeInvocationEvent, self.on_before_invocation)

    def on_before_invocation(self, event: BeforeInvocationEvent) -> None:
        # Chỉ xử lý tin nhắn của người dùng
        last_message = event.agent.messages[-1]
        if last_message.get("role") != "USER":
            return

        user_query = last_message.get("content", "")

        # Tìm kiếm ngữ nghĩa cho bộ nhớ liên quan
        retrieved_memories = retrieve_memories_for_actor(
            memory_id=self.memory_config.memory_id,
            actor_id=event.agent.state.get("actor_id"),
            search_query=user_query,
            memory_client=self.memory_client
        )

        if retrieved_memories:
            # Định dạng và chèn bộ nhớ vào ngữ cảnh
            memory_context = format_memory_context(retrieved_memories)
            event.agent.system_prompt += f"\n\nNgữ cảnh bộ nhớ dài hạn liên quan:\n{memory_context}"

Điểm vào chính của agent

python Copy
from bedrock_agentcore import BedrockAgentCoreApp
from strands import Agent, tool
from strands_tools import calculator

app = BedrockAgentCoreApp()
agent = None

@app.entrypoint
def invoke(payload: Dict[str, Any], context: Optional[RequestContext] = None) -> Dict[str, Any]:
    """Điểm vào agent AI"""   
    global agent

    actor_id = payload.get("actor_id", "my-user-id")
    session_id = context.session_id if context and context.session_id else payload.get("session_id", "DEFAULT")

    if agent is None:
        agent = create_agent(actor_id, session_id)

    user_message = payload.get("prompt", "Giải thích những gì bạn có thể làm cho tôi.")

    try:
        result = agent(user_message)
        return {"result": result.message}
    except Exception as e:
        logger.error("Lỗi trong quá trình gọi agent: %s", e)
        return {"error": "Đã xảy ra lỗi trong quá trình xử lý yêu cầu của bạn"}

def main():
    """Điểm vào chính cho ứng dụng."""
    app.run()

if __name__ == "__main__":
    main()

Kiểm tra tại chỗ

Trước khi triển khai lên đám mây, hãy kiểm tra agent của chúng ta tại chỗ. Đầu tiên, cấu hình cho AgentCore:

bash Copy
agentcore configure -n strandsagent -e src/agentcore_strands_agents/agent.py

Sau đó, khởi động agent tại chỗ:

bash Copy
agentcore launch --local

Triển khai lên sản xuất

Khi bạn đã hài lòng với việc kiểm tra tại chỗ, triển khai lên AWS rất đơn giản:

bash Copy
agentcore launch

Các cân nhắc khi triển khai

Việc kết hợp Strands Agents và AgentCore cung cấp nhiều tính năng sẵn sàng cho sản xuất:

  • Bảo mật: Mỗi phiên chạy trong một microVM cách ly.
  • Khả năng mở rộng: Tự động mở rộng dựa trên nhu cầu.
  • Giám sát: Tích hợp CloudWatch cung cấp nhật ký và số liệu.
  • Bộ nhớ bền vững: Thông tin và cuộc trò chuyện được lưu giữ.

Kết luận

Bài viết này đã hướng dẫn cách xây dựng một AI Agent sẵn sàng cho sản xuất với khả năng ghi nhớ. Hãy tiếp tục thử nghiệm và khám phá thêm về framework này!

Câu hỏi thường gặp

1. Strands Agents là gì?

Strands Agents là framework giúp xây dựng AI Agents với kiến trúc dựa trên hooks.

2. Làm thế nào để triển khai agent lên AWS?

Sử dụng câu lệnh agentcore launch để triển khai agent lên AWS.

3. Bộ nhớ của agent hoạt động như thế nào?

Bộ nhớ lưu giữ thông tin từ các phiên trước để tái sử dụng trong các cuộc trò chuyện tiếp theo.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào