Thiết lập và sử dụng AI cho nhà phát triển

Thiết lập và sử dụng AI cho nhà phát triển
Nội dung

    Mô hình Phi-4 của Microsoft là mô hình ngôn ngữ nhỏ (SLM) 14 tỷ tham số tiên tiến, được thiết kế để vượt trội trong các nhiệm vụ lý luận, bao gồm toán học, hiểu ngôn ngữ và giải quyết vấn đề.
    Không giống như nhiều mô hình ngôn ngữ lớn, Phi-4 tập trung vào hiệu quả và khả năng truy cập, khiến nó trở thành một công cụ đa năng cho các nhà phát triển.

    Phi-4

    https://medium.com/@pankaj_pandey/58ca1e986208

    https://pub.towardsai.net/phi-4-multimodal-phi-4-mini-747852fd2688

    Phi-4 của Microsoft được xây dựng dựa trên khả năng lý giải tiên tiến của dòng sản phẩm tiền nhiệm (mẫu 14B) và đưa ra hai mẫu sản phẩm:

    1. Phi-4-Multimodal: Một mô hình đa phương thức hoàn chỉnh tích hợp văn bản, hình ảnh và âm thanh. Nó sử dụng “Hỗn hợp LoRA” để bạn có thể thêm bộ điều hợp cụ thể cho từng phương thức mà không cần đào tạo lại mô hình cơ sở.
    2. Phi-4-Mini: Với 3,8 tỷ tham số, Phi-4-Mini cung cấp khả năng hỗ trợ đa ngôn ngữ nâng cao, khả năng suy luận mạnh mẽ và thậm chí cả chức năng gọi hàm — tất cả trong một kiến ​​trúc nhỏ gọn.

    Nó có hiệu suất cao hơn các mô hình lớn hơn trong các nhiệm vụ như giải quyết vấn đề toán học và suy luận logic.
    Kết hợp dữ liệu tổng hợp để nâng cao chất lượng đào tạo. Nhỏ gọn nhưng mạnh mẽ với 14 tỷ thông số, yêu cầu ít hơn…
    Xử lý dữ liệu đầu vào lên đến 16.000 mã thông báo, cho phép tương tác dài hơn và phức tạp hơn.
    Có sẵn theo Giấy phép MIT cho mục đích sử dụng học thuật và thương mại.
    Chạy cục bộ với các khung như Ollama, Hugging Face Transformers, LM Studio và Open WebUI.

    Các trường hợp sử dụng chính

    Mô hình này được thiết kế để sử dụng cho mục đích thương mại và nghiên cứu đa ngôn ngữ và đa phương thức. Mô hình này cung cấp các ứng dụng cho các hệ thống và ứng dụng AI mục đích chung yêu cầu:

    • Môi trường hạn chế bộ nhớ/tính toán
    • Các tình huống bị ràng buộc độ trễ
    • Lý luận mạnh mẽ (đặc biệt là toán học và logic)
    • Gọi hàm và công cụ
    • Hiểu biết chung về hình ảnh
    • Nhận dạng ký tự quang học
    • Hiểu biểu đồ và bảng
    • So sánh nhiều hình ảnh
    • Tóm tắt nhiều hình ảnh hoặc video clip
    • Nhận dạng giọng nói
    • Bản dịch giọng nói
    • Kiểm tra chất lượng giọng nói
    • Tóm tắt bài phát biểu
    • Hiểu âm thanh

    Mô hình này được thiết kế để đẩy nhanh quá trình nghiên cứu về ngôn ngữ và các mô hình đa phương thức, nhằm mục đích sử dụng làm nền tảng cho các tính năng hỗ trợ AI tạo ra.

    Sử dụng Ollama

    Ollama là một khuôn khổ nhẹ được thiết kế để triển khai cục bộ các mô hình ngôn ngữ. Hệ thống sử dụng Python 3.8 trở lên. Đủ tài nguyên GPU và RAM.

    Cài đặt Ollama:

    # Tải xuống Ollama từ trang web chính thức

    curl -fsSL https://ollama.com/install.sh | sh

    Mac: brew install ollama

    Windows thì phài cài WSL (Windows Subsystem for Linux)

    Ollama cung cấp một sở thú mô hình sẵn sàng sử dụng mà bạn có thể chạy bằng một dòng mã duy nhất: ollama run <anymodel>. Điều này sẽ cho phép bạn chạy bất kỳ mô hình nào được liệt kê trong kho lưu trữ mô hình Ollama trong thiết bị đầu cuối của bạn một cách dễ dàng. Ví dụ: ollama run qwen2.5:14b –verbose.Tôi đã thêm –verbose để bạn có thể thấy hiệu suất của token mỗi giây (tok/giây).

    Cũng có thể chạy bất kỳ mô hình Hugging Face GGUF nào trực tiếp. Tất cả những gì bạn cần là liên kết kho lưu trữ Hugging Face và Ollama sẽ lo phần còn lại. Sử dụng định dạng lệnh sau:

    ollama run hf.co/{username}/{repository}

    Ví dụ: ollama run hf.co/bartowski/Llama-3.2-1B-Instruct-GGUF

    Khi bạn chạy một mô hình bằng Ollama, bạn có tùy chọn chọn một phương pháp lượng tử hóa từ những phương pháp có sẵn trong kho lưu trữ của mô hình. Nếu bạn không chỉ định một phương pháp, Ollama sẽ sử dụng lược đồ Q4_K_M mặc định nếu có. Nếu không, nó sẽ chọn một phương pháp lượng tử hóa phù hợp khác từ kho lưu trữ. Tại sao nên sử dụng lượng tử hóa tùy chỉnh, vì: 1. Tối ưu hóa hiệu suất : Các lược đồ lượng tử hóa tùy chỉnh có thể giúp bạn điều chỉnh hiệu suất mô hình dựa trên khả năng của phần cứng. 2. Hiệu quả bộ nhớ : Các phương pháp lượng tử hóa khác nhau giúp giảm mức sử dụng bộ nhớ, cho phép bạn chạy các mô hình lớn hơn trên các máy nhỏ hơn. 3. Tính linh hoạt : Bạn có thể kiểm soát phương pháp lượng tử hóa nào sẽ sử dụng, cho phép bạn đạt được sự cân bằng giữa tốc độ và độ chính xác.

    Mỗi loại lượng tử hóa cung cấp các sự đánh đổi khác nhau giữa việc sử dụng bộ nhớ và hiệu suất mô hình. Sau đây là một số lược đồ lượng tử hóa phổ biến mà bạn có thể gặp phải:

    Q4_K_M : Đây là mặc định và cân bằng tốt giữa tốc độ và độ chính xác.
    IQ3_M : Lượng tử hóa mạnh mẽ hơn, hữu ích khi tài nguyên bị hạn chế.
    Q5_1 : Cung cấp độ chính xác tốt hơn khi tăng nhẹ mức sử dụng bộ nhớ.

    Bạn có thể dễ dàng ghi đè lượng tử hóa mặc định bằng cách chỉ định lược đồ mong muốn trong lệnh của bạn. Sau đây là định dạng để chạy mô hình Hugging Face với tùy chọn lượng tử hóa tùy chỉnh trong Ollama: ollama run hf .co /{tên người dùng}/{kho lưu trữ}:{lượng tử hóa}

    Ví dụ, nếu bạn muốn chạy mô hình Llama 3.2 3B-Instruct GGUF bằng cách sử dụng lược đồ lượng tử hóa IQ3_M , bạn sẽ sử dụng:

    ollama chạy hf.co/bartowski/Llama-3.2-3B-Instruct-GGUF:IQ3_M

    Nhận lấy link bằng cách như sau:Thiết lập và sử dụng AI cho nhà phát triển

    Thiết lập và sử dụng AI cho nhà phát triển

    Thiết lập và sử dụng AI cho nhà phát triển

    Tải xuống Mô hình Phi-4: ollama pull phi4
    Chạy mô hình: ollama run phi4
    Tương tác thông qua Python: Cài đặt thư viện Ollama Python:

    pip install ollama
    Ví dụ về tập lệnh Python:

    from ollama import chat
    model_name = “phi4”
    prompt = “Explain the theory of relativity.” //Giải thích về thuyết tương đối.
    response = chat(
    model=model_name,
    messages=[
    {“role”: “user”, “content”: prompt}
    ] )
    print(response[“message”][“content”])

    Chúng ta đang chạy Ollama với các tham số mặc định. Vậy nếu chúng ta muốn sửa đổi chúng thì sao? https://henrynavarro.org/ollama-vs-vllm-which-framework-is-better-for-inference-part-i-d8211d7248d2

    Để tạo mô hình của riêng bạn với các tham số cụ thể, bạn sẽ cần tạo Modelfile, một tệp văn bản thuần túy duy nhất chứa các tham số bạn muốn đặt. Sau đây là một ví dụ:

    FROM qwen2.5:14b

    # đặt nhiệt độ thành 1 [cao hơn là sáng tạo hơn, thấp hơn là mạch lạc hơn]

    PARAMETER temperature 0.5

    # đặt kích thước cửa sổ ngữ cảnh thành 8192, điều này kiểm soát số lượng mã thông báo mà LLM có thể sử dụng làm ngữ cảnh để tạo mã thông báo tiếp

    PARAMETER num_ctx 8192

    # mã thông báo cần tạo được đặt thành 4096 (tối đa)

    PARAMETER num_predict 4096

    # Cấu hình lời nhắc hệ thống Bạn là trợ lý AI hữu ích.

    SYSTEM “”“You are a helpful AI assistant.”“”

    Để xây dựng và chạy mô hình tùy chỉnh của bạn:

    # Xây dựng mô hình
    ollama create mymodel -f Modelfile

    # Chạy mô hình
    ollama run mymodel –verbose

    Danh sách điều chỉnh thông số này

    Ollama cung cấp hai cách để tương tác với các mô hình:

    1. Native REST API

    Ollama chạy máy chủ cục bộ trên cổng 11434 theo mặc định. Bạn có thể tương tác với nó bằng các yêu cầu HTTP chuẩn:

    import requests

    # Yêu cầu hoàn tất trò chuyện cơ bản
    response = requests.post(‘http://<your_ollama_server_ip>:11434/api/chat’,
    json={
    ‘model’: ‘qwen2.5:14b’,
    ‘messages’: [
    {
     ‘role’: ‘system’,
     ‘content’: ‘You are a helpful AI assistant.’
    },
    {
    ‘role’: ‘user’,
    ‘content’: ‘What is artificial intelligence?’
    }
    ],
    ‘stream’: False
    }
    )
    print(response.json()[‘message’][‘content’])

    2. Lớp tương thích OpenAI

    Để tích hợp liền mạch với các ứng dụng hiện có, Ollama cung cấp khả năng tương thích API OpenAI. Trước tiên, hãy khởi động máy chủ tương thích OpenAI:

    Để sử dụng với OpenAI Python SDK:

    from openai import OpenAI

    client = OpenAI(
    base_url=“http://<your_ollama_server_ip>:11434/v1”,
    api_key=“dummy” # vLLM chấp nhận yêu cầu khóa API, một trong những lợi thế của nó so với ollama. Trong trường hợp của chúng tôi, chúng tôi đặt None, vì vậy bạn có thể đặt bất kỳ chuỗi nào.
    )

    # Chat Phản hồi hoàn thành
    response = client.chat.completions.create(
    model=“qwen2.5:14b”,
    messages=[
    {“role”: “system”, “content”: “You are a helpful assistant.”},
    {“role”: “user”, “content”: “What is artificial intelligence?”}
    ] )
    print(response.choices[0].message.content)

    API của Ollama đi kèm với các tính năng thiết yếu giúp nó trở thành lựa chọn mạnh mẽ cho các nhà phát triển. Chúng tôi sẽ trình bày chi tiết tất cả các ưu điểm và nhược điểm của khuôn khổ này trong Phần III của hướng dẫn này, trong khi đó, hãy liệt kê các tính năng chính:

    Hỗ trợ phát trực tuyến: Tạo mã thông báo theo thời gian thực đảm bảo khả năng tương thích hoàn toàn với API OpenAI, hoàn hảo để tạo các ứng dụng phản hồi.

    Quản lý nhiều mô hình: Khả năng chạy nhiều mô hình cùng lúc, tuy nhiên có một lưu ý: Ollama sẽ dừng một mô hình để chạy mô hình khác khi VRAM bị giới hạn, điều này đòi hỏi phải lập kế hoạch tài nguyên cẩn thận.

    Kiểm soát tham số: Cài đặt có thể tùy chỉnh cao thông qua lệnh gọi API — một con dao hai lưỡi mang lại tính linh hoạt cao nhưng có thể gây choáng ngợp cho người mới bắt đầu và máy chủ sản xuất.

    Khả năng tương thích CPU: Quản lý tài nguyên thông minh tự động chuyển các lớp mô hình sang CPU khi VRAM không đủ, giúp có thể chạy các mô hình lớn ngay cả trên các hệ thống có bộ nhớ GPU hạn chế

    Không phụ thuộc ngôn ngữ: Tự do sử dụng ngôn ngữ lập trình ưa thích của bạn, cho dù đó là Python, JavaScript, Go hay bất kỳ ngôn ngữ nào có khả năng HTTP

    Ollama một khuôn khổ mạnh mẽ và thân thiện với người dùng để chạy LLM cục bộ. Từ quy trình cài đặt đơn giản đến khả năng API linh hoạt, Ollama nổi bật với sự đơn giản và dễ sử dụng, khiến nó trở thành một lựa chọn hấp dẫn cho các nhà phát triển muốn thử nghiệm với LLM nguồn mở.

    Hugging Face

    Sự có mặt của Phi-4 trên Hugging Face giúp đơn giản hóa quá trình tích hợp cho các nhà phát triển Python.

    Cài đặt phụ thuộc: pip install torch torchvision transformers accelerate
    Tải xuống và cấu hình mô hình:

    từ máy biến áp nhập AutoModelForCausalLM, AutoTokenizer

    from transformers import AutoModelForCausalLM, AutoTokenizer
    model_name = “microsoft/phi4”
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model = AutoModelForCausalLM.from_pretrained(model_name, device_map=“auto”, torch_dtype=“auto”)
    Chạy suy luận:
    input_text = “Describe quantum entanglement.” //”Mô tả sự vướng víu lượng tử.”
    inputs = tokenizer(input_text, return_tensors=“pt”).to(model.device)
    outputs = model.generate(**inputs, max_new_tokens=150)
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)
    print(response)

    Sử dụng LM Studio

    LM Studio cung cấp môi trường dựa trên GUI để chạy Phi-4.

    Các bước thực hiện:

    Tải xuống LM Studio: Cài đặt LM Studio từ trang web chính thức .
    Tải Phi-4: Tìm kiếm Phi-4 trong thư viện mô hình và tải xuống.
    Tương tác thông qua GUI: Nhập lời nhắc vào giao diện để nhận phản hồi theo thời gian thực.

    Dùng vLLM

    # Cài đặt vLLM từ pip:
    pip install vllm

    # Tải và chạy mô hình:
    vllm serve “microsoft/Phi-4-mini-instruct”

    # Gọi máy chủ bằng curl:
    curl -X POST “http://localhost:8000/v1/chat/completions” \
    -H “Content-Type: application/json” \
    –data ‘{
    “model”: “microsoft/Phi-4-mini-instruct”,
    “messages”: [
    {
    “role”: “user”,
    “content”: “Thủ đô của Pháp là gì?”
    }
    ] }’

    Open WebUI

    Đối với các nhà phát triển thích giao diện dựa trên web.

    Các bước thực hiện:

    Cài đặt Open WebUI: Thực hiện theo hướng dẫn thiết lập được cung cấp trên trang GitHub của Open WebUI .
    Tải mô hình: Đảm bảo Phi-4 được thêm vào thư mục mô hình.
    Tương tác thông qua Giao diện Web: Khởi động máy chủ và sử dụng giao diện dựa trên trình duyệt để truy vấn.

    Chạy Open WebUI cục bộ trên máy Mac

    Các bước như sau:

    1.Cài đặtuvx

    brew install uv

    2. Khởi tạo môi trường ảo Python

    mkdir openwebui && cd openwebui
    uv init –python=3.11 .
    uv venv
    source .venv/bin/activate

    3. Cài đặt WebUI mở

    uv pip install open-webui

    4. Chạy ứng dụng

    open-webui serve

    Gio thi truy cập Open WebUI thông qua: http://0.0.0.0:8080

    Đối với những người thích tự động hóa, bạn có thể thêm một tập lệnh vào shell của mình.

    đoạn mã được cung cấp:

    #!/bin/bash
    # Function to start OpenWebUI
    startwebui() {
    if pgrep -f “open-webui serve” > /dev/null; then
    echo “OpenWebUI is already running”
    return 1
    fi
    (source “$HOME/openwebui/.venv/bin/activate” &&
    open-webui serve > “$HOME/logs/webui.log” 2>&1 &)
    echo “OpenWebUI started. Logs at ~/logs/webui.log”
    }
    # Function to stop OpenWebUI
    stopwebui() {
    pkill -f “open-webui serve”
    echo “OpenWebUI stopped”
    }

    Thực hiện Script

    chmod +x ~/scripts/webui-control.sh

    source ~/scripts/webui-control.sh

    bạn có thể sử dụng Automator để tạo một ứng dụng Mac mà bạn có thể nhấp đúp, thêm vào thanh dock,

    Mở Automatorứng dụng
    Chọn loại “Ứng dụng”
    Nhập “chạy” vào hộp tìm kiếm Hành động
    Nhấp đúp vào “Chạy Shell Script”
    Nhấp vào Runnút ở góc trên bên phải để kiểm tra.
    File > Save để tạo Ứng dụng.

    Thiết lập và sử dụng AI cho nhà phát triển

    Mặc dù Phi-4 được tối ưu hóa về hiệu quả nhưng vẫn cần phải đáp ứng các yêu cầu sau để hoạt động trơn tru:

    GPU: Tối thiểu RTX A6000 hoặc tương đương với 48 GB VRAM.
    RAM: Tối thiểu 48 GB.
    Lưu trữ: 40 GB cho các tệp mô hình và các phần phụ thuộc.

    1. Lý luận toán học
    Lời nhắc Prompt:

    Giải phương trình: x^2 – 5x + 6 = 0
    Phản ứng:

    Các nghiệm của phương trình là x = 2 và x = 3.
    2. Tạo mã
    Lời nhắc:

    Viết hàm Python để tính giai thừa (factorial) của một số.
    Phản ứng:

    def factorial(n) :
    if n = = 0 :
    return 1
    else :
    return n * factorial(n -1 )
    print(factorial(5)) # Đầu ra: 120

    Ưu điểm:

    Hiệu suất hiệu quả với thông số 14B.
    Mã nguồn mở và có thể truy cập rộng rãi.
    Linh hoạt trên nhiều khuôn khổ.
    Mạnh về các nhiệm vụ lý luận.

    Nhược điểm:

    Hiệu suất không nhất quán với các truy vấn mơ hồ hoặc cụ thể theo miền.
    Yêu cầu tài nguyên phần cứng lớn để có hiệu suất tối ưu.
    Hiệu suất hạn chế khi thực hiện các tác vụ liên quan đến dữ liệu có cấu trúc như thông tin dạng bảng.

    Microsoft Phi-4 là một bước tiến đáng kể trong quá trình phát triển các mô hình ngôn ngữ hiệu quả, tập trung vào lý luận. Cho dù bạn đang khám phá các tác vụ lý luận nâng cao hay tích hợp AI vào các dự án của mình, Phi-4 đều mang đến sự cân bằng giữa hiệu suất và khả năng truy cập.

    Thiết lập Open WebUI với Docker

    https://medium.com/@mauryaanoop3/harnessing-the-power-of-deepseek-r1-on-cpu-no-code-c91276aae88e

    Tạo một docker-compose.yaml tệp có cấu hình cần thiết:

    services:
    ollama:
    image: ollama/ollama:latest
    container_name: ollama
    volumes:
    ollama:/root/.ollama
    ports:
    “11434:11434”
    restart: unless-stopped

    open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    ports:
    “3000:8080”
    volumes:
    open-webui:/app/backend/data
    extra_hosts:
    “host.docker.internal:host-gateway”
    restart: always

    volumes:
    ollama:
    name: ollama
    open-webui:
    name: open-webui

    Một dịch vụ cho Ollama sử dụng olama/olama hình ảnh.
    Một dịch vụ khác dành cho Open WebUI, kéo hình ảnh từ sổ đăng ký vùng chứa GitHub.
    Ánh xạ các cổng cần thiết để cho phép truy cập UI.
    Bắt đầu dịch vụ bằng cách chạy:

    docker-compose up

    (Lần thiết lập đầu tiên có thể mất khoảng 15–20 phút.)

    Sau khi các container đang chạy, hãy mở trình duyệt và điều hướng đến:

    localhost:3000
    Tạo một tài khoản nếu được nhắc

    Công việc lặp đi lặp lại nên cần tự động hoá

    Các công việc lặp đi lặp lại thường tiêu tốn rất nhiều thời gian và nguồn lực nhân sự mà không mang lại giá trị gia tăng đáng kể. Tự động hóa chúng có thể dẫn đến hiệu suất lao động cao hơn, giảm thiểu sai sót và nâng cao khả năng phản ứng của doanh nghiệp với sự thay đổi. Bằng cách loại bỏ các công việc lặp đi lặp lại, nhân viên có thể tập trung vào các hoạt động sáng tạo và chiến lược mà con người làm tốt hơn. Một công cụ tự động hóa công việc có thể giúp các doanh nghiệp tiếp cận hiệu quả cao hơn trong việc tự động hóa. N8n cho phép tạo ra các luồng làm việc linh hoạt, kết nối các ứng dụng và dịch vụ khác nhau một cách hiệu quả. Với giao diện trực quan và dễ sử dụng, ngay cả những ai không có kinh nghiệm chuyên sâu cũng có thể xây dựng các luồng tự động hóa phức tạp. Việc triển khai n8n trên máy server là một bước đi chiến lược, giúp doanh nghiệp không chỉ cải thiện hiệu quả hoạt động mà còn có thể phát triển và điều chỉnh các luồng tự động hóa để phù hợp với các yêu cầu mới.

    n8n trên Raspberry Pi chạy Debian 12 (Raspbian Bookworm).

    Raspberry Pi 4 là một thiết bị phổ biến để chạy các máy chủ nhỏ hoặc các dự án DIY, và cài đặt n8n trên nó có thể rất hữu ích cho việc tự động hóa các tác vụ.

    Cập Nhật Hệ Thống: sudo apt update && sudo apt upgrade -y

    Raspberry Pi OS (Debian 12) thường không đi kèm với phiên bản mới nhất của Node.js, nên bạn cần tải và cài đặt từ nguồn chính thức.

    curl -fsSL https://deb.nodesource.com/setup_18.x | sudo bash –

    – Sau đó, cài đặt Node.js và npm (quản lý gói cho Node): sudo apt install -y nodejs

    Xác nhận rằng Node.js và npm đã được cài đặt thành công: node -v npm -v

    Sử dụng lệnh sau để cài đặt n8n toàn cục (trên toàn hệ thống): sudo npm install -g n8n

    bạn có thể khởi chạy n8n bằng lệnh sau: n8n start

    Để đảm bảo rằng n8n khởi động lại khi Raspberry Pi của bạn khởi động, bạn có thể sử dụng `systemd` để tạo một service. Tạo file cấu hình cho systemd: sudo nano /etc/systemd/system/n8n.service

    Thêm nội dung sau vào file đó (thay `<your-user>` bằng tên người dùng của bạn):

    [Unit]

    Description=n8n Workflow Automation Tool

    After=syslog.target network-online.target

    [Service]

    Type=simple

    User=<your-user>

    Group=pi

    Environment=”PATH=/usr/bin:/usr/local/bin”

    WorkingDirectory=/home/<your-user>

    ExecStart=/usr/local/lib/node_modules/n8n/dist/index.js start –tunnel=false –host=0.0.0.0 –port=5678

    Restart=on-failure

    [Install]

    WantedBy=multi-user.target

    Lưu và thoát (`CTRL + X`, sau đó `Y` để lưu thay đổi).

    Sau khi tạo file service, hãy khởi động và kích hoạt n8n với các lệnh sau:

    sudo systemctl daemon-reload

    sudo systemctl start n8n.service

    sudo systemctl enable n8n.service

    PM2 (Process Manager 2) là một trình quản lý tiến trình mã nguồn mở, miễn phí và phổ biến dành cho các ứng dụng Node.js. Nó giúp bạn quản lý và duy trì các ứng dụng Node.js trong môi trường sản xuất một cách dễ dàng và hiệu quả.

    Cài đặt pm2: npm install -g pm2
    Khởi động n8n với pm2: pm2 start n8n
    Dừng n8n với pm2: pm2 stop n8n
    Khởi động lại n8n với pm2: pm2 restart n8n
    Xem nhật ký n8n với pm2: pm2 logs n8n
    Khởi động n8n khi khởi động hệ thống: pm2 startup systemd và làm theo hướng dẫn.

    Cấu hình Nginx

    Tạo hoặc chỉnh sửa một file cấu hình Nginx, thường được lưu trong `/etc/nginx/sites-available/`, để phục vụ giao diện web của n8n. Sau đó, bạn sẽ kích hoạt file cấu hình đó và khởi động lại dịch vụ Nginx.

    sudo nano /etc/nginx/sites-available/n8n.conf

    Thêm nội dung sau vào file cấu hình;

    server {

    listen 80;

    server_name <your-domain>;

    location / {

    proxy_pass http://localhost:5678; # Địa chỉ của n8n

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header X-Forwarded-Proto $scheme;

    } }

    server {

    listen 443 ssl http2;

    server_name <your-domain>;

    ssl_certificate /etc/letsencrypt/live/<your-domain>/fullchain.pem; # Đường dẫn tới chứng chỉ SSL của bạn

    ssl_certificate_key /etc/letsencrypt/live/<your-domain>/privkey.pem; # Đường dẫn tới khóa riêng tư của bạn

    location / { proxy_pass http://localhost:5678;

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header X-Forwarded-Proto $scheme;

    } }

    Tạo một liên kết tượng trưng từ `/etc/nginx/sites-available/` đến `/etc/nginx/sites-enabled/`.

    sudo ln -s /etc/nginx/sites-available/n8n.conf /etc/nginx/sites-enabled/

    cách chạy lệnh kiểm tra. sudo nginx -t

    sudo systemctl restart nginx

    Phiên bản miễn phí trên n8n đặt ra một số giới hạn về số lượng quy trình làm việc và người dùng. Ngoài ra, tài liệu có phần hạn chế và ứng dụng này đòi hỏi tư duy kỹ thuật. n8n được tổ chức xung quanh ba khái niệm chính, quy trình làm việc , nút và kết nối .

    • Luồng công việc : Luồng công việc chứa toàn bộ chuỗi sự kiện trong một đường ống. Nó bao gồm nhiều nút được liên kết với nhau bằng logic nội bộ.
    • Node : Một node là một tác vụ hoặc hành động cụ thể trong một quy trình làm việc lớn hơn. Mỗi node đại diện cho một tác vụ mô-đun và độc lập, chẳng hạn như truy xuất dữ liệu hoặc chạy một tập lệnh. Người dùng có thể dựa các node vào một thư viện các node Core hoặc Actions . Các node Core chứa các chức năng cơ bản được sử dụng rộng rãi, trong khi các Actions tương tác với các ứng dụng và dịch vụ bên ngoài. Người dùng cũng có thể tạo các node tùy chỉnh.
    • Kết nối : Kết nối liên kết hai nút với nhau, tạo thành chuỗi thực thi trong quy trình làm việc. Thông thường, đầu ra của một nút bao gồm đầu vào của nút tiếp theo.

    Thực thi đề cập đến một trường hợp chạy một quy trình công việc. Mỗi lần thực thi được liên kết với một trình kích hoạt. Trình kích hoạt bắt đầu quy trình công việc khi nó nhận được một sự kiện hoặc điều kiện đủ điều kiện. Ở chế độ thủ công, người dùng phải cố ý thực hiện quy trình công việc bằng trình kích hoạt thủ công. Các quy trình công việc không hoạt động chỉ có thể được khởi chạy thủ công. Ở chế độ sản xuất, một sự kiện hoặc điều kiện bên trong hoặc bên ngoài có thể tự động kích hoạt quy trình công việc. Ví dụ: bộ hẹn giờ có thể khởi chạy quy trình công việc theo lịch trình được xác định trước. n8n chứa một thư viện cốt lõi của các trình kích hoạt tích hợp sẵn .

    Để triển khai chuỗi các nút, người dùng có thể chọn từ thư viện n8n lớn về tích hợp tích hợp . Tích hợp là mẫu cho một loại tác vụ nhất định. Người dùng tùy chỉnh từng nút bằng các chi tiết cụ thể của ứng dụng để tích hợp vào quy trình làm việc.

    Thư viện tích hợp chứa một số lượng lớn các Nút lõi và Hành động tích hợp sẵn . Các Nút lõi triển khai các tác vụ cơ bản như thực thi tập lệnh shell, logic có điều kiện và truy cập tệp/cơ sở dữ liệu. Bộ sưu tập này cũng hỗ trợ các giao thức và tiêu chuẩn phổ biến bao gồm FTP, GraphQL, Git, HTML, LDAP, Markdown, SSH và XML. Các nút được chỉ định là Hành động có thể kết hợp các ứng dụng, dịch vụ và công cụ bên ngoài. Thư viện Hành động bao gồm hỗ trợ cho nhiều nền tảng khác nhau, bao gồm Facebook, Eventbrite, GitHub, Jira, Gmail, Shopify, Trello, Twitter và nhiều nền tảng khác. Ví dụ: nút Bitly cho phép quy trình làm việc tự động hóa các tác vụ Bitly, ví dụ như tạo, truy xuất hoặc cập nhật liên kết Bitly.

    Là một nguồn tài nguyên bổ sung, các nút cộng đồng và tích hợp của bên thứ ba có sẵn. Người dùng cũng có thể tạo các nút của riêng họ để kết hợp chức năng tùy chỉnh hoặc tích hợp với các hệ thống nội bộ. Để biết thông tin về cách tạo nút tùy chỉnh, hãy xem tài liệu nút tùy chỉnh n8n.

     

    https://www.linode.com/docs/guides/how-to-use-n8n-to-automate-workflows/

    Biến Raspberry Pi thành một AI Agentic RAG cục bộ bằng LLM nguồn mở

    Dùng PyTorch chuyển đổi PDF sang Markdown
    Nội dung

      Cùng bắt đầu xây dựng một tác nhân AI, cung cấp kiến ​​thức từ hướng dẫn sử dụng của tất cả các thiết bị của mình và để nó trả lời các câu hỏi của mình khi cần. Tác nhân này chạy trên Raspberry Pi của mình và luôn sẵn sàng giúp mình. Có nhiều khuôn khổ ngoài kia giúp bạn xây dựng các tác nhân AI. LlamaIndex là khuôn khổ tôi đã chọn, nhưng bạn có thể xây dựng nó bằng bất kỳ khuôn khổ tác nhân nào. Vì tôi muốn ứng dụng này chạy miễn phí, tôi đã sử dụng LLM nguồn mở cho dự án. Ollama rất tuyệt vời cho mục đích này, cho phép bạn tải xuống LLM nguồn mở.

      Trong bài viết này chúng ta đã xem xét:

      • Cách xây dựng tác nhân RAG và ReAct bằng LlamaIndex.
      • Các yếu tố cần cân nhắc khi chạy chương trình này trên máy có công suất thấp như Raspberry Pi.
      • Sử dụng Streamlit để xây dựng giao diện người dùng đơn giản cho ứng dụng.

      Chuẩn bị không gian cho hướng dẫn sử dụng

      Bắt đầu bằng cách thu thập các hướng dẫn sử dụng mà bạn muốn AI truy cập và lưu chúng vào một thư mục cụ thể. Tôi chỉ cần tải mọi thứ lên trong thư mục này: docs/user_manuals.

      Xây dựng một công cụ truy vấn từ các tài liệu

      Tiếp theo, chúng ta cần xử lý bit RAG của tác nhân AI này. Điều này bao gồm việc lấy các tệp PDF từ thư mục, đọc và phân đoạn chúng, chuyển đổi các khối thành nhúng và lưu chúng vào cơ sở dữ liệu vector. Đây là tổng quan rất nhanh về khía cạnh chuẩn bị dữ liệu của RAG và người đọc được khuyến khích tìm hiểu sâu hơn về nó. Mặc dù quá trình này nghe có vẻ phức tạp, nhưng may mắn thay, LlamaIndex cho phép chúng ta thực hiện điều này chỉ với 3 dòng mã:

      documents = SimpleDirectoryReader(“docs/user_manuals”).load_data(show_progress=True)”docs/user_manuals”).load_data(show_progress=True)
      index = VectorStoreIndex.from_documents(documents, show_progress=True)
      query_engine = index.as_query_engine()

      Tuy nhiên, trước khi xác định chỉ mục và công cụ truy vấn, mô hình LLM nhúng cần phải được thay đổi. LlamaIndex sử dụng các mô hình OpenAI theo mặc định, nhưng bạn có thể sử dụng bất kỳ mô hình nào bạn thích. Trong trường hợp của tôi, việc sử dụng mô hình nguồn mở từ Ollama có thể được thực hiện như sau:

      Settings.embed_model = OllamaEmbedding(model_name=”all-minilm:22m”)“all-minilm:22m”)

      Người đọc được khuyến khích thử nghiệm với các mô hình nhúng khác nhau. Tôi đã thành công khác nhau với những mô hình tôi đã thử, chẳng hạn nhưnomic-embed-text, nhưngall-minilm:22mcho tôi thành công nhất. Với mô hình nomic, nó thường không phân tích cú pháp và nhúng một số phần nhất định của một số tài liệu. Bạn có thể thử mã khởi động 5 dòng do LlamaIndex cung cấp để kiểm tra hiệu suất của các mô hình nhúng:LlamaIndex — LlamaIndex. Tuy nhiên, tôi quyết định không sử dụng mã đó cho dự án của mình vì tôi muốn tác nhân của mình suy luận thông qua phản hồi mà nó nhận được từ công cụ truy vấn — tôi sẽ nói thêm về điều đó sau.

      Xây dựng tác nhân ReAct

      Mộttác nhân ReAct, viết tắt của Reason + Act, là một tác nhân lý luận suy nghĩ và hành động từng bước để giải quyết một nhiệm vụ phức tạp. Khá đơn giản để tạo một tác nhân ReAct trong LlamaIndex và cung cấp cho nó các công cụ. Đầu tiên, chúng ta sẽ chuyển đổi công cụ truy vấn được xác định trước đó thành một công cụ mà tác nhân có thể sử dụng:

      user_manual_query_tool = QueryEngineTool.from_defaults(
      query_engine,
      name=”user_manual_query_tool”,”user_manual_query_tool”,
      description=(
      “A RAG engine with various user manuals of appliances.”,
      “Use a detailed plain text question as input to the tool.”),
      )

      Bước tiếp theo là xác định tác nhân ReAct, cung cấp cho nó quyền truy cập vào công cụ truy vấn hướng dẫn sử dụng:

      system_prompt = “”””””
      System prompt:

      You are an AI assistant specialized in answering questions about appliances using information from user manuals.

      1. Always rely on the **user_manual_query_tool** to retrieve information; do not use prior knowledge.
      2. If a query cannot be answered using the tool, respond with: “I cannot find this information in the user manuals provided.”
      3. Do not attempt to generate answers without using the tool.
      4. Give detailed responses to the user’s queries, explaining everything in steps.
      5. Return the response in markdown format.

      Note: The tool name is **user_manual_query_tool**, and it should be used for all queries.
      “””

      self.agent = ReActAgent.from_tools(
      tools=[user_manual_query_tool],
      verbose=True,
      context=system_prompt
      )

      Tôi cũng đã định nghĩa một lời nhắc hệ thống cho tác nhân ở trên, để tôi có được câu trả lời nhất quán cho các truy vấn của mình từ hướng dẫn sử dụng. Nếu không có lời nhắc này, đôi khi tôi thấy tác nhân trả về phản hồi từ kiến ​​thức của riêng mình, thay vì truy vấn chỉ mục kiến ​​thức.

      Ngoài ra, LlamaIndex sử dụng OpenAI LLM làm mặc định, nhưng chúng ta có thể dễ dàng thay đổi cài đặt để sử dụng Ollama:

      Settings.llm = Ollama(model=”llama3.1″)”llama3.1″)

      Tuy nhiên, tại thời điểm này, tôi bắt đầu nghi ngờ liệu điều này có thể chạy trên Raspberry Pi của tôi hay không, vì phải dựa vào llama3.1 (tham số 8b) có thể là một mô hình mạnh mẽ để chạy trên Raspberry Pi. Để kiểm tra mọi thứ, tôi đã tạo một lớp cho tác nhân:

      from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
      from llama_index.llms.ollama import Ollama
      from llama_index.embeddings.ollama import OllamaEmbedding
      from llama_index.core.agent import ReActAgent
      from llama_index.core.tools import QueryEngineTool
      import time
      import nest_asyncio

      nest_asyncio.apply()

      class UserManualAgent:
      _instance = None

      def __new__(cls, *args, **kwargs):
      if cls._instance is None:
      cls._instance = super(UserManualAgent, cls).__new__(cls, *args, **kwargs)
      return cls._instance

      def __init__(self):
      if not hasattr(self, ‘initialized’):
      Settings.embed_model = OllamaEmbedding(model_name=”all-minilm:22m”)
      Settings.llm = Ollama(model=”llama3.1″)

      documents = SimpleDirectoryReader(“docs/user_manuals”).load_data(show_progress=True)
      index = VectorStoreIndex.from_documents(documents, show_progress=True)
      query_engine = index.as_query_engine()

      user_manual_query_tool = QueryEngineTool.from_defaults(
      query_engine,
      name=”user_manual_query_tool”,
      description=(
      “A RAG engine with various user manuals of appliances.”,
      “Use a detailed plain text question as input to the tool.”),
      )

      system_prompt = “””
      System prompt:

      You are an AI assistant specialized in answering questions about appliances using information from user manuals.

      1. Always rely on the **user_manual_query_tool** to retrieve information; do not use prior knowledge.
      2. If a query cannot be answered using the tool, respond with: “I cannot find this information in the user manuals provided.”
      3. Do not attempt to generate answers without using the tool.
      4. Give detailed responses to the user’s queries, explaining everything in steps.
      5. Return the response in markdown format.

      Note: The tool name is **user_manual_query_tool**, and it should be used for all queries.
      “””

      self.agent = ReActAgent.from_tools(
      tools=[user_manual_query_tool],
      verbose=True,
      context=system_prompt
      )

      print(“done initializing agent”)
      self.initialized = True

      def query(self, question):
      print(“user query: “, question)
      start_time = time.time()
      try:
      response = self.agent.chat(question)
      response_time = time.time() – start_time
      print(“response time: “, response_time)
      except ValueError as e:
      response = “I cannot find this information in the user manuals provided.”
      print(e)
      return response

      if __name__ == “__main__”:
      agent = UserManualAgent()
      response = agent.query(“How to setup the Roborock vacuum?”)
      print(response)

      Lưu ý rằng tôi đã tạo một singleton cho lớp này, do đó các lệnh gọi riêng biệt đến hàm tạo không khởi tạo tác nhân nhiều lần.

      Tối ưu hóa tác nhân cho Raspberry Pi

      Bước tiếp theo là cài đặt Ollama và các mô hình phụ thuộc trên Raspberry Pi, kéo mã đã đề cập ở trên, cài đặt tất cả các phụ thuộc và chạy lớp để xem nó có hoạt động không. Và như tôi lo sợ, LLM đã hết thời gian chờ khi phản hồi. Tuy nhiên, tôi nên đề cập rằng tôi đã có thể chạy và trò chuyện với llama3.1 trên Raspberry Pi một mình. Tuy nhiên, nó không hoạt động hoàn toàn với tác nhân ReAct. Tôi bắt đầu thử nghiệm xung quanh với các mô hình Ollama khác nhau và các giá trị thời gian chờ và sự kết hợp cuối cùng đã hoạt động là:

      Settings.llm = Ollama(model=”tinyllama”, request_timeout=60*5)”tinyllama”, request_timeout=60*5)

      Sự kết hợp này hầu như không gây ra thời gian chờ, nhưng vẫn chậm. Đối với tôi, thời gian phản hồi nằm trong khoảng 45–60 giây. Có thể đạt được hiệu suất tốt hơn với phiên bản RAM 16 GB của Pi hoặc sử dụng SSD để lưu trữ thay vì thẻ SD và tôi có thể cân nhắc những điều này trong tương lai.

      Đây là hạn chế khi sử dụng một mô hình nhỏ hơn như TinyLlama làm tác nhân lý luận và tôi nhận ra rằng tôi có thể phải thử nghiệm với các mô hình.

      Cuối cùng tôi quyết định thay thế Ollama trong thiết lập của mình bằngOpenRoutervà sử dụng LLM nguồn mở từ đó. Nó có giới hạn về số lượng yêu cầu mà người dùng có thể thực hiện mỗi phút, nhưng là một giải pháp thay thế tuyệt vời khi bạn không có đủ tài nguyên phần cứng để chạy mô hình LLM lớn hơn.

      LlamaIndex cũng cung cấp khả năng tích hợp dễ dàng với OpenRouter. Mã cuối cùng cho lớp hướng dẫn sử dụng như sau:

      from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
      from llama_index.llms.openrouter import OpenRouter
      from llama_index.embeddings.ollama import OllamaEmbedding
      from llama_index.core.agent import ReActAgent
      from llama_index.core.tools import QueryEngineTool

      import nest_asyncio
      nest_asyncio.apply()
      import time
      from dotenv import load_dotenv
      import os
      load_dotenv()

      class UserManualAgent:
      _instance = None

      def __new__(cls, *args, **kwargs):
      if cls._instance is None:
      cls._instance = super(UserManualAgent, cls).__new__(cls, *args, **kwargs)
      return cls._instance

      def __init__(self):
      if not hasattr(self, ‘initialized’):
      Settings.embed_model = OllamaEmbedding(model_name=”all-minilm:22m”)
      llm = OpenRouter(
      api_key=os.getenv(“OPEN_ROUTER_KEY”),
      model=”meta-llama/llama-3.2-3b-instruct:free”,
      request_timeout=60*5
      )

      Settings.llm = llm

      Settings.chunk_size = 700
      Settings.chunk_overlap = 20

      documents = SimpleDirectoryReader(“docs/user_manuals”).load_data(show_progress=True)
      index = VectorStoreIndex.from_documents(documents, show_progress=True)
      query_engine = index.as_query_engine()

      user_manual_query_tool = QueryEngineTool.from_defaults(
      query_engine,
      name=”user_manual_query_tool”,
      description=(
      “A RAG engine with various user manuals of appliances.”,
      “Use a detailed plain text question as input to the tool.”),
      )

      system_prompt = “””
      System prompt:

      You are an AI assistant specialized in answering questions about appliances using information from user manuals.

      1. Always rely on the **user_manual_query_tool** to retrieve information; do not use prior knowledge.
      2. If a query cannot be answered using the tool, respond with: “I cannot find this information in the user manuals provided.”
      3. Do not attempt to generate answers without using the tool.
      4. Give detailed responses to the user’s queries, explaining everything in steps.
      5. Return the response in markdown format.

      Note: The tool name is **user_manual_query_tool**, and it should be used for all queries.
      “””

      self.agent = ReActAgent.from_tools(
      tools=[user_manual_query_tool],
      verbose=True,
      context=system_prompt
      )

      print(“done initializing agent”)
      self.initialized = True

      def query(self, question):
      print(“user query: “, question)
      start_time = time.time()
      try:
      response = self.agent.chat(question)
      response_time = time.time() – start_time
      print(“response time: “, response_time)
      except ValueError as e:
      response = “I cannot find this information in the user manuals provided.”
      print(e)
      return response

      if __name__ == “__main__”:
      agent = UserManualAgent()
      response = agent.query(“How to setup the Roborock vacuum?”)

      print(response)

      Sau khi thay đổi kích thước khối và chồng lấn khối, tôi cũng đạt được hiệu suất nhanh hơn khi nhúng tài liệu vào Raspberry Pi.

      Tạo giao diện người dùng bằng streamlit để tương tác với tác nhân

      Bước cuối cùng là tạo một giao diện người dùng nhanh bằng streamlit để tương tác với tác nhân. Đây là mã cho giao diện người dùng:

      import streamlit as st
      from user_manual_agent import UserManualAgent

      @st.cache_resource
      def initialize_agent():
      user_manual_agent = UserManualAgent()
      return user_manual_agent

      # Function to cycle through messages
      def display_interface(user_manual_agent):
      # Streamlit app
      st.title(“User Manual Agent”)
      st.write(“Ask any questions you have about your appliances :sunglasses:”)

      # Input text box for user query
      user_query = st.text_input(“Enter your question:”)

      # Button to submit the query
      if st.button(“Submit”):
      if user_query:
      with st.spinner(“Fetching response…”):
      response = user_manual_agent.query(user_query)
      st.markdown(“**Response**: \n\n”)
      st.markdown(response.response)

      else:
      st.write(“Please enter a question.”)

      user_manual_agent = initialize_agent()
      display_interface(user_manual_agent)

      Lưu ý việc sử dụng @st.cache_resourcekhi tạo tác nhân. Điều này ngăn không cho tác nhân được khởi tạo nhiều lần nếu ứng dụng được truy cập nhiều lần.

      Bây giờ bạn cũng có thể biến Raspberry Pi thành trợ lý cá nhân!

      Nguôn: https://medium.com/@muhammad.taha/turn-your-raspberry-pi-into-a-local-ai-agent-to-help-you-figure-out-your-appliances-4aea2d39ee91

      Thu thập dữ liệu web bằng python

      Thu thập dữ liệu web bằng python
      Nội dung

        Dữ liệu là chìa khóa để mở ra những hiểu biết có giá trị và phần lớn dữ liệu này đều có sẵn trên web. Nhưng làm thế nào để bạn thu thập lượng lớn dữ liệu từ các trang web một cách hiệu quả? Đó là lúc Python web scraping xuất hiện. Web scraping, quá trình trích xuất dữ liệu từ các trang web, đã nổi lên như một kỹ thuật mạnh mẽ để thu thập thông tin từ phạm vi rộng lớn của internet.

        Python thường được sử dụng để thu thập dữ liệu web và các công cụ mạnh mẽ như BeautifulSoup , Scrapy và Selenium để thu thập dữ liệu bất kỳ trang web nào đó.

        Sự phổ biến của Python trong việc thu thập dữ liệu web bắt nguồn từ một số yếu tố:

        Dễ sử dụng : Cú pháp rõ ràng và dễ đọc của Python giúp người mới bắt đầu dễ hiểu và viết mã. Sự đơn giản này giúp đẩy nhanh quá trình phát triển và giảm đường cong học tập cho các tác vụ thu thập dữ liệu web.

        Hệ sinh thái phong phú : Python tự hào có một hệ sinh thái rộng lớn các thư viện và khuôn khổ được thiết kế riêng cho việc trích xuất dữ liệu web. Các thư viện như BeautifulSoup, Scrapy và Requests đơn giản hóa quá trình phân tích cú pháp HTML, giúp việc trích xuất dữ liệu trở nên dễ dàng.

        Tính linh hoạt : Python là ngôn ngữ đa năng có thể được sử dụng cho nhiều tác vụ khác nhau ngoài việc thu thập dữ liệu web. Tính linh hoạt của nó cho phép các nhà phát triển tích hợp thu thập dữ liệu web một cách liền mạch vào các dự án lớn hơn, chẳng hạn như phân tích dữ liệu, học máy hoặc phát triển web.

        Hỗ trợ cộng đồng : Python có một cộng đồng lớn và năng động gồm các nhà phát triển đóng góp vào các thư viện của mình và cung cấp hỗ trợ thông qua các diễn đàn, hướng dẫn và tài liệu. Nguồn tài nguyên phong phú này đảm bảo rằng các nhà phát triển có thể tiếp cận được sự hỗ trợ và hướng dẫn khi giải quyết các thách thức về web scraping.

        Mô-đun yêu cầu Python có một số phương thức tích hợp để tạo yêu cầu HTTP tới URI đã chỉ định bằng các yêu cầu GET, POST, PUT, PATCH hoặc HEAD. Yêu cầu HTTP có nghĩa là truy xuất dữ liệu từ URI đã chỉ định hoặc đẩy dữ liệu lên máy chủ. Nó hoạt động như một giao thức yêu cầu-phản hồi giữa máy khách và máy chủ. Ở đây chúng ta sẽ sử dụng yêu cầu GET. Phương thức GET được sử dụng để truy xuất thông tin từ máy chủ đã cho bằng cách sử dụng URI đã cho. Phương thức GET gửi thông tin người dùng đã mã hóa được thêm vào yêu cầu trang.

        pip install requests

        import requests

        # Making a GET request
        r = requests.get(‘https://www.geeksforgeeks.org/python-programming-language/’)

        # check status code for response received
        # success code – 200
        print(r)

        # print content of request
        print(r.content)

        Thư viện BeautifulSoup

        Beautiful Soup cung cấp một số phương pháp đơn giản và cụm từ Pythonic để hướng dẫn, tìm kiếm và thay đổi cây phân tích cú pháp: một bộ công cụ để nghiên cứu tài liệu và loại bỏ những gì bạn cần. Không cần nhiều mã để lập tài liệu cho một ứng dụng.

        https://viblo.asia/p/cach-scrape-mot-trang-web-bang-python-va-beautifulsoup-vyDZODwPlwj

        Beautiful Soup tự động chuyển đổi các bản ghi đến thành Unicode và các biểu mẫu đi thành UTF-8. Bạn không cần phải nghĩ về mã hóa trừ khi tài liệu không xác định mã hóa và Beautiful Soup không thể bắt được mã hóa nào. Sau đó, bạn chỉ cần chọn mã hóa gốc. Beautiful Soup nằm trên các trình phân tích cú pháp Python nổi tiếng như LXML và HTML, cho phép bạn thử các chiến lược phân tích cú pháp khác nhau hoặc đánh đổi tốc độ để lấy tính linh hoạt.

        pip install beautifulsoup4

        Ví dụ
        Nhập thư viện: Mã nhập thư viện yêu cầu để thực hiện yêu cầu HTTP và lớp BeautifulSoup từ thư viện bs4 để phân tích cú pháp HTML.
        Thực hiện yêu cầu GET: Gửi yêu cầu GET tới ‘https://www.geeksforgeeks.org/python-programming-language/’ và lưu trữ phản hồi trong biến r.
        Kiểm tra mã trạng thái: In mã trạng thái của phản hồi, thường là 200 nếu thành công.
        Phân tích cú pháp HTML : Nội dung HTML của phản hồi được phân tích cú pháp bằng BeautifulSoup và lưu trữ trong biến soup.
        In HTML được chỉnh sửa đẹp mắt: In phiên bản được chỉnh sửa đẹp mắt của nội dung HTML đã phân tích để dễ đọc và phân tích.

        import requests
        from bs4 import BeautifulSoup

        # Making a GET request
        r = requests.get(‘https://www.geeksforgeeks.org/python-programming-language/’)

        # check status code for response received
        # success code – 200
        print(r)

        # Parsing the HTML
        soup = BeautifulSoup(r.content, ‘html.parser’)
        print(soup.prettify())

        Tìm kiếm các phần tử theo lớp
        Bây giờ, chúng ta muốn trích xuất một số dữ liệu hữu ích từ nội dung HTML. Đối tượng soup chứa tất cả dữ liệu trong cấu trúc lồng nhau có thể được trích xuất theo chương trình. Trang web chúng ta muốn trích xuất chứa rất nhiều văn bản, vì vậy bây giờ hãy trích xuất tất cả các nội dung đó. Trước tiên, hãy kiểm tra trang web chúng ta muốn trích xuất.

        Trong hình ảnh trên, chúng ta có thể thấy rằng tất cả nội dung của trang nằm dưới div có lớp entry-content. Chúng ta sẽ sử dụng lớp find. Lớp này sẽ tìm thẻ đã cho với thuộc tính đã cho. Trong trường hợp của chúng ta, nó sẽ tìm tất cả div có lớp là entry-content.

        Chúng ta có thể thấy rằng nội dung của trang nằm dưới thẻ <p>. Bây giờ chúng ta phải tìm tất cả các thẻ p có trong lớp này. Chúng ta có thể sử dụng lớp find_all của BeautifulSoup.

        import requests
        from bs4 import BeautifulSoup

        # Making a GET request
        r = requests.get(‘https://www.geeksforgeeks.org/python-programming-language/’)

        # Parsing the HTML
        soup = BeautifulSoup(r.content, ‘html.parser’)

        s = soup.find(‘div’, class_=’entry-content’)
        content = soup.find_all(‘p’)

        print(content)

        Tương tự các thư viện khác

        https://www.geeksforgeeks.org/python-web-scraping-tutorial/

        Selenium là một mô-đun Python phổ biến được sử dụng để tự động hóa trình duyệt web. Nó cho phép các nhà phát triển kiểm soát trình duyệt web theo chương trình, cho phép các tác vụ như thu thập dữ liệu web, thử nghiệm tự động và tương tác ứng dụng web. Selenium hỗ trợ nhiều trình duyệt web khác nhau, bao gồm Chrome, Firefox, Safari và Edge, khiến nó trở thành một công cụ đa năng để tự động hóa trình duyệt.

        Module lxml trong Python là một thư viện mạnh mẽ để xử lý các tài liệu XML và HTML. Nó cung cấp khả năng phân tích cú pháp XML và HTML hiệu suất cao cùng với API đơn giản và Pythonic. lxml được sử dụng rộng rãi trong việc trích xuất dữ liệu web Python do tốc độ, tính linh hoạt và dễ sử dụng.

        Mô-đun urllib trong Python là một thư viện tích hợp cung cấp các hàm để làm việc với URL. Nó cho phép bạn tương tác với các trang web bằng cách lấy URL (Uniform Resource Locators), mở và đọc dữ liệu từ chúng và thực hiện các tác vụ khác liên quan đến URL như mã hóa và phân tích cú pháp. Urllib là một gói thu thập một số mô-đun để làm việc với URL, chẳng hạn như: urllib.request để mở và đọc. urllib.parse để phân tích cú pháp URL. urllib.error cho các ngoại lệ được nêu ra. urllib.robotparser để phân tích các tập tin robot.txt

        Mô-đun pyautogui trong Python là một thư viện tự động hóa GUI đa nền tảng cho phép các nhà phát triển điều khiển chuột và bàn phím để tự động hóa các tác vụ. Mặc dù không được thiết kế riêng cho việc thu thập dữ liệu web, nhưng nó có thể được sử dụng kết hợp với các thư viện thu thập dữ liệu web khác như Selenium để tương tác với các trang web yêu cầu người dùng nhập dữ liệu hoặc mô phỏng hành động của con người.

        Mô-đun lịch trình trong Python là một thư viện đơn giản cho phép bạn lên lịch các hàm Python chạy theo các khoảng thời gian đã chỉ định. Nó đặc biệt hữu ích trong việc trích xuất dữ liệu web trong Python khi bạn cần trích xuất dữ liệu thường xuyên từ một trang web theo các khoảng thời gian được xác định trước, chẳng hạn như hàng giờ, hàng ngày hoặc hàng tuần.

        Lưu trữ dữ liệu trong PostgreSQL

        Để lưu dữ liệu đã thu thập vào tệp CSV, chúng ta có thể sử dụng csvmô-đun của Python. Hãy tiếp tục mã của chúng ta và lưu datavào tệp CSV:

        import csv

        # Sample data
        data = [
        {‘id’: ‘1’, ‘title’: ‘Post 1’, ‘url’: ‘http://example.com/1’, ‘rank’: 1},
        {‘id’: ‘2’, ‘title’: ‘Post 2’, ‘url’: ‘http://example.com/2’, ‘rank’: 2}
        ]

        # Define the CSV file path
        csv_file = ‘hacker_news_posts.csv’

        # Write data to CSV
        with open(csv_file, ‘w’, newline=”) as file:
        writer = csv.DictWriter(file, fieldnames=[‘id’, ‘title’, ‘url’, ‘rank’])
        writer.writeheader()
        for row in data:
        writer.writerow(row)
        Mẹo chuyên nghiệp: Theo kinh nghiệm của tôi, sự kết hợp giữa Requests, BeautifulSoup và module này csv hoàn hảo cho người mới bắt đầu xây dựng các trình thu thập dữ liệu web mạnh mẽ với mã tối thiểu. Khi bạn đã quen với các công cụ này với tư cách là người mới bắt đầu, bạn có thể khám phá các tùy chọn nâng cao hơn như Scrapy và Selenium .

        Nhưng trên hành trình đến vùng đất dữ liệu lớn, tệp CSV đáng tin cậy của chúng ta có thể bắt đầu mất kiểm soát. May mắn thay, chúng ta có một vũ khí bí mật: cơ sở dữ liệu! Với một cơ sở dữ liệu như PostgreSQL, chúng ta có thể làm cho kho lưu trữ dữ liệu của mình mạnh mẽ như kho báu của rồng.

        Bước 1: Cài đặt PostgreSQL
        Để bắt đầu, chúng ta cần một phiên bản cơ sở dữ liệu đang hoạt động. Hãy xem Trang tải xuống PostgreSQL để biết thông tin đó và chọn gói phù hợp cho hệ điều hành của bạn, sau đó làm theo hướng dẫn cài đặt.

        Bước 2: Tạo bảng cơ sở dữ liệu
        Sau khi cài đặt, chúng ta cần thiết lập một cơ sở dữ liệu (hãy đặt tên cho nó scrape_demo) và thêm một bảng chứa các liên kết Hacker News vào đó (hãy đặt tên cho nó hn_links) với lược đồ sau:

        CREATE TABLE “hn_links” (
        “id” INTEGER NOT NULL,
        “title” VARCHAR NOT NULL,
        “url” VARCHAR NOT NULL,
        “rank” INTEGER NOT NULL
        );
        Lưu ý: Để quản lý cơ sở dữ liệu, chúng ta có thể sử dụng dòng lệnh riêng của PostgreSQL ( psql ) hoặc một trong các giao diện UI có sẵn (PostgreSQL Client ). Được rồi, cơ sở dữ liệu đã sẵn sàng và chúng ta có thể quay lại với mã của mình.

        Bước 3: Cài đặt Psycopg2 để kết nối với PostgreSQL
        Đầu tiên, chúng ta cần thứ gì đó cho phép chúng ta giao tiếp với PostgreSQL và Psycopg2 là một thư viện thực sự tuyệt vời cho việc đó. Như thường lệ, chúng ta có thể nhanh chóng cài đặt nó bằng pip :

        pip install psycopg2
        Phần còn lại tương đối dễ dàng và đơn giản. Chúng ta chỉ cần thiết lập kết nối đến cơ sở dữ liệu PostgreSQL của mình:

        con = psycopg2.connect(host=”127.0.0.1″, port=”5432″, user=”postgres”, password=””, database=”scrape_demo”)
        Sau khi thiết lập kết nối, chúng ta có thể chèn dữ liệu vào cơ sở dữ liệu.

        Bước 4: Chèn dữ liệu vào PostgreSQL
        Sau khi kết nối, chúng ta sẽ có một con trỏ cơ sở dữ liệu để thực thi các lệnh SQL và chèn dữ liệu vào cơ sở dữ liệu:

        cur = con.cursor()
        Và khi đã có con trỏ, chúng ta có thể sử dụng phương pháp này executeđể chạy lệnh SQL:

        cur.execute(“INSERT INTO table [HERE-GOES-OUR-DATA]”)
        Hoàn hảo! Chúng tôi đã lưu trữ mọi thứ trong cơ sở dữ liệu của mình!

        Bước 5: Cam kết dữ liệu và đóng kết nối
        Xin hãy bình tĩnh. Trước khi bạn đi vào hoàng hôn, đừng quên commitgiao dịch cơ sở dữ liệu (ngầm định) của bạn 😉. Thêm một lần nữa con.commit()(và một vài chữ closes) và chúng ta thực sự ổn rồi:

        # Commit the data
        con.commit();

        # Close our database connections
        cur.close()
        con.close()
        Bây giờ, chúng ta hãy xem qua dữ liệu:
        Thu thập dữ liệu web bằng python

        Và cuối cùng, đây là mã hoàn chỉnh, bao gồm cả logic trích xuất từ ​​trước và lưu trữ cơ sở dữ liệu:

        import psycopg2
        import requests
        from bs4 import BeautifulSoup

        # Establish database connection
        con = psycopg2.connect(
        host=”127.0.0.1″,
        port=”5432″,
        user=”postgres”,
        password=””,
        database=”scrape_demo”
        )

        # Get a database cursor
        cur = con.cursor()

        r = requests.get(‘https://news.ycombinator.com’)
        soup = BeautifulSoup(r.text, ‘html.parser’)
        links = soup.findAll(‘tr’, class_=’athing’)

        for link in links:
        cur.execute(“””
        INSERT INTO hn_links (id, title, url, rank)
        VALUES (%s, %s, %s, %s)
        “””,
        (
        link[‘id’],
        link.find_all(‘td’)[2].a.text,
        link.find_all(‘td’)[2].a[‘href’],
        int(link.find_all(‘td’)[0].span.text.replace(‘.’, ”))
        )
        )

        # Commit the data
        con.commit()

        # Close our database connections
        cur.close()
        con.close()
        Với điều đó, chúng ta đã hoàn tất! Dữ liệu của chúng ta được lưu trữ an toàn trong cơ sở dữ liệu, sẵn sàng cho bất kỳ phân tích hoặc xử lý nào mà chúng ta có thể nghĩ đến.

        https://www.scrapingbee.com/blog/web-scraping-101-with-python/

        Bảng tóm tắt nhanh về mọi công nghệ, sau đây là một số điểm chính khác cần nhớ:

        • Socket và urllib3cung cấp nền tảng để hiểu các yêu cầu HTTP cấp thấp và cấp cao.
        • Requestsđơn giản hóa các yêu cầu HTTP, là điểm khởi đầu tuyệt vời cho người mới bắt đầu.
        • Asynciocho phép thực hiện các yêu cầu đồng thời ở tốc độ cao, giúp tăng tốc đáng kể các tác vụ thu thập dữ liệu.
        • BeautifulSoupgiúp phân tích cú pháp HTML, trong khiScrapycung cấp một khuôn khổ mạnh mẽ cho các tác vụ thu thập dữ liệu quy mô lớn.
        • Seleniumlà công cụ chúng tôi sử dụng để thu thập dữ liệu từ các trang web có nhiều JavaScript, cho phép chúng tôi tự động hóa các hành động của trình duyệt.
        • Đôi khi, sử dụng APIcó thể là phương pháp hiệu quả nhất để lấy dữ liệu có cấu trúc trực tiếp.
        • ScrapingBeegiúp bạn thu thập dữ liệu từ bất kỳ trang web nào ở quy mô lớn mà không cần phải quản lý cơ sở hạ tầng thu thập dữ liệu web.

        PydanticIA và CrawlAI

        Bằng cách tận dụng xác thực có cấu trúc với PydanticIA và thu thập dữ liệu web hiệu quả với CrawlAI, các nhà phát triển có thể nâng cao khả năng của LLM bằng cách cung cấp cho họ các cơ sở kiến ​​thức có cấu trúc, được quản lý chặt chẽ. Phương pháp này, thường được gọi là Retrieval-Augmented Generation (RAG) , đảm bảo rằng LLM có thể cung cấp các câu trả lời chính xác và phong phú theo ngữ cảnh.

        https://github.com/unclecode/crawl4ai

        Web Scraping, Chunking, Vector Embeddings cho ứng dụng RAG

        Tìm hiểu cách trích xuất nội dung từ các trang web và sử dụng nó để cải thiện phản hồi của LLM trong ứng dụng RAG. Chúng tôi sẽ đề cập đến mọi thứ từ những điều cơ bản về web scraping đến các chiến lược chunking và tạo nhúng vector để truy xuất hiệu quả.

        Cơ bản về Web Scraping

        Để tích hợp nội dung trang web vào hệ thống RAG, bước đầu tiên là trích xuất nội dung. Quá trình này được gọi là web scraping. Trong khi một số trang web cung cấp API để truy cập dữ liệu của họ, nhiều trang web thì không. Trong những trường hợp như vậy, web scraping trở nên rất có giá trị.

        Một số thư viện Python phổ biến có thể hỗ trợ trích xuất dữ liệu web. Trong trường hợp này, chúng ta sẽ sử dụng Beautiful Soup để phân tích nội dung HTML và các yêu cầu để tạo các yêu cầu HTTP. Các công cụ nâng cao như Selenium (cho nội dung động) hoặc Scrapy (cho việc thu thập dữ liệu quy mô lớn hơn) cũng có thể được sử dụng.

        Ví dụ: Trích xuất Wikipedia

        Hãy bắt đầu bằng cách trích xuất một trang Wikipedia bằng BeautifulSoup.

        import requests
        from bs4 import BeautifulSoup

        # Send a request to the Wikipedia page for Data Science
        response = requests.get(
        url=“https://en.wikipedia.org/wiki/Data_science”,
        )
        # Parse the HTML content
        soup = BeautifulSoup(response.content, ‘html.parser’)
        # Get textual content inside the main body of the article
        content = soup.find(id=“bodyContent”)
        print(content.text)

        Mã này gửi yêu cầu đến Wikipedia, lấy nội dung từ trang Khoa học dữ liệu và trích xuất phần văn bản chính để xử lý thêm.

        Chunking: Phân tích nội dung
        Sau khi trích xuất thành công một số nội dung, bước tiếp theo là chia nhỏ nội dung đó thành nhiều phần. Chia nhỏ nội dung quan trọng vì một số lý do:

        Độ chi tiết : Chia văn bản thành các phần nhỏ hơn giúp dễ dàng lấy được thông tin có liên quan nhất.
        Cải thiện ngữ nghĩa : Sử dụng một nhúng duy nhất cho toàn bộ tài liệu có thể làm mất thông tin có ý nghĩa.
        Hiệu quả : Các đoạn văn bản nhỏ hơn giúp tính toán hiệu quả hơn trong quá trình nhúng.
        Phân đoạn có kích thước cố định so với phân đoạn có nhận thức ngữ cảnh
        Các phương pháp phân đoạn phổ biến nhất là phân đoạn có kích thước cố định và phân đoạn theo ngữ cảnh. Các phân đoạn có kích thước cố định chia văn bản theo các khoảng thời gian được xác định trước, trong khi phân đoạn theo ngữ cảnh điều chỉnh kích thước phân đoạn dựa trên ranh giới câu hoặc đoạn văn.

        Trong hướng dẫn này, chúng tôi sẽ sử dụng RecursiveCharacterTextSplitter khung LangChain để thực hiện phân đoạn, đảm bảo rằng các phần tách xảy ra tại các điểm hợp lý trong văn bản.

        from langchain.text_splitter import RecursiveCharacterTextSplitter

        text_splitter = RecursiveCharacterTextSplitter(
        chunk_size=512, # Set chunk size to 512 characters
        length_function=len
        )
        chunked_text = text_splitter.split_text(content.text)

        Mã này chia văn bản đã thu thập thành các đoạn khoảng 512 ký tự, điều chỉnh các đoạn chia dựa trên các điểm ngắt tự nhiên.

        Từ Chunks đến Vector nhúng
        Khi chúng ta có các đoạn văn bản, bước tiếp theo là chuyển đổi chúng thành nhúng vector . Nhúng là các biểu diễn số của văn bản nắm bắt được ý nghĩa ngữ nghĩa của nó, cho phép so sánh độ tương đồng hiệu quả.

        Các loại nhúng
        Có hai loại nhúng chính:

        Nhúng dày đặc : Được tạo ra bởi các mô hình học sâu như mô hình từ OpenAI hoặc Sentence Transformers . Chúng mã hóa tốt sự tương đồng về mặt ngữ nghĩa.
        Nhúng thưa thớt : Được tạo ra bằng các phương pháp cổ điển như TF-IDF hoặc BM25 . Chúng có hiệu quả đối với sự tương đồng dựa trên từ khóa.
        Đối với ứng dụng RAG của mình, chúng tôi sẽ sử dụng các nhúng dày đặc được tạo bởi all-MiniLM-L6-v2mô hình từ Sentence Transformers .

        from langchain.embeddings import SentenceTransformerEmbeddings

        # Load the model for generating embeddings
        embeddings = SentenceTransformerEmbeddings(model_name=“all-MiniLM-L6-v2”)
        # Create embeddings for the third chunk of text
        chunk_embedding = embeddings.embed_documents([chunked_text[3]])

        Mã này chuyển đổi một trong các khối thành một nhúng dày đặc bằng cách sử dụng mô hình MiniLM-L6-v2 . Trong thực tế, bạn sẽ tạo nhúng cho tất cả các khối.

        Lưu trữ và truy xuất nhúng với Milvus
        Sau khi tạo nhúng, chúng ta cần lưu trữ chúng trong cơ sở dữ liệu vector để truy xuất hiệu quả. Milvus là cơ sở dữ liệu vector nguồn mở chuyên lưu trữ và tìm kiếm nhúng. Nó tích hợp tốt với LangChain, khiến nó trở thành lựa chọn tuyệt vời cho các ứng dụng RAG.

        Sau đây là cách lưu trữ các nhúng khối của bạn trong Milvus:

        from langchain.vectorstores.milvus import Milvus

        # Store the embeddings in Milvus
        vector_db = Milvus.from_texts(texts=chunked_text, embedding=embeddings, collection_name=“rag_milvus”)

        Mã này tạo ra một bộ sưu tập trong Milvus và lưu trữ tất cả các nhúng khối để truy xuất sau này.

        Xây dựng đường ống RAG
        Với các khối được lưu trữ và nhúng đã sẵn sàng, đã đến lúc xây dựng đường ống RAG của chúng ta. Đường ống này sẽ truy xuất các nhúng có liên quan nhất dựa trên truy vấn của người dùng và chuyển chúng đến LLM để tạo phản hồi.

        Bước 1: Thiết lập Retriever
        Trước tiên, chúng ta cần thiết lập một trình thu thập dữ liệu có thể lấy các nhúng có liên quan nhất từ ​​cơ sở dữ liệu vector dựa trên truy vấn của người dùng.

        retriever = vector_db.as_retriever()

        Bước 2: Khởi tạo LLM
        Tiếp theo, chúng tôi khởi tạo mô hình ngôn ngữ của mình bằng GPT-3.5-turbo của OpenAI :

        from langchain_openai import ChatOpenAI

        llm = ChatOpenAI(model=“gpt-3.5-turbo-0125”)

        Bước 3: Xác định lời nhắc tùy chỉnh
        Chúng ta cần tạo một mẫu lời nhắc để hướng dẫn LLM tạo ra các câu trả lời phù hợp dựa trên nội dung đã thu thập.

        from langchain_core.prompts import PromptTemplate

        template = “””Use the following pieces of context to answer the question at the end.
        If you don’t know the answer, just say that you don’t know, don’t try to make up an answer.
        Use three sentences maximum and keep the answer as concise as possible.
        Always say “thanks for asking!” at the end of the answer.
        {context}
        Question: {question}
        Helpful Answer:”””

        custom_rag_prompt = PromptTemplate.from_template(template)

        Bước 4: Xây dựng chuỗi RAG
        Cuối cùng, chúng ta sẽ tạo chuỗi RAG để truy xuất các đoạn có liên quan nhất, chuyển chúng đến LLM và đưa ra phản hồi đã tạo.

        from langchain_core.runnables import RunnablePassthrough
        from langchain_core.output_parsers import StrOutputParser

        def format_docs(docs):
        return “nn”.join(doc.page_content for doc in docs)
        rag_chain = (
        {“context”: retriever | format_docs, “question”: RunnablePassthrough()}
        | custom_rag_prompt
        | llm
        | StrOutputParser()
        )

        Khi chuỗi RAG được thiết lập, giờ đây bạn có thể gửi truy vấn đến đường truyền và nhận câu trả lời dựa trên nội dung trang web.

        for chunk in rag_chain.stream(“What is a Data Scientist?”):
        print(chunk, end=“”, flush=True)

        Trong hướng dẫn này, chúng tôi đã đề cập đến quy trình trích xuất nội dung trang web và sử dụng nó để cải thiện phản hồi LLM trong ứng dụng RAG. Chúng tôi đã thảo luận về việc trích xuất web, phân đoạn văn bản, tạo nhúng vector và lưu trữ các nhúng đó trong cơ sở dữ liệu vector như Milvus.

        Bằng cách sử dụng kỹ thuật này, bạn có thể phát triển các ứng dụng AI có thông tin và nhận thức theo ngữ cảnh hơn. Cho dù bạn đang tạo chatbot hay hệ thống trả lời câu hỏi, RAG đều tăng cường tính liên quan và độ chính xác của các phản hồi được tạo ra.

        Điều quan trọng cần nhớ là sự thành công của đường ống RAG phụ thuộc vào chất lượng dữ liệu và cách bạn sắp xếp các khối, nhúng và quy trình truy xuất. Thử nghiệm với các mô hình, kích thước khối và phương pháp truy xuất khác nhau để tinh chỉnh hệ thống của bạn.

        Nguồn https://medium.com/ai-agent-insider/building-rag-applications-with-website-content-60ddd3be124d

        Thunderbit: AI Web Scraper & Web Automation

        Thunderbit: AI Web Scraper & Web Automation là một tiện ích mở rộng của trình duyệt Chrome, giúp người dùng trích xuất dữ liệu từ các trang web một cách dễ dàng và tự động. Nó đặc biệt hữu ích trong việc thu thập thông tin tuyển dụng, dữ liệu thị trường, nghiên cứu đối thủ cạnh tranh, v.v. Bài viết này sẽ hướng dẫn bạn cách sử dụng Thunderbit để tìm thông tin tuyển dụng ngành Logistics.

        1. Truy cập trang web Thunderbit: Mở trình duyệt Chrome và truy cập Thunderbit.com.
        2. Tải xuống tiện ích mở rộng: Nhấp vào nút “Download” hoặc “Get Started” trên trang web để tải xuống tiện ích mở rộng Thunderbit.
        3. Cài đặt: Sau khi tải xuống, tiện ích sẽ tự động được cài đặt vào trình duyệt Chrome của bạn. Bạn có thể kiểm tra lại ở phần “Extensions” trong cài đặt Chrome.
        1. Mở Thunderbit: Sau khi cài đặt xong, bạn sẽ tìm thấy biểu tượng Thunderbit ở góc trên cùng bên phải của trình duyệt Chrome. Nhấp vào biểu tượng để mở giao diện của Thunderbit.
        2. Đăng nhập: Nếu bạn đã có tài khoản Thunderbit, bạn có thể đăng nhập bằng tài khoản của mình. Nếu chưa có tài khoản, bạn có thể đăng ký một tài khoản miễn phí.

        Nội dung

          Tìm thông tin tuyển dụng ngành Logistics

          1. Truy cập trang web tuyển dụng: Mở một trang web tuyển dụng mà bạn muốn thu thập thông tin, ví dụ như VietnamWorks hoặc TopCV.
          2. Tìm kiếm ngành Logistics: Sử dụng thanh tìm kiếm của trang web để nhập từ khóa “Logistics” và thực hiện tìm kiếm. Kết quả sẽ hiển thị danh sách các công việc liên quan đến ngành Logistics.
          3. Chọn dữ liệu để thu thập: Sau khi kết quả tìm kiếm hiển thị, bạn sẽ thấy biểu tượng Thunderbit ở góc trên cùng bên phải của trình duyệt. Nhấp vào biểu tượng Thunderbit và chọn “Scrape”.
          4. Chọn dữ liệu cần thu thập: Giao diện của Thunderbit sẽ yêu cầu bạn chọn các trường dữ liệu mà bạn muốn thu thập. Bạn có thể chọn các trường như tiêu đề công việc, công ty, địa điểm, mô tả công việc, yêu cầu công việc, v.v.
          5. Thu thập dữ liệu: Sau khi chọn xong các trường dữ liệu, nhấp vào nút “Start Scraping” để bắt đầu thu thập dữ liệu. Thunderbit sẽ tự động trích xuất dữ liệu từ trang web và lưu trữ vào tài khoản của bạn.
          6. Xem dữ liệu: Sau khi thu thập dữ liệu xong, bạn có thể xem dữ liệu đã thu thập trong tài khoản Thunderbit của mình. Nhấp vào biểu tượng Thunderbit và chọn “View Data” để xem dữ liệu đã thu thập.
          7. Xuất dữ liệu: Bạn có thể xuất dữ liệu đã thu thập ra các định dạng khác nhau như CSV, Excel, JSON, v.v. Nhấp vào nút “Export” và chọn định dạng mà bạn muốn xuất dữ liệu.

          Công cụ AI hỗ trợ trong công việc và sáng tạo

          Dùng PyTorch chuyển đổi PDF sang Markdown
          Nội dung

            Các công cụ AI không cần mã đang thay đổi cuộc chơi cho các doanh nghiệp ở mọi quy mô. Các công cụ AI không cần mã là vũ khí bí mật của bạn. Chúng giống như có một thiên tài công nghệ trong nhóm của bạn, không cần lập trình phức tạp và giá cao. Cho dù bạn là một công ty khởi nghiệp nhỏ hay một công ty đã thành lập, những công cụ này đều đưa các khả năng AI tiên tiến vào tầm tay bạn. Nhưng hãy nhớ rằng chúng có thể không miễn phí mãi mãi, vì vậy tốt nhất là hãy sử dụng chúng khi bạn có thể.

            AI không cần mã chính xác như tên gọi của nó, các công cụ trí tuệ nhân tạo không yêu cầu bất kỳ kỹ năng lập trình nào để sử dụng. Hãy nghĩ về nó như việc xây dựng bằng các khối LEGO thay vì tạo ra từng viên gạch từ đầu. Bạn đang sử dụng các thành phần AI được xây dựng sẵn để tạo ra các giải pháp mạnh mẽ, mà không cần viết một dòng mã nào.

            AI truyền thống so với AI không cần mã:

            • AI truyền thống cần có chuyên môn về mã hóa, mất nhiều tháng để phát triển và tốn kém

            • AI không cần mã sử dụng giao diện trực quan, mất nhiều ngày để triển khai và phù hợp với hầu hết các ngân sách

            • AI truyền thống đòi hỏi một nhóm các nhà phát triển

            • AI không cần mã có thể được quản lý bởi bất kỳ ai hiểu được nhu cầu kinh doanh của họ

            Các nền tảng AI không cần mã thường cung cấp bản dùng thử miễn phí hoặc các gói cơ bản, vì vậy bạn có thể thử nghiệm trước khi bắt đầu hoàn toàn. Hãy nhớ: Bạn không cần phải hiểu toán học phức tạp đằng sau AI — giống như bạn không cần phải biết động cơ ô tô hoạt động như thế nào để lái xe. Tập trung vào những gì bạn muốn đạt được và để nền tảng xử lý các công việc kỹ thuật nặng nhọc. Những công cụ này đang thay đổi cuộc chơi cho các doanh nghiệp nhỏ và doanh nhân.

            Các công cụ AI không cần mã là hoàn hảo để giải quyết các thách thức hàng ngày. Hãy cùng khám phá các lĩnh vực chính mà các công cụ này có thể tạo ra sự khác biệt thực sự.

            Giải pháp dịch vụ khách hàng

            • Chatbot xử lý các yêu cầu cơ bản 24/7

            • Hệ thống trả lời email tự động

            • Phân tích tình cảm khách hàng

            • Hỗ trợ phân loại và định tuyến vé

            AI không cần mã tỏa sáng trong dịch vụ khách hàng. Hãy nghĩ về Sarah, một chủ doanh nghiệp nhỏ đã sử dụng một nền tảng không cần mã đơn giản để tạo chatbot. Hiện tại, nền tảng này xử lý 60% các truy vấn của khách hàng, giúp nhóm của cô có nhiều thời gian hơn cho các vấn đề phức tạp.

            Phân tích dữ liệu đơn giản

            • Dự đoán xu hướng bán hàng

            • Mẫu hành vi của khách hàng

            • Báo cáo phân tích thị trường

            • Dự báo tài chính

            Những công cụ này biến dữ liệu phức tạp thành thông tin chi tiết rõ ràng — không cần bằng khoa học dữ liệu! Một chủ cửa hàng địa phương gần đây đã sử dụng AI không cần mã để phát hiện các mẫu mua hàng và điều chỉnh mức tồn kho của họ, giúp tăng lợi nhuận lên 15%.

            Quản lý tài liệu

            • Xử lý biểu mẫu tự động

            • Trích xuất dữ liệu hóa đơn

            • Phân tích hợp đồng

            • Trích xuất văn bản PDF

            Hãy tạm biệt việc nhập dữ liệu thủ công. Các công cụ này có thể quét, sắp xếp và tổ chức tài liệu trong vài giây. Một công ty kế toán đã cắt giảm thời gian xử lý tài liệu của họ từ nhiều giờ xuống còn vài phút bằng cách sử dụng các công cụ AI không cần mã đơn giản.

            Quản lý nội dung

            • Kiểm duyệt hình ảnh

            • Lọc nội dung phương tiện truyền thông xã hội

            • Phân tích văn bản

            • Kiểm tra tính nhất quán của thương hiệu

            Giữ nội dung của bạn sạch sẽ và đúng thương hiệu mà không cần phải xem xét thủ công liên tục. Một người quản lý phương tiện truyền thông xã hội hiện đang kiểm duyệt hàng nghìn bình luận của người dùng hàng ngày bằng AI — những việc trước đây mất cả ngày thì giờ chỉ mất vài phút.

            Công cụ bán hàng và tiếp thị

            • Điểm dẫn đầu

            • Tối ưu hóa chiến dịch email

            • Dự đoán hiệu suất quảng cáo

            • Phân khúc khách hàng

            Tiếp thị thông minh hiện đã có thể tiếp cận với mọi người. Các doanh nghiệp nhỏ có thể cạnh tranh với những đối thủ lớn hơn bằng cách sử dụng AI để nhắm mục tiêu đúng khách hàng vào đúng thời điểm. Bạn có thể bắt đầu sử dụng các giải pháp không cần mã hóa. Chỉ cần chọn vấn đề bạn muốn giải quyết, chọn công cụ của bạn và bắt đầu. Hãy cùng tìm hiểu cách bắt đầu hành trình của bạn một cách đúng đắn.

            Hành trình chọn nền tảng

            Đầu tiên, chọn nền tảng của bạn. Hãy nghĩ về nó như việc chọn công cụ hoàn hảo cho dự án DIY của bạn. Bạn sẽ muốn cân nhắc:

            • Dễ sử dụng — Bạn có thể sử dụng mà không cần bằng khoa học máy tính không?

            • Giá cả — Có phù hợp với ngân sách của bạn không?

            • Tính năng — Nó có giải quyết được nhu cầu kinh doanh cụ thể của bạn không?

            • Hỗ trợ — Có trợ giúp khi bạn cần không?

            Sau khi bạn đã chọn nền tảng của mình, việc thiết lập rất đơn giản. Hầu hết các công cụ đều cung cấp quy trình đăng ký đơn giản, chỉ cần tạo tài khoản, xác minh email của bạn và bạn đã tham gia! Nhiều nền tảng cũng cung cấp bản dùng thử miễn phí để bạn có thể dùng thử trước khi cam kết.

            Hầu hết các công cụ AI không cần mã đều tuân theo một cấu trúc tương tự:

            • Bảng điều khiển — Trung tâm điều khiển của bạn

            • Mẫu — Các giải pháp được xây dựng sẵn mà bạn có thể sử dụng ngay

            • Mô hình AI — Các loại AI khác nhau mà bạn có thể làm việc cùng

            • Cài đặt — Nơi bạn quản lý tài khoản và tùy chọn của mình

            Bắt đầu nhỏ với thử nghiệm. Chọn một nhiệm vụ đơn giản có thể là tự động trả lời email hoặc sắp xếp tài liệu. Chạy một vài trường hợp thử nghiệm và kiểm tra kết quả cẩn thận. AI có hiểu đầu vào của bạn không? Đầu ra có như bạn mong đợi không?

            Mẹo triển khai thông minh

            Sau đây là những gì người khởi nghiệp thành công thường làm:

            • Ghi lại mọi thứ từ ngày đầu tiên

            • Bắt đầu với các dự án nhỏ, ít rủi ro

            • Kiểm tra kỹ lưỡng trước khi đưa vào hoạt động

            • Giữ cho nhóm của bạn trong vòng lặp

            • Theo dõi kết quả của bạn

            Hãy nhớ rằng bạn không cần phải hoàn hảo ngay lập tức. Hãy bắt đầu đơn giản, học hỏi trong quá trình thực hiện và xây dựng sự tự tin của bạn. Đó là vẻ đẹp của AI không cần mã nó phát triển cùng bạn!

            Các bước thực hiện thực tế

            Bạn đã sẵn sàng đưa AI không cần mã vào hoạt động chưa? Hãy cùng chia nhỏ quy trình triển khai thành các bước nhỏ, dễ thực hiện.

            Phát hiện các vấn đề kinh doanh sẵn sàng cho AI

            Bắt đầu bằng cách tìm kiếm những dấu hiệu sau:

            • Các công việc thủ công lặp đi lặp lại làm tốn thời gian của nhóm

            • Các quy trình dữ liệu nặng cần phân tích nhanh

            • Sự tắc nghẽn trong dịch vụ khách hàng

            • Nội dung cần được xem xét thường xuyên

            Chọn các vấn đề cụ thể và có thể đo lường được. Ví dụ, thay vì “cải thiện dịch vụ khách hàng”, hãy nhắm mục tiêu “giảm thời gian phản hồi email xuống 50%”.

            Tạo bản đồ quy trình của bạn

            Trước khi bắt tay vào, hãy lập sơ đồ quy trình làm việc hiện tại của bạn. Hãy nghĩ về nó như việc tạo ra một công thức nấu ăn — trước tiên bạn cần trình bày tất cả các nguyên liệu và các bước.

            Sau đây là một cách đơn giản để thực hiện:

            • Liệt kê từng bước trong quy trình hiện tại của bạn

            • Lưu ý ai xử lý từng nhiệm vụ

            • Đánh dấu các bước có thể sử dụng sự trợ giúp của AI

            • Xác định nơi quá trình bắt đầu và kết thúc

            Chọn công cụ AI của bạn

            Ghép các vấn đề của bạn với các giải pháp AI phù hợp. Hãy nghĩ về việc này giống như việc chọn đúng công cụ từ hộp công cụ:

            • Cần sắp xếp tài liệu? Hãy thử xử lý tài liệu AI

            • Bạn muốn trả lời câu hỏi của khách hàng? Hãy xem các công cụ chatbot

            • Cần phân tích hình ảnh? Hãy sử dụng công cụ thị giác máy tính

            Kết nối các dấu chấm

            Bây giờ là lúc kết nối mọi thứ lại với nhau. Hầu hết các nền tảng không cần mã đều sử dụng giao diện kéo và thả, giúp bạn dễ dàng:

            • Kết nối các nguồn dữ liệu của bạn

            • Thiết lập các kích hoạt cho thời điểm AI nên bắt đầu hoạt động

            • Tạo hành động dựa trên kết quả AI

            • Kiểm tra luồng với dữ liệu mẫu

            Kiểm tra giải pháp của bạn

            Trước khi phát trực tiếp:

            • Chạy thử nghiệm quy mô nhỏ với dữ liệu thực tế

            • Kiểm tra kết quả so với xử lý thủ công

            • Tính thời gian của quá trình từ đầu đến cuối

            • Nhận phản hồi từ người dùng cuối

            Hãy nhớ: Bắt đầu nhỏ, thử nghiệm kỹ lưỡng và mở rộng dần dần. Tốt hơn là làm đúng với một dự án nhỏ hơn là vội vã thực hiện một dự án lớn không hiệu quả.

            Thực hành là tốt nhất và Mẹo

            Bạn đã sẵn sàng để biến dự án AI không cần code của mình thành công chưa? Chúng ta hãy cùng tìm hiểu các biện pháp thiết yếu giúp bạn đi đúng hướng và tránh những sai lầm thường gặp.

            An ninh là trên hết

            • Luôn sử dụng các phương pháp xác thực mạnh mẽ

            • Cập nhật quyền truy cập thường xuyên

            • Sao lưu dữ liệu thường xuyên

            • Theo dõi các hoạt động bất thường của hệ thống

            • Kiểm tra các biện pháp an ninh hàng quý

            Dữ liệu của bạn rất quý giá — hãy đối xử với nó theo cách đó! Bắt đầu bằng cách thiết lập các biện pháp kiểm soát truy cập phù hợp và đảm bảo chỉ những người phù hợp mới có thể sử dụng các công cụ AI của bạn. Hãy nghĩ về điều đó giống như việc có một người gác cổng tại một câu lạc bộ độc quyền — họ chỉ cho phép những người quan trọng vào.

            Giữ gìn sự hợp pháp, giữ an toàn

            Quyền riêng tư dữ liệu không còn là tùy chọn nữa. Sau đây là những gì bạn cần làm:

            • Nhận được sự đồng ý rõ ràng cho việc thu thập dữ liệu

            • Thực hiện GDPR và luật bảo mật địa phương

            • Lưu giữ hồ sơ chi tiết về việc sử dụng dữ liệu

            • Tạo chính sách bảo mật đơn giản

            • Thiết lập thủ tục xóa dữ liệu

            Hãy coi chừng ví của bạn

            Kiểm soát chi phí bằng những mẹo sau:

            • Bắt đầu nhỏ và mở rộng dần dần

            • Theo dõi chặt chẽ các mẫu sử dụng

            • Đặt giới hạn chi tiêu cho các dịch vụ AI

            • Xem lại các gói giá hàng tháng

            • Cắt nhanh các tính năng không sử dụng

            Đào tạo đội ngũ của bạn

            Thành công phụ thuộc vào con người của bạn! Hãy đảm bảo:

            • Cung cấp đào tạo kiến ​​thức cơ bản về AI

            • Tạo hướng dẫn sử dụng rõ ràng

            • Thiết lập hệ thống hỗ trợ

            • Chia sẻ chiến thắng và bài học kinh nghiệm

            • Cập nhật tài liệu đào tạo

            Tránh những lỗi thường gặp này

            Đừng rơi vào những cái bẫy này:

            • Cố gắng tự động hóa mọi thứ cùng một lúc

            • Bỏ qua các giai đoạn thử nghiệm

            • Bỏ qua phản hồi của người dùng

            • Quên đo lường kết quả

            • Không có kế hoạch dự phòng

            Hãy nhớ: bắt đầu nhỏ, kiểm tra thường xuyên và tiếp tục học hỏi. Hành trình AI không cần mã của bạn là một cuộc chạy marathon, không phải chạy nước rút!

            Những câu chuyện thành công trong thế giới thực

            Bạn đã sẵn sàng để xem AI không cần mã hoạt động chưa? Hãy cùng xem các doanh nghiệp thực sự đang chiến thắng như thế nào với các công cụ này.

            Thành công bán lẻ: SmartShop UK

            Một chuỗi bán lẻ cỡ trung ở Manchester đã chuyển đổi dịch vụ khách hàng của họ bằng cách sử dụng chatbot AI không cần mã. Trong vòng ba tháng, họ:

            • Giảm thời gian phản hồi từ 24 giờ xuống còn 2 phút

            • Xử lý tự động 70% các truy vấn của khách hàng

            • Tiết kiệm 50.000 bảng Anh chi phí hỗ trợ

            • Cải thiện điểm số hài lòng của khách hàng lên 35%

            Chiến thắng của dịch vụ tài chính: Giải pháp MoneyWise

            Công ty khởi nghiệp công nghệ tài chính có trụ sở tại London này đã sử dụng AI không cần mã để xử lý tài liệu:

            • Giảm thời gian xử lý đơn xin vay từ 2 ngày xuống còn 30 phút

            • Đạt được độ chính xác 95% trong việc trích xuất dữ liệu

            • Xử lý nhiều hơn 3x đơn đăng ký với cùng một nhóm

            • Giảm chi phí hoạt động 40%

            Sản xuất: BuildRight Ltd

            Một nhà sản xuất ở Birmingham đã triển khai AI không cần mã để kiểm soát chất lượng:

            • Phát hiện 99% lỗi trước khi vận chuyển

            • Giảm lợi nhuận 80%

            • Tiết kiệm được 200.000 bảng Anh trong năm đầu tiên

            • Đào tạo nhóm của họ chỉ trong một tuần

            Mẹo từ người dùng thành công

            “Bắt đầu từ quy mô nhỏ và mở rộng quy mô”, Sarah Thompson, Giám đốc điều hành của SmartShop cho biết. “Chúng tôi bắt đầu với các câu hỏi đơn giản của khách hàng và dần dần thêm các nhiệm vụ phức tạp hơn”.

            “Đừng quên đào tạo nhóm của bạn,” James Wilson từ MoneyWise nói thêm. “Ngay cả các công cụ không cần mã cũng cần một người hiểu được quy trình kinh doanh.”

            Những câu chuyện thành công này cho thấy AI không cần mã không chỉ là sự cường điệu — nó mang lại kết quả thực sự cho các doanh nghiệp ở mọi quy mô. Chìa khóa là gì? Bắt đầu với các mục tiêu rõ ràng và chọn đúng công cụ cho nhu cầu cụ thể của bạn.

            Phần kết luận

            Các công cụ AI không cần mã đã mở ra những khả năng thú vị cho các doanh nghiệp ở mọi quy mô. Chúng đã biến việc triển khai AI phức tạp thành một quy trình đơn giản, dễ tiếp cận mà bất kỳ ai cũng có thể thành thạo. Hãy nhìn nhận thực tế, bạn không cần một nhóm các nhà khoa học dữ liệu hay một ngân sách công nghệ lớn nữa. Với nền tảng không cần mã phù hợp, bạn có thể tự động hóa dịch vụ khách hàng, phân tích dữ liệu và hợp lý hóa hoạt động chỉ bằng vài cú nhấp chuột. Đơn giản vậy thôi.

            Tương lai của AI không cần mã trông tươi sáng. Chúng ta đang thấy nhiều tính năng mạnh mẽ hơn, tích hợp tốt hơn và các giải pháp thông minh hơn xuất hiện trên thị trường mỗi ngày. Khi các công cụ này trở nên thân thiện với người dùng hơn, chúng sẽ trở nên thiết yếu đối với hoạt động kinh doanh như email và bảng tính.

            Sẵn sàng tham gia chưa? Hãy bắt đầu nhỏ với một quy trình duy nhất mà bạn muốn cải thiện. Chọn một nền tảng AI không cần mã phù hợp với nhu cầu của bạn và thử nghiệm. Bạn sẽ ngạc nhiên về tốc độ chuyển đổi hoạt động kinh doanh của mình.

            Đừng chờ đợi thời điểm hoàn hảo, thời điểm để khai thác sức mạnh của AI chính là bây giờ. Đối thủ cạnh tranh của bạn không đứng yên, và bạn cũng vậy. Hãy thực hiện bước đầu tiên ngay hôm nay và xem AI không cần mã có thể thúc đẩy thành công trong kinh doanh của bạn như thế nào.

            Những app gợi ý

            1. Làm hoạt hình cho bản vẽ

            Bạn đã bao giờ muốn thổi hồn vào những bức vẽ nguệch ngoạc của mình chưa? Hãy xem công cụ đầu tiên của chúng tôi! Chỉ cần lấy một bức vẽ rõ nét trên giấy trắng và tải lên. Giả sử chúng ta có một bản phác thảo phi hành gia — hãy tải lên và xem điều kỳ diệu xảy ra! Đầu tiên, nó sẽ tự động phát hiện nhân vật của bạn và bạn có thể dễ dàng tô sáng để làm cho nó hoàn hảo. Tiếp theo, đã đến lúc vui chơi! Bạn có thể thêm hoạt ảnh — làm cho phi hành gia của bạn nhảy một điệu nhỏ hoặc vẫy tay chào. Với các danh mục như “vui nhộn”, “nhảy” và “đi bộ”, khả năng là vô tận. Vì vậy, nếu bản vẽ của bạn đang bám đầy bụi, đã đến lúc phủi bụi và làm hoạt ảnh! Biến những bản phác thảo tĩnh thành hình ảnh động vui nhộn. sketch.metademolab.com

            2. Trình tạo văn bản thành giọng nói

            Bạn có bao giờ muốn văn bản của mình có thể tự đọc không? Bộ chuyển đổi văn bản thành giọng nói miễn phí này sẽ làm được điều đó! Chỉ cần dán văn bản của bạn vào hộp, chọn giọng mong muốn (bạn thậm chí có thể có nhiều giọng khác nhau trong tiếng Anh — thật tuyệt phải không?) và nhấn phát. Nghe có vẻ khá giống con người, đúng không? Bạn thậm chí có thể thử nghiệm với các giọng khác nhau — như tiếng Philippines — chỉ để khuấy động mọi thứ! Khi bạn hài lòng, bạn có thể tải xuống âm thanh cho bất kỳ dự án nào bạn đang thực hiện.www.text-to-speech.online

            3. Tạo ảnh chân dung

            Bạn cần ảnh chân dung chuyên nghiệp cho mạng xã hội hoặc đơn xin việc? Trình tạo ảnh chân dung AI này sẽ giúp bạn mà không cần đăng ký! Đầu tiên, hãy chọn giới tính của bạn và tải ảnh lên (có thể là ảnh bạn chụp vào mùa hè năm ngoái). Sau đó, hãy chọn nhóm tuổi và phong cách cho ảnh. Sau đó, AI tạo ra một số ảnh chân dung chuyên nghiệp tuyệt đẹp. Không phải là những gì bạn muốn? Không vấn đề gì! Chỉ cần quay lại và thử lại cho đến khi bạn thích những gì bạn thấy. Thật dễ dàng phải không?

            Trình tạo ảnh chân dung chuyên nghiệp AI miễn phí 100% (không cần đăng ký) supawork.ai

            4. Đọc các tài liệu dài

            Đọc các tài liệu dài có thể là một sự phiền toái, nhưng giờ thì không còn nữa! Với trình tóm tắt tài liệu này, tất cả những gì bạn phải làm là tải tệp PDF của mình lên, chọn kiểu tóm tắt (như dàn ý ngắn gọn hoặc chi tiết)! Chỉ trong vài giây, nó sẽ tóm tắt từng trang cho bạn. Công cụ này thực sự tiết kiệm thời gian cho sinh viên hoặc bất kỳ ai cần nắm bắt nhanh những điều cốt yếu của một tài liệu. Vì vậy, lần tới khi bạn gặp khó khăn khi đọc một tệp PDF dài, hãy để công cụ này giúp bạn!

            Documator: Công cụ tóm tắt tài liệu AI miễn phí, đơn giản của bạn.

            5. Phiên âm âm thanh và video

            Bạn có tệp âm thanh hoặc video muốn phiên âm không? Hãy sử dụng công cụ phiên âm AI của Riverside! Chỉ cần thả tệp của bạn vào, chọn “Tôi là người” và nhấp vào “bắt đầu phiên âm”. Bạn sẽ nhận được bản phiên âm chính xác ngay lập tức. Sau khi hoàn tất phiên âm, bạn có thể tải xuống dưới dạng tệp SRT để chèn phụ đề trên YouTube hoặc bất kỳ nơi nào bạn cần. Tại sao phải tốn thời gian với các dịch vụ trả phí khi công cụ miễn phí này có thể làm được việc đó?

            Phiên âm âm thanh và video miễn phí với độ chính xác 99%.

            6. Tạo Infographic

            Sẵn sàng tạo một số hình ảnh thú vị? Công cụ Infographics cho phép bạn tạo dòng thời gian, danh sách và biểu đồ trong tích tắc! Bạn được 10 thế hệ miễn phí, vì vậy hãy sử dụng chúng một cách khôn ngoan. Giả sử bạn muốn làm nổi bật sự phát triển của phương tiện truyền thông xã hội. Sau khi nhập chủ đề, bạn sẽ nhận được một dòng thời gian được thiết kế đẹp mắt ngay lập tức. Hoàn hảo cho các bài thuyết trình hoặc bài đăng trên phương tiện truyền thông xã hội!

            Trình tạo Infographic miễn phí.

            7. Tạo một sơ đồ tư duy trên các chủ đề liên quan

            Bạn tò mò về một chủ đề nào đó? Hãy làm quen với Whybot! Công cụ tiện dụng này đào sâu vào bất kỳ câu hỏi nào bạn đặt ra. Nó tạo ra một sơ đồ tư duy trên các chủ đề liên quan, cho phép bạn phóng to và thu nhỏ để có cái nhìn toàn diện. Cho dù bạn muốn biết tại sao chúng ta ngáp hay bất kỳ câu hỏi hóc búa nào khác, Whybot sẽ giúp bạn hình dung những gì bạn đang học. Hãy sẵn sàng để trở thành người bạn thông minh nhất trong phòng!

            Whybot.

            8. Tạo prompt

            Bạn muốn mở khóa toàn bộ tiềm năng của các công cụ như ChatGPT? Không cần tìm đâu xa! Trình tạo lời nhắc giúp bạn tạo lời nhắc hiệu quả cho ChatGPT, Claude và các trợ lý AI khác.

            Chỉ cần nhập vai trò bạn muốn AI thực hiện, mô tả kết quả mong muốn và thế là xong! Bạn sẽ có lời nhắc chi tiết giúp bạn có được chính xác những gì bạn đang tìm kiếm. Đây là cách tiết kiệm thời gian chắc chắn sẽ thúc đẩy sự sáng tạo của bạn!

            Trình tạo lời nhắc ChatGPT, tạo lời nhắc ChatGPT miễn phí của Prompt Hackers để xây dựng lời nhắc AI cho bất kỳ trường hợp sử dụng phức tạp nào. Chỉ cần cung cấp vai trò…

            9. Trò chuyện dựa trên nguồn của riêng bạn

            NotebookLM của Google là một viên ngọc khác cho phép bạn trò chuyện dựa trên nguồn của riêng bạn. Tải lên tài liệu, slide hoặc thậm chí là URL từ các nguồn đáng tin cậy để tạo trợ lý AI biết chính xác những gì bạn muốn. Đây không chỉ là một chatbot khác — NotebookLM cho phép trò chuyện giữa người với người được điều chỉnh theo nghiên cứu cụ thể của bạn! Hoàn hảo để động não hoặc thu thập thông tin chi tiết!

            notebooklm.google.com

            10. Tạo các trang tô màu

            Ai nói tô màu chỉ dành cho trẻ em? Tạo trang tô màu tùy chỉnh của riêng bạn với trình tạo thú vị này! Chỉ cần nhập lời nhắc, như “hòn đảo nhiệt đới” và xem nó tạo trang tô màu của bạn. Hãy in ra và tận hưởng thời gian rảnh rỗi, hoặc thậm chí rủ trẻ em tham gia — công cụ này hoàn hảo để giúp mọi người giải trí, đặc biệt là trong những chuyến đi dài!

            Sử dụng AI để tạo các trang tô màu cho trẻ em (hoặc người lớn!) về bất kỳ chủ đề nào bạn có thể tưởng tượng.

            11. Tạo danh sách phát Spotify

            Cuối cùng, nếu bạn là người yêu âm nhạc, bạn sẽ thích Chat Jams! Chỉ cần nhập thể loại nhạc bạn thích, và nó sẽ tạo danh sách phát Spotify cho bạn.

            Bạn đang thèm một chút rung cảm thư giãn hay giai điệu sôi động? Chỉ cần nhập vào, bạn sẽ khám phá ra sự kết hợp giữa những bản nhạc yêu thích quen thuộc và những nghệ sĩ mới thú vị. Đã đến lúc nhấn phát và tận hưởng nhịp điệu tùy chỉnh của bạn!

            Hãy yêu cầu tôi tạo danh sách phát nhạc trên Spotify dành riêng cho bạn nhé.

            Nguồn: https://medium.com/@masteratai/11-ai-tools-you-wont-believe-are-free-f673e1d0faa3

            Web AI

            deepseek

            11 công cụ AI bạn không tin là miễn phí

            https://medium.com/@masteratai/11-ai-tools-you-wont-believe-are-free-f673e1d0faa3

            Tạo mã Python cho truy vấn và hiển thị mã đó trên UI.

            https://medium.com/@mauryaanoop3/jupyter-agent-revolutionizing-data-analysis-with-llms-d0cbc636cf89

            1. Truy cập Space:Jupyter Agent trên HuggingFace Spaces
            2. Chọn một mẫu: Chọn một trong những mẫu có sẵn từ menu thả xuống.
            3. Viết lời nhắc: Nhập lời nhắc của bạn vào trường nhập. Ví dụ: “What’s in Data ?-> upload the data file->csv, text….”
            4. Nhấp vào “Let’s go!”: Tác nhân sẽ tạo mã Python cho truy vấn của bạn và hiển thị mã đó trên UI.
            5. Tải xuống hoặc thực thi cục bộ: Bạn có thể tải xuống tệp Jupyter Notebook đã tạo để chạy trên máy cục bộ của mình.
            6. Tải tệp lên: Bạn cần phân tích tập dữ liệu tùy chỉnh của mình? Tải tệp lên trực tiếp thông qua giao diện.

            AI miễn phí có thể tạo ứng dụng trong vài giây

            AnyChat, một HuggingFace Space của Akhaliq, giờ đây bạn có thể dễ dàng tạo ra các ứng dụng web chức năng chỉ trong vài giây với nỗ lực tối thiểu. Cho dù bạn là người mới bắt đầu hay một lập trình viên dày dạn kinh nghiệm, trình tạo mã miễn phí hỗ trợ AI này là một công cụ tuyệt vời để khám phá.

            Thực hiện theo các bước sau để tạo ứng dụng đầu tiên của bạn chỉ bằng vài cú nhấp chuột:

            Bước 1: Truy cập AnyChat Space

            Truy cậpAnyChat trên HuggingFace .

            Bước 2: Chọn Nhà cung cấp

            Từ danh sách thả xuống, hãy chọn nhà cung cấp AI bạn thích. Đối với hướng dẫn này, chúng tôi sẽ sử dụngGemini Coder.

            Bước 3: Chọn một mô hình

            Chọn mô hình bạn muốn sử dụng. Theo mặc định, Gemini Coder sử dụnggemini-2.0-flash-thinking-exp-1219 .

            Hyperbolic Coder, powered bydeepseek-ai/DeepSeek-V3.

            Bạn có thể sử dụng models miễn phí: OpenAI, Gemini, Groq, HuggingFace, DeepSeek Qwen, …

            Bước 4: Viết lời nhắc của bạn

            Nhập lời nhắc rõ ràng và súc tích mô tả ứng dụng bạn mong muốn. Ví dụ:

            “Tạo danh sách việc cần làm đơn giản với chức năng thêm/xóa.”

            Bước 5: Nhấp vào Tạo

            Nhấn nútTạovà để phép thuật xảy ra! Chỉ trong vài giây, bạn sẽ thấy mã cho ứng dụng của mình.

            Khám phá các tính năng bổ sung

            AnyChat cung cấp một số tùy chọn để nâng cao trải nghiệm lập trình của bạn:

            • Lời nhắc hệ thống : Hiểu cách AI diễn giải hướng dẫn của bạn.
            • Xem mã : Truy cập mã được tạo trực tiếp trong giao diện.
            • Lịch sử: Theo dõi các lời nhắc và kết quả trước đây của bạn.

            Bạn có thể kiểm tra ứng dụng được tạo trong chính không gian đó. Khi đã hài lòng, hãy xuất mã và sử dụng trong IDE yêu thích của bạn hoặc tích hợp vào các dự án của bạn.

            Tạo danh sách việc cần làm đơn giản

            Hãy cùng tìm hiểu cách tạo ứng dụng danh sách việc cần làm cơ bản bằng AnyChat:

            Yêu cầu: Nhập “Tạo danh sách việc cần làm đơn giản với chức năng thêm/xóa”.

            Tạo: Nhấp vào nút Tạo và đợi vài giây.

            Kiểm tra ứng dụng: Tương tác trực tiếp với danh sách việc cần làm trên không gian.

            Xuất mã: Tải mã xuống và tích hợp vào dự án của bạn.

            <!DOCTYPE html>
            <html lang=”en”>
            <head>
            <meta charset=”UTF-8″>
            <meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
            <title>Simple Todo List</title>
            <style>
            body {
            font-family: sans-serif;
            margin: 0;
            background-color: #f4f4f4;
            display: flex;
            justify-content: center;
            align-items: flex-start;
            min-height: 100vh;
            padding-top: 20px;
            }

            .container {
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
            width: 100%;
            max-width: 500px;
            }

            h1 {
            text-align: center;
            margin-bottom: 20px;
            color: #333;
            }

            .input-group {
            display: flex;
            margin-bottom: 15px;
            }

            input[type=”text”] {
            flex-grow: 1;
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 4px 0 0 4px;
            font-size: 16px;
            }

            button {
            background-color: #5cb85c;
            color: white;
            border: none;
            padding: 10px 15px;
            border-radius: 0 4px 4px 0;
            cursor: pointer;
            font-size: 16px;
            transition: background-color 0.3s ease;
            }

            button:hover {
            background-color: #4cae4c;
            }

            ul {
            list-style: none;
            padding: 0;
            }

            li {
            background-color: #f9f9f9;
            padding: 10px;
            margin-bottom: 8px;
            border-radius: 4px;
            display: flex;
            align-items: center;
            justify-content: space-between;
            border: 1px solid #eee;
            }

            li span {
            flex-grow: 1;
            word-break: break-word;
            }

            .remove-btn {
            background-color: #d9534f;
            color: white;
            border: none;
            padding: 5px 10px;
            border-radius: 4px;
            cursor: pointer;
            font-size: 14px;
            margin-left: 10px;
            transition: background-color 0.3s ease;
            }

            .remove-btn:hover {
            background-color: #c9302c;
            }

            @media (max-width: 600px) {
            .container {
            padding: 15px;
            }

            input[type=”text”], button {
            font-size: 14px;
            }
            }
            </style>
            </head>
            <body>
            <div class=”container”>
            <h1>Todo List</h1>
            <div class=”input-group”>
            <input type=”text” id=”new-task” placeholder=”Add new task”>
            <button id=”add-task”>Add</button>
            </div>
            <ul id=”task-list”>

            </ul>
            </div>

            <script>
            document.addEventListener(‘DOMContentLoaded’, function() {
            const newTaskInput = document.getElementById(‘new-task’);
            const addTaskButton = document.getElementById(‘add-task’);
            const taskList = document.getElementById(‘task-list’);

            addTaskButton.addEventListener(‘click’, function() {
            const taskText = newTaskInput.value.trim();
            if (taskText !== ”) {
            addTaskToList(taskText);
            newTaskInput.value = ”;
            }
            });

            newTaskInput.addEventListener(‘keypress’, function(event) {
            if (event.key === ‘Enter’) {
            addTaskButton.click();
            }
            });

            taskList.addEventListener(‘click’, function(event) {
            if (event.target.classList.contains(‘remove-btn’)) {
            event.target.parentElement.remove();
            }
            });

            function addTaskToList(taskText) {
            const listItem = document.createElement(‘li’);
            const taskSpan = document.createElement(‘span’);
            taskSpan.textContent = taskText;
            const removeButton = document.createElement(‘button’);
            removeButton.textContent = ‘Remove’;
            removeButton.classList.add(‘remove-btn’);

            listItem.appendChild(taskSpan);
            listItem.appendChild(removeButton);
            taskList.appendChild(listItem);
            }
            });
            </script>
            </body>
            </html>

            Vậy là xong! Bây giờ bạn đã có một ứng dụng danh sách việc cần làm sẵn sàng hoạt động.

            Cho dù bạn muốn tạo nguyên mẫu ý tưởng, học lập trình hay tiết kiệm thời gian cho các tác vụ lặp đi lặp lại, AnyChat cung cấp vô số khả năng. Giao diện thân thiện với người dùng và các mô hình AI mạnh mẽ khiến nó trở thành công cụ phải thử cho cả nhà phát triển và người không phải nhà phát triển.

            Chạy DeepSeek cục bộ trong VSCode để có một AI Copilot mạnh mẽ và riêng tư

            Bước 1: Cài đặt Ollama và CodeGPT trong VSCode

            Để chạy DeepSeek cục bộ, trước tiên chúng ta cần cài đặt Ollama , cho phép chúng ta chạy LLM trên máy của mình, và CodeGPT , tiện ích mở rộng VSCode tích hợp các mô hình này để hỗ trợ viết mã.

            Cài đặt Ollama. Ollama là một nền tảng nhẹ giúp việc điều hành các trường LLM địa phương trở nên đơn giản.

            Cài đặt CodeGPT trong Visual Studio Code. Mở VSCode và điều hướng đến Extensions Marketplace (Ctrl + Shift + X hoặc Cmd + Shift + X trên macOS). Tìm kiếm “CodeGPT” và nhấp vào Cài đặt. Bạn tạo một tài khoản miễn phí tại đây: https://codegpt.co
            Sau khi cài đặt Ollama và CodeGPT, chúng ta đã sẵn sàng tải xuống và cấu hình DeepSeek để bắt đầu mã hóa bằng AI cục bộ.

            Bước 2: Tải xuống và thiết lập mô hình

            Bây giờ bạn đã cài đặt thành công cả Ollama và CodeGPT, đã đến lúc tải xuống các mô hình bạn sẽ sử dụng cục bộ.

            • Mô hình trò chuyện: deepseek-r1:1.5b , được tối ưu hóa cho các môi trường nhỏ hơn và chạy mượt mà trên hầu hết các máy tính.
            • Mô hình tự động hoàn thành: deepseek-coder:1.3b. Mô hình này sử dụng công nghệ Điền vào giữa (FIM) , cho phép đưa ra các gợi ý tự động hoàn thành thông minh khi bạn viết mã. Nó có thể dự đoán và gợi ý phần giữa của một hàm hoặc phương thức, không chỉ phần đầu hoặc phần cuối.

            1.Tải xuống Mô hình trò chuyện (deepseek-r1:1.5b)
            Để bắt đầu với mô hình trò chuyện. Mở CodeGPT trong VSCode .
            Điều hướng đến phần LLM địa phương trong thanh bên.
            Trong số các tùy chọn có sẵn, hãy chọn Ollama làm nhà cung cấp LLM địa phương.
            Chọn mô hình deepseek-r1:1.5b .
            Nhấp vào nút Tải xuống . Mô hình sẽ tự động bắt đầu tải xuống.

            Sau khi tải xuống hoàn tất, CodeGPT sẽ tự động cài đặt mô hình. Sau khi cài đặt, bạn đã sẵn sàng để bắt đầu tương tác với mô hình. Bây giờ bạn có thể dễ dàng truy vấn mô hình về mã của mình. Chỉ cần tô sáng bất kỳ mã nào trong trình soạn thảo của bạn, thêm các tệp bổ sung vào truy vấn của bạn bằng ký hiệu#và tận dụng các phím tắt lệnh mạnh mẽ như:

            /fix — Để sửa lỗi hoặc đề xuất cải tiến trong mã của bạn.
            /refactor — Để dọn dẹp và cải thiện cấu trúc mã của bạn.
            /Explain — Để có được lời giải thích chi tiết về bất kỳ đoạn mã nào.
            Mô hình trò chuyện này hoàn hảo để hỗ trợ giải đáp các câu hỏi cụ thể hoặc nhận lời khuyên về mã của bạn.

            2.Tải xuống Mô hình tự động hoàn thành (deepseek-coder:1.3b)
            Để tăng cường khả năng tự động hoàn thành mã:

            Mở Terminal trong VSCode.
            Chạy lệnh sau để kéo mô hình deepseek-coder:1.3b : ollama pull deepseek-coder:1.3b
            Lệnh này sẽ tải mô hình tự động hoàn thành xuống máy cục bộ của bạn.
            Sau khi quá trình tải xuống hoàn tất, hãy quay lại CodeGPT và điều hướng đến phần Mô hình tự động hoàn thành .
            Chọn deepseek-coder:1.3b từ danh sách các mô hình có sẵn. Sau khi chọn, bạn có thể bắt đầu viết mã. Khi bạn nhập, mô hình sẽ bắt đầu cung cấp các gợi ý mã theo thời gian thực, giúp bạn hoàn thành các hàm, phương thức và thậm chí toàn bộ khối mã một cách dễ dàng.

            Bước 3: Tận hưởng mã hóa cục bộ và riêng tư được hỗ trợ bởi AI

            Sau khi thiết lập các mô hình, giờ đây bạn có thể tận hưởng đầy đủ lợi ích khi làm việc với các công cụ mạnh mẽ này mà không cần dựa vào API bên ngoài. Bằng cách chạy mọi thứ cục bộ trên máy của bạn, bạn đảm bảo quyền riêng tư và kiểm soát hoàn toàn đối với môi trường mã hóa của mình. Không cần phải lo lắng về việc dữ liệu rời khỏi máy tính của bạn, mọi thứ đều an toàn và riêng tư.

             

            Kimi+ để tạo slide thuyết trình

            Sử dụng ai miễn phí thay cho Gamma để tạo bằng cách như sau:

            – Mở trình duyệt web của bạn và truy cập trang web https://kimi.ai/kimiplus-square.

            – Sau khi truy cập trang web, bạn sẽ thấy giao diện chính của Kimi+. Ở đây, bạn có thể tìm thấy các tính năng và công cụ khác nhau mà Kimi+ cung cấp. Lưu ý phải đăng ký tài khoản và dùng tiếng trung mới có PPT.

            – Kimi+ có thể hỗ trợ bạn trong việc tạo slide thuyết trình bằng cách cung cấp nội dung, ý tưởng, và thậm chí là gợi ý về thiết kế. Bạn có thể sử dụng các tính năng của Kimi+ để:

            • Tạo ý tưởng nội dung**: Kimi+ có thể giúp bạn hình thành ý tưởng và cấu trúc nội dung cho từng slide.
            • Cung cấp thông tin**: Kimi+ có thể cung cấp thông tin liên quan đến chủ đề thuyết trình của bạn.
            • Gợi ý thiết kế**: Kimi+ có thể gợi ý về bố cục, màu sắc, và các yếu tố thiết kế khác để làm cho slide của bạn hấp dẫn hơn.

            – Để sử dụng Kimi+, bạn có thể nhập câu hỏi hoặc yêu cầu của bạn vào khung chat. Ví dụ:

            • “Cho tôi một ý tưởng về slide đầu tiên của bài thuyết trình về nhựa sinh học.”
            • “Gợi ý một số điểm chính để đưa vào slide về lợi ích của nhựa sinh học.”
            • “Có thể giúp tôi thiết kế một slide về thực trạng ô nhiễm nhựa tại Việt Nam không?”
            • “tạo slide thuyết trình bài “….”, nội dung dựa trên file, bằng tiếng việt”

            – Sau khi nhận được thông tin và gợi ý từ Kimi+, bạn bấm tạo PPT, chọn template cho Ai tạo ra file. Sau khi xong sẽ hiện 3 nút: Download PPT, Download PDF, Edit PPT trên trang web của nó. Bạn có thể sử dụng phần mềm tạo slide như PowerPoint, Google Slides, hoặc Canva để tạo slide thực tế. Bạn có thể sao chép và dán nội dung từ Kimi+ vào phần mềm tạo slide mà bạn đang sử dụng.

            – Tùy chỉnh slide theo gợi ý của Kimi+ và theo ý tưởng của bạn. Bạn có thể chỉnh sửa bố cục, màu sắc, font chữ, và các yếu tố thiết kế khác để làm cho slide phù hợp với phong cách và chủ đề của thuyết trình.

            – Sau khi tạo xong slide, bạn có thể xem trước để kiểm tra và chỉnh sửa nếu cần. Đảm bảo rằng slide của bạn rõ ràng, mạch lạc, và truyền đạt thông tin một cách hiệu quả.

            Lưu ý: Kimi+ là một trợ lý AI và không thể tạo slide trực tiếp. Tuy nhiên, nó có thể hỗ trợ bạn trong việc cung cấp nội dung và ý tưởng để bạn tạo slide một cách hiệu quả hơn.

            Thực hành PHP tạo chatbot dùng AI local

            Dựng webserver trên macOS 15.2
            Nội dung

              Bài viết hướng dẫn dùng PHP tạo chatbot GPT cho riêng bạn bằng cách sử dụng API của OpenAI. Đầu tiên, chúng ta sẽ tạo một dự án trong Visual Studio Code và sử dụng ngôn ngữ PHP. Tiếp theo, tạo các file và thư mục cần thiết để triển khai chatbot GPT. Sau đó, chúng ta sẽ thực hiện các bước để kết nối và truy xuất vào API Chat GPT. Cuối cùng, chúng ta sẽ xây dựng giao diện người dùng cho chatbot và thực hiện việc gửi câu hỏi và hiển thị phản hồi từ GPT.
              Sau khi đã cài đặt môi trường phát triển, chúng ta sẽ tạo một dự án trong Visual Studio Code để triển khai chatbot GPT của mình. Hãy làm theo các bước sau:
              Mở Terminal trong Visual Studio Code.
              Tạo một thư mục mới cho dự án của bạn bằng cách chạy lệnh sau: mkdir chat-gpt-project
              Di chuyển vào thư mục dự án mới bằng cách chạy lệnh sau: cd chat-gpt-project
              Tạo một file mới có tên là “index.php” bằng cách chạy lệnh sau: touch index.php
              Tạo một thư mục mới có tên là “chat” bằng cách chạy lệnh sau: mkdir chat
              Di chuyển vào thư mục “chat” bằng cách chạy lệnh sau: cd chat
              Tạo một file mới có tên là “chat-api.php” bằng cách chạy lệnh sau: touch chat-api.php
              Quay trở lại thư mục gốc của dự án bằng cách chạy lệnh sau: cd ..
              Tạo một thư mục mới có tên là “images” bằng cách chạy lệnh sau: mkdir images
              Truy cập vào thư mục “images” bằng cách chạy lệnh sau: cd images
              Tải và sao chép 2 file hình ảnh từ kho lưu trữ để sử dụng làm icon và thanh tiến trình.
              Di chuyển vào thư mục gốc của dự án chatbot GPT bằng cách chạy lệnh sau: cd chat-gpt-project
              Tạo một thư mục mới có tên là “css” bằng cách chạy lệnh sau: mkdir css
              Tạo một file mới có tên là “style.css” trong thư mục “css” bằng cách chạy lệnh sau: touch css/style.css
              Tạo một thư mục mới có tên là “js” bằng cách chạy lệnh sau: mkdir js
              Tạo một file mới có tên là “script.js” trong thư mục “js” bằng cách chạy lệnh sau: touch js/script.js

              Tạo API Chat GPT

              Để triển khai chatbot GPT, chúng ta cần tạo một API để chuyển tiếp cuộc trò chuyện giữa người dùng và GPT. Hãy làm theo các bước sau:

              Mở Terminal trong Visual Studio Code.
              Di chuyển vào thư mục gốc của dự án chatbot GPT bằng cách chạy lệnh sau: cd chat-gpt-project
              Mở file “chat/chat-api.php” trong Visual Studio Code.
              Cài đặt mã PHP sau để tạo một API gửi các câu hỏi tới GPT và nhận phản hồi:

              <?php
              // Lấy dữ liệu từ request POST
              $data = json_decode(file_get_contents('php://input'), true);
              
              // Kiểm tra nếu có câu hỏi đã được gửi từ client
              if (isset($data['message'])) {
                  $question = $data['message']; // Lấy câu hỏi từ request
                  $response = // Gọi API GPT để lấy phản hồi dựa trên câu hỏi
              
                  // Trả về phản hồi cho client
                  echo json_encode(array('response' => $response));
              }
              ?>

              Lưu và đóng file “chat/chat-api.php”.
              Sau khi bạn đã tạo API, bạn sẽ có thể chuyển tiếp câu hỏi từ người dùng đến GPT và nhận phản hồi từ GPT.

              Tạo Giao Diện Người Dùng

              Sau khi đã tạo API, chúng ta sẽ tạo giao diện người dùng để người dùng có thể gửi câu hỏi và nhận phản hồi từ chatbot GPT. Hãy làm theo các bước sau:

              Mở file “index.php” trong Visual Studio Code.
              Cài đặt mã HTML và CSS sau để tạo giao diện người dùng:

              <!DOCTYPE html>
              <html>
              <head>
              <title>Chat GPT</title>
              <link rel="stylesheet" href="css/style.css">
              <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
              <script src="js/script.js"></script>
              </head>
              <body>
              <div class="container">
                  <div class="row">
                      <h2><span class="emoji">🤖</span> Chat GPT</h2>
                      <div id="progress-bar" class="bar">
                          <img src="images/bar.gif">
                      </div>
                  </div>
                  <div class="row">
                      <div class="chat-container" id="chat-container"></div>
                  </div>
                  <div class="row">
                      <div class="input">
                          <input type="text" id="input-question" placeholder="Hãy đặt câu hỏi của bạn">
                      </div>
                      <div id="send-button" class="button">
                          <img src="images/arrow.gif">
                      </div>
                  </div>
              </div>
              </body>
              </html>

              Lưu và đóng file “index.php”.
              Mở file “css/style.css” trong Visual Studio Code.
              Cài đặt mã CSS sau để tạo kiểu cho giao diện người dùng:

              .container {
              max-width: 400px;
              margin: 0 auto;
              padding: 20px;
              text-align: center;
              }
              .row { margin-bottom: 20px; }

              h2 { font-size: 24px; }

              .emoji { font-size: 24px; }

              .bar { display: none; }

              .chat-container { height: 200px; overflow-y: scroll; border: 1px solid #ccc; padding: 10px; }

              .input { display: inline-block; width: 80%; }

              .button { display: inline-block; width: 18%; }

              input[type=”text”] { width: 100%; padding: 10px; font-size: 14px; }

              .button img { width: 20px; height: 20px; cursor: pointer; }

              6. Lưu và đóng file “css/style.css”.
              7. Mở file “js/script.js” trong Visual Studio Code.
              8. Cài đặt mã JavaScript sau để gửi câu hỏi từ người dùng đến chatbot GPT và hiển thị phản hồi:

              ```javascript
              $(document).ready(function() {
                  // Gửi câu hỏi khi nhấn Enter
                  $(document).keypress(function(event) {
                      if (event.which === 13) {
                          var question = $("#input-question").val();
                          if (validateInput(question)) {
                              sendQuestion(question);
                          }
                      }
                  });
              
                  // Gửi câu hỏi khi nhấn nút gửi
                  $("#send-button").click(function() {
                      var question = $("#input-question").val();
                      if (validateInput(question)) {
                          sendQuestion(question);
                      }
                  });
              });
              
              function validateInput(question) {
                  if (question === "") {
                      alert("Hãy nhập một câu hỏi!");
                      return false;
                  }
                  return true;
              }
              
              function sendQuestion(question) {
                  $("#progress-bar").show();
              
                  $.ajax({
                      url: "/chat/chat-api.php",
                      method: "POST",
                      data: JSON.stringify({ "message": question }),
                      contentType: "application/json",
                      success: function(response) {
                          var reply = JSON.parse(response).response;
                          addToChat(question, reply);
                          clearInput();
                          scrollToEnd();
                          $("#progress-bar").hide();
                      }
                  });
              }
              
              function addToChat(question, reply) {
                  var chatContainer = document.getElementById("chat-container");
                  chatContainer.innerHTML += "<p><strong>Tôi:</strong> " + question + "</p>";
                  chatContainer.innerHTML += "<p><strong>GPT:</strong> " + reply + "</p>";
              }
              
              function clearInput() {
                  $("#input-question").val("");
              }
              
              function scrollToEnd() {
                  var chatContainer = document.getElementById("chat-container");
                  chatContainer.scrollTop = chatContainer.scrollHeight;
              }

              Lưu và đóng file “js/script.js”.
              Sau khi hoàn thành các bước trên, bạn đã tạo thành công giao diện người dùng để người dùng có thể tương tác với chatbot GPT.

              Gửi Câu Hỏi Cho GPT

              Để gửi câu hỏi từ người dùng đến chatbot GPT, chúng ta sẽ sử dụng API mà chúng ta đã tạo trước đó. Hãy làm theo các bước sau:

              Mở file “chat/chat-api.php” trong Visual Studio Code.
              Thay thế dòng code sau:
              $response = // Gọi API GPT để lấy phản hồi dựa trên câu hỏi
              bằng đoạn code sau:

              $apiKey = “YOUR_API_KEY”;
              $url = “https://api.openai.com/v1/chat/completions”;
              $headers = [
              “Content-Type: application/json”,
              “Authorization: Bearer ” . $apiKey
              ];
              $data = [
              “messages” => [
              [
              “role” => “system”,
              “content” => “You are a helpful assistant”
              ],
              [
              “role” => “user”,
              “content” => $question
              ] ] ];
              $options = [
              “http” => [
              “header” => implode(“\r\n”, $headers),
              “method” => “POST”,
              “content” => json_encode($data)
              ] ];
              $context = stream_context_create($options);
              $response = file_get_contents($url, false, $context);
              $response = json_decode($response, true)[“choices”][0][“message”][“content”];
              Thay thế “YOUR_API_KEY” bằng API key của bạn từ OpenAI.
              Lưu và đóng file “chat/chat-api.php”.
              Sau khi bạn đã thay đổi API key trong mã PHP, chatbot GPT của bạn đã sẵn sàng nhận câu hỏi từ người dùng.

              Hiển Thị Phản Hồi Từ GPT

              Sau khi chatbot GPT nhận câu hỏi từ người dùng, chúng ta sẽ hiển thị phản hồi từ GPT trên giao diện người dùng. Hãy làm theo các bước sau:

              Mở file “js/script.js” trong Visual Studio Code.
              Thay thế dòng code sau:
              addToChat(question, reply);
              bằng đoạn code sau:

              addToChat(question, reply[“content”]);
              Lưu và đóng file “js/script.js”.
              Sau khi bạn đã thay đổi mã JavaScript, chatbot GPT của bạn sẽ hiển thị phản hồi từ GPT trên giao diện người dùng.
              Nguồn: https://www.toolify.ai/vi/ai-news-vn/hng-dn-tch-hp-api-openai-to-chatbot-gpt-vi-php-989049

              Xây dựng một chatbot AI để thành công với khách hàng

              https://getstream.io/blog/ai-chatbot-customer-success/

               

              Dùng Python chuyển đổi PDF sang Markdown

              Dùng PyTorch chuyển đổi PDF sang Markdown
              Nội dung

                PDF là các bài báo nghiên cứu dày đặc hoặc các tài liệu chứa đầy bảng, hình ảnh và siêu dữ liệu. Đối với bất kỳ ai trong thế giới AI — đặc biệt là những người tinh chỉnh các mô hình ngôn ngữ lớn (LLM) hoặc xây dựng các hệ thống truy xuất kiến ​​thức như RAG (Retrieval-Augmented Generation) — việc trích xuất dữ liệu phù hợp là rất quan trọng.

                Dữ liệu đầu vào cho đường ống RAG Retrieval Augmented Generation có thể có nhiều loại, nhưng đầu vào phổ biến nhất là PDF. Không giống như HTML, JSON hoặc Markdown có cấu trúc, PDF là tài liệu không có cấu trúc . Vì vậy, ngay cả trước khi chúng ta phân đoạn dữ liệu từ các tài liệu PDF, chúng ta cần phân tích cú pháp như trong hình trên.

                Dùng Python chuyển đổi PDF sang Markdown

                Chúng ta thấy Chunking, một phần của bước thu thập dữ liệu. Thu thập dữ liệu không hoàn tất nếu không có chunking, nhúng và lưu trữ trong Vector DB.

                Phân tích cú pháp PDF

                Phân tích PDF là trích xuất và diễn giải thông tin từ các tệp PDF (Định dạng tài liệu di động). Nó bao gồm việc phân tích cấu trúc và nội dung của tệp PDF để trích xuất thông tin có ý nghĩa, chẳng hạn như văn bản, hình ảnh, bảng và siêu dữ liệu.

                Mục đích của việc phân tích cú pháp PDF có thể là nhiều mục đích như tìm kiếm văn bản và chuyển đổi PDF thành tài liệu có cấu trúc như HTML, Markdown, v.v. Tuy nhiên, mục đích của chúng tôi ở đây chủ yếu là trích xuất thông tin có giá trị để đào tạo LLM hoặc cho RAG. Vì vậy, chúng tôi sẽ trích xuất văn bản, bảng, hình ảnh, đồ họa và siêu dữ liệu.

                Những thách thức với việc phân tích PDF

                Trong khi các tài liệu HTML là các biểu diễn phân cấp với các thẻ được xác định rõ ràng như <img> hoặc <title>, cấu trúc bên trong của các tài liệu PDF được tối ưu hóa để duy trì tính nhất quán về mặt hình ảnh. Nói cách khác, PDF bao gồm một loạt các hướng dẫn để hiển thị các ký hiệu. Điều này tạo ra một cấp độ thách thức hoàn toàn mới khi xử lý các tài liệu PDF.

                Thách thức đầu tiên là xác định bố cục của trang. Thách thức thứ hai là trích xuất các loại dữ liệu khác nhau như bảng, hình ảnh hoặc văn bản từ pdf.

                Định dạng PDF so với HTML

                Với thách thức khi xử lý tài liệu PDF so với tài liệu có cấu trúc như JSON hoặc HTML, một câu hỏi tự nhiên có thể nảy sinh là tại sao chúng ta cần PDF. Một số ưu điểm được nêu bật trong bảng bên dưới và được giải thích thêm ở bên dưới:

                Dùng Python chuyển đổi PDF sang Markdown

                Nói ngắn gọn, PDF an toàn và dễ truy cập bằng mọi thiết bị và hệ điều hành. Chúng dễ nén thành kích thước thuận tiện. Chúng dễ quét và do đó, lý tưởng để in. Không giống như HTML mất định dạng trên các trình duyệt hoặc hệ điều hành, PDF giữ nguyên định dạng của chúng.

                PDF được sử dụng để bảo toàn định dạng và do đó được sử dụng khi cần tuân theo các bố cục cứng nhắc (nghĩ đến các biểu mẫu). Chúng chủ yếu được sử dụng khi nội dung cần được sử dụng thay vì chỉnh sửa. Ví dụ bao gồm tài liệu đọc khóa học, báo cáo công ty, v.v. có thể dễ dàng in và phân phối. Vì vậy, việc phân tích PDF trở thành một bước tất yếu để chuẩn bị dữ liệu cung cấp cho các đường ống LLM và RAG.

                Phương pháp phân tích PDF

                Có ba loại phương pháp phân tích cú pháp PDF rộng dựa trên cách tiếp cận của chúng tôi đối với cách chúng tôi xử lý PDF. Chúng là,

                Phương pháp dựa trên quy tắc

                Phân tích cú pháp dựa trên quy tắc cũng được gọi là dựa trên mẫu. Nó tuân theo các quy tắc được xác định trước để trích xuất thông tin dựa trên các mẫu hoặc vị trí.

                Một ví dụ hay về việc phân tích cú pháp dựa trên quy tắc là phân tích biểu mẫu. Ví dụ, một tổ chức có thể sử dụng mẫu chuẩn để đăng ký nhân viên mới. Phân tích cú pháp dựa trên quy tắc sẽ hiệu quả trong trường hợp sử dụng này. Một ví dụ hay khác có thể là trích xuất dữ liệu từ hóa đơn và cập nhật chi phí vào cơ sở dữ liệu nội bộ.

                Phương pháp dựa trên đường ống

                Các phương pháp dựa trên đường ống chia nhỏ tác vụ phân tích cú pháp pdf thành một loạt các bước hoặc tác vụ. Ví dụ, bước đầu tiên có thể là sửa độ mờ hoặc hướng của trang. Bước thứ hai có thể thực hiện phân tích bố cục của cả phân tích cấu trúc trực quan và ngữ nghĩa, xác định vị trí của hình ảnh, bảng và văn bản. Ví dụ, trang có thể là văn bản hai cột thay vì một cột. Bước thứ ba sau đó có thể trích xuất bảng, văn bản và hình ảnh từ bố cục đã xác định. Bước cuối cùng có thể là tích hợp kết quả đã xác định để khôi phục trang thành định dạng HTML hoặc Markdown.

                Dùng Python chuyển đổi PDF sang Markdown

                Phương pháp dựa trên học tập

                Chúng dựa trên các mô hình học máy hoặc học sâu. Giống như bất kỳ phương pháp học nào khác, chúng cần một số dữ liệu để đào tạo và phát triển mô hình. Chúng có thể được chia thành ba loại, cụ thể là dựa trên học sâu và dựa trên mô hình nhỏ.

                Dùng Python chuyển đổi PDF sang Markdown

                Một số phương pháp tiếp cận nổi tiếng được thể hiện trong hình trên. Chúng bao gồm Mạng nơ-ron tích chập (CNN), các mô hình Nhận dạng ký tự quang học như Tesseract từ Google, Table Transformer từ Microsft và các thuật toán Phát hiện và phân đoạn như Mask R-CNN để phát hiện bố cục. Hoặc có thể sử dụng một mô hình phân loại tài liệu đơn giản để phân loại loại tài liệu sau đó có thể được xử lý thêm bằng một đường ống.

                Phương pháp kết hợp.

                Đúng như tên gọi, phương pháp này kết hợp các phương pháp dựa trên quy tắc và phương pháp học tập để tận dụng tối đa cả hai phương pháp.

                Sự đánh đổi cần cân nhắc
                Khi lựa chọn phương pháp xây dựng quy trình phân tích cú pháp PDF, một số cân nhắc chính bao gồm độ phức tạp của tài liệu, sức mạnh tính toán mà chúng ta có và yêu cầu về độ trễ của hệ thống.

                Dùng PyTorch chuyển đổi PDF sang Markdown

                Tôi đã sử dụng nhiều công cụ trực tuyến để chuyển đổi tài liệu PDF sang định dạng Markdown, nhưng không có công cụ nào có thể so sánh vớiMarker.

                Cùng với chuyển đổi Markdown cơ bản, nó định dạng bảng, chuyển đổi hầu hết các phương trình sang latex, trích xuất và lưu trữ hình ảnh.

                Theokho lưu trữ GitHubcủa Marker , bạn cần cài đặt:

                Dùng Python chuyển đổi PDF sang Markdown

                Để cài đặt PyTorch, hãy truy cậptrang web chính thức của PyTorch và bạn sẽ thấy hình ảnh tương tự như bên trên:

                Bạn có thể điều chỉnh các tùy chọn đó để xem tùy chọn nào phù hợp nhất với hệ thống của bạn. Khi đã có lệnh, Windows 11 hãy mở PowerShell hoặc Command Prompt và dán lệnh của bạn vào đó.

                Đây là lệnh tôi đã sử dụng để cài đặt PyTorch:

                pip3 install torch torchvision torchaudio –index-url https://download.pytorch.org/whl/cu118

                Sẽ mất một thời gian để tải xuống và cài đặt vì tệp chính có dung lượng lên tới 2,7 GB. Sau vài phút, PyTorch sẽ được cài đặt. Bây giờ, các điều kiện tiên quyết đã xong. Tiếp theo, bạn có thể tiếp tục và chuyển sang phần Marker thực tế. Bạn có thể sao chép dự án Marker trên hệ thống cục bộ của mình bằng lệnh sau: git clone https://github.com/VikParuchuri/marker.git

                Chúng tôi đã sao chép kho lưu trữ nhưng vẫn không thể chuyển đổi tệp PDF sang định dạng Markdown vì chúng tôi chưa cài đặt Marker. Bên ngoài kho lưu trữ GitHub Marker mới được sao chép, hãy tạo một môi trường mới để chuyển đổi tệp PDF sang Markdown.

                python -m venv myenv

                Thao tác này sẽ kích hoạt môi trường mới được tạo.

                myenv\Scripts\activate

                cài đặtmarker-pdfbằng trình quản lý góipip.

                pip install marker-pdf

                Bây giờ chúng ta đã sẵn sàng để chuyển đổi tài liệu PDF sang tệp Markdown! Để chuyển đổi PDF sang Markdown, chúng ta cần hai thứ:

                Đường dẫn đầu vào của PDF
                Đường dẫn đầu ra
                Bởi vì lệnh chuyển đổi có nội dung tương tự như sau:

                mark_single “input_path” “output_path” – batch_multiplier 2 – max_pages 12

                Do đó, bên trong thư mục dự án GitHub đã sao chép, tôi sẽ tạo hai thư mục: pdf: Thư mục đầu vào của tôi, đầu ra: Thư mục đầu ra của tôi

                marker_single “D:/projects/marker-pdf/marker/pdfs/Get_Started_With_Smallpdf.pdf” “D:/projects/marker-pdf/marker/output” – batch_multiplier 2 – max_pages 12

                Sau khi lệnh được thực thi, Marker sẽ bắt đầu chuyển đổi và lưu Markdown vào thư mục đầu ra. Điều tuyệt vời về Marker là nó trích xuất tất cả hình ảnh liên quan đến PDF và lưu trữ cùng với tệp .md (Markdown) chính.

                Nguồn: https://medium.com/@sumsourabh14/this-is-how-i-convert-pdf-to-markdown-379ddb6e4405

                Sử dụng PyMuPDF4LLM

                Một công cụ nhanh chóng trở thành lựa chọn hàng đầu của tôi cho mọi thứ liên quan đến PDF. Để bắt đầu, hãy đảm bảo cài đặt PyMuPDF4LLM và các gói cần thiết khác để llama_index tương thích với quy trình làm việc LLM.

                Nhưng các tính năng chính của PyMuPDF4LLM có thể được tóm tắt như sau:

                • Trích xuất văn bản: Trích xuất nội dung theo định dạng Markdown.
                  Phân đoạn: Hỗ trợ thêm siêu dữ liệu, bảng và danh sách hình ảnh vào nội dung được trích xuất.
                • Trích xuất hình ảnh: Cung cấp các tùy chọn để xác định kích thước, độ phân giải và định dạng hình ảnh.
                • Nhúng hình ảnh: Hình ảnh được nhúng trực tiếp vào đầu ra Markdown.
                • Trích xuất từ: Cho phép trích xuất chính xác các từ trong PDF.
                  Trích xuất Markdown cơ bản

                Bước đầu tiên bao gồm việc chuyển đổi tệp PDF sang định dạng Markdown. Phương pháp này đơn giản hóa việc làm việc với văn bản, đặc biệt là trong các thiết lập LLM và RAG, bằng cách giúp định dạng và xử lý trước nội dung dễ dàng hơn.

                Đầu tiên hãy cài đặt PyMuPDF4LLM bằng pip:
                pip install pymupdf4llm
                Trường hợp sử dụng 1: Trích xuất Markdown cơ bản
                Cái này thì đơn giản: bạn có một tệp PDF và chỉ muốn nội dung ở định dạng sạch, thân thiện với Markdown. PyMuPDF4LLM có thể trích xuất văn bản, hoàn chỉnh với tiêu đề, danh sách và các định dạng khác, giúp bạn dễ dàng làm việc.

                import pymupdf4llm

                # Trích xuất nội dung PDF dưới dạng Markdown
                md_text = pymupdf4llm.to_markdown( “input.pdf” )
                print (md_text[: 500 ]) # In 500 ký tự đầu tiên

                Giải thích : tôi đã sử dụng PyMuPDF4LLM để trích xuất nội dung của một bài nghiên cứu thành định dạng Markdown. Tại sao lại là Markdown? Định dạng này lý tưởng để tinh chỉnh các mô hình vì nó giữ nguyên cấu trúc và định dạng, điều này có thể rất quan trọng để tạo ra các phản hồi mạch lạc từ LLM.

                Xem các phương pháp có sẵn

                Sau khi tải thư viện, bạn nên kiểm tra tất cả các phương thức có sẵn pymupdf4llmđể hiểu rõ khả năng của thư viện.

                dir(pymupdf4llm)

                Lưu Markdown vào một tệp

                Việc lưu trữ Markdown đã trích xuất trong một tệp có thể hữu ích cho việc phân tích sau này hoặc tích hợp vào các quy trình công việc khác.

                import pathlib

                pathlib.Path(“resume.md”).write_text(md_text)

                Giải thích : Ở đây, chúng ta sử dụng pathlibđể lưu md_textnội dung vào một resume.mdtệp. Tệp Markdown này có thể truy cập để xử lý hoặc chia sẻ thêm.

                import pymupdf4llm
                import pathlib

                md_text = pymupdf4llm.to_markdown( “bengio03a.pdf” )
                pathlib.Path( “output.md” ).write_bytes(md_text.encode())
                in ( “Markdown đã lưu vào output.md” )

                Lưu trữ dữ liệu đã trích xuất của bạn trong Markdown cho phép cộng tác hoặc xem xét dễ dàng, đặc biệt là khi chuẩn bị dữ liệu để tinh chỉnh LLM. Tính linh hoạt trong việc lưu trữ làm cho nó hoàn hảo để xây dựng các tập dữ liệu theo từng bước.

                Trích xuất các trang cụ thể

                Nếu bạn chỉ cần nội dung từ các trang cụ thể, PyMuPDF4LLM cho phép trích xuất có chọn lọc bằng cách chỉ định số trang.

                import pymupdf4llm

                # Chỉ trích xuất trang 10 và 11
                md_text = pymupdf4llm.to_markdown( “bengio03a.pdf” , pages=[ 10 , 11 ])
                print (md_text[: 500 ]) # In 500 ký tự đầu tiên
                Tính năng này đặc biệt hữu ích khi xử lý các tài liệu lớn. Ví dụ, việc trích xuất các chương hoặc phần cụ thể giúp dễ dàng đào tạo LLM chỉ về thông tin có liên quan nhất.

                Tích hợp với LlamaIndex

                PyMuPDF4LLM cũng hỗ trợ trích xuất dữ liệu tương thích với LlamaIndex, giúp nó phù hợp với các dự án yêu cầu lập chỉ mục tài liệu để xử lý dựa trên LLM

                !pip install llama_index

                llama_reader = pymupdf4llm.LlamaMarkdownReader()
                dir(llama_reader)

                llama_docs = llama_reader.load_data(“/content/Dhanush_kumar_Resume.pdf”)
                print(f”Số lượng tài liệu LlamaIndex : {len(llama_docs)}”)
                print(f”Nội dung của tài liệu đầu tiên :{llama_docs[0].text[:100]}”)

                Giải thích :

                Sau khi cài đặt llama_index, chúng ta sử dụng LlamaMarkdownReaderPyMuPDF4LLM.
                Phương pháp này load_datachuyển đổi PDF sang định dạng tương thích trực tiếp với LlamaIndex, một công cụ thường được sử dụng để xây dựng đường ống dữ liệu LLM.
                llama_docslưu trữ dữ liệu đã xử lý, trong đó mỗi tài liệu có thể được kiểm tra về chất lượng và khả năng tương thích.

                Trích xuất hình ảnh

                PDF thường chứa hình ảnh cùng với văn bản. Sử dụng PyMuPDF4LLM, chúng ta có thể trích xuất những hình ảnh này và lưu chúng ở định dạng và vị trí đã chỉ định.

                md_text_images = pymupdf4llm.to_markdown(
                “/content/Dhanush_kumar_Resume.pdf”,
                page_chunks=True,
                write_images=True,
                image_path=”/content/images”,
                image_format=”png”
                )

                Giải thích :

                write_images=True: Cho phép trích xuất hình ảnh từ PDF.
                image_pathvà image_formatchỉ định nơi lưu hình ảnh và định dạng nào ( pngtrong trường hợp này).
                Mã này chụp ảnh cùng với dữ liệu văn bản, hữu ích cho các tài liệu đa phương tiện.

                Phân chia dữ liệu với siêu dữ liệu

                Đối với các tệp PDF lớn hơn hoặc các tài liệu phức tạp, việc chia nhỏ nội dung có thể giúp xử lý hiệu quả hơn. Ngoài ra, PyMuPDF4LLM cho phép xử lý siêu dữ liệu với từng phần.

                md_text_chunks = pymupdf4llm.to_markdown (
                “/content/Dhanush_kumar_Resume.pdf” ,
                page_chunks = True
                )
                md_text_chunks [ 0 ] Giải thích : Bằng cách thiết lập page_chunks=True, tài liệu được chia thành các phần, với mỗi phần được xử lý riêng biệt. Điều này đặc biệt hữu ích trong bối cảnh RAG, nơi nội dung được phân đoạn cải thiện hiệu suất truy xuất.

                Trích xuất cấp độ từ với siêu dữ liệu Metadata

                Trong một số trường hợp sử dụng, việc trích xuất văn bản ở cấp độ từ là điều cần thiết, đặc biệt là khi cần phân tích chi tiết, chẳng hạn như phân tích tình cảm hoặc nhận dạng thực thể.

                md_text_words = pymupdf4llm.to_markdown(
                “/content/Dhanush_kumar_Resume.pdf”,
                page_chunks=True,
                write_images=True,
                image_path=”images”,
                image_format=”png”,
                extract_words=True
                )
                md_text_words[0][“words”][:100]

                Giải thích :

                extract_words=True chỉ rõ rằng văn bản phải được trích xuất ở cấp độ từ, thêm siêu dữ liệu như vị trí từ và vị trí trang.
                Điều này cho phép kiểm soát nội dung chi tiết hơn và hỗ trợ quy trình phân tích văn bản nâng cao.

                Trích xuất bảng

                Nếu tệp PDF của bạn chứa bảng, bạn cũng có thể trích xuất các bảng này, giúp đơn giản hóa việc truy xuất dữ liệu trong các tài liệu có nhiều bảng như báo cáo hoặc bài nghiên cứu.

                md_text_tables = pymupdf4llm.to_markdown(
                “/content/Dhanush_kumar_Resume.pdf”,
                page_chunks=True,
                write_images=True,
                image_path=”images”,
                image_format=”png”,dpi = 200,
                )

                Giải thích : PyMuPDF4LLM trích xuất các bảng bằng cách chuyển đổi chúng sang các định dạng tương thích với Markdown. Điều này có giá trị trong các bối cảnh mà dữ liệu có cấu trúc là cần thiết, chẳng hạn như trong khoa học dữ liệu hoặc tạo báo cáo.
                PyMuPDF4LLM là một công cụ mạnh mẽ để trích xuất nội dung từ PDF ở nhiều định dạng khác nhau, cho phép xử lý tài liệu nhanh chóng và hiệu quả cho môi trường LLM và RAG. Từ trích xuất văn bản và hình ảnh đến phân tích cấp độ từ và chuyển đổi bảng, PyMuPDF4LLM cung cấp một bộ công cụ linh hoạt phù hợp với nhiều ứng dụng AI và khoa học dữ liệu. Hướng dẫn này cung cấp cái nhìn toàn diện về các khả năng của PyMuPDF4LLM, thiết lập nền tảng để tạo các đường ống dữ liệu có cấu trúc tốt và sẵn sàng sử dụng.

                https://medium.com/@danushidk507/using-pymupdf4llm-a-practical-guide-for-pdf-extraction-in-llm-rag-environments-63649915abbf

                https://python.plainenglish.io/why-pymupdf4llm-is-the-best-tool-for-extracting-data-from-pdfs-even-if-you-didnt-know-you-needed-7bff75313691

                Ollama-OCR hiện đã có sẵn dưới dạng gói Python

                Bản cập nhật này giúp tích hợpOllama-OCRvào các ứng dụng, quy trình làm việc hoặc tập lệnh tự động hóa hiện có của bạn dễ dàng hơn bao giờ hết. Chỉ với một vài dòng mã, giờ đây bạn có thể tận dụng các khả năng OCR tiên tiến trực tiếp trong Python.

                Các tính năng chính:

                1. Nhiều mô hình tầm nhìn

                Chọn mẫu phù hợp với nhu cầu của bạn:

                • LLaVA 7B: Nhẹ và nhanh để trích xuất văn bản theo thời gian thực.
                • Llama 3.2 Vision: Độ chính xác cao cho các bố cục phức tạp và văn bản chi tiết.
                • Hoặc bất kỳ mô hình tầm nhìn nào khác có sẵn trên Ollama

                2. Định dạng đầu ra linh hoạt

                Ollama-OCR hỗ trợ nhiều định dạng đầu ra khác nhau để phù hợp với nhiều trường hợp sử dụng khác nhau:

                • Markdown: Giữ nguyên định dạng có cấu trúc như tiêu đề, danh sách và dấu đầu dòng.
                • Văn bản thuần túy: Trích xuất văn bản sạch, chưa định dạng.
                • JSON: Đầu ra có cấu trúc, dễ đọc bằng máy để tích hợp dễ dàng.
                • Định dạng có cấu trúc: Trích xuất và sắp xếp các bảng và nội dung theo thứ bậc.
                • Cặp khóa-giá trị: Thích hợp cho việc trích xuất biểu mẫu, biên lai hoặc dữ liệu có nhãn.

                3. Ngoại tuyến và Riêng tư

                Dữ liệu của bạn vẫn được lưu trữ cục bộ. Ollama-OCR xử lý hình ảnh ngoại tuyến, đảm bảo thông tin nhạy cảm của bạn được bảo mật.

                Để bắt đầu sử dụng Ollama-OCR, bạn chỉ cần cài đặt gói bằng pip:

                pip install ollama-ocr

                Đảm bảo máy chủ Ollama đang hoạt động và các mô hình cần thiết đã được cài đặt để tối đa hóa trải nghiệm OCR của bạn.

                ollama pull llama3.2-vision:11b

                Cách sử dụng đơn giản và nâng cao

                Sau đây là một ví dụ nhanh để bạn bắt đầu:

                from ollama_ocr import OCRProcessor

                # Initialize OCR processor
                ocr = OCRProcessor(model_name=’llama3.2-vision:11b’) # You can use any vision model available on Ollama

                # Process an image
                result = ocr.process_image(
                image_path=”path/to/your/image.png”,
                format_type=”markdown” # Options: markdown, text, json, structured, key_value
                )
                print(result)

                # Hóa đơn #1024

                ## Thanh toán cho:

                – Really Great Company

                ## Thanh toán cho:

                – Avery Davis
                123 Anywhere St., Any City
                123 456 7890

                ## Thông tin tài khoản ngân hàng:

                – Ngân hàng: Really Great Bank
                – Tên tài khoản: John Smith
                – BSB: 000 000
                – Số tài khoản: 0000 0000

                ## Chi tiết hóa đơn:

                ### Mô tả:
                – Kế hoạch nội dung: $200,00
                – Viết bản sao: $100,00
                – Thiết kế trang web : $250,00
                – Phát triển trang web: $500,00
                – SEO: $200,00

                ### Tổng cộng tạm thời: $1.250,00 (giảm giá 30%)
                – Tổng cộng: $875,00

                ## Điều khoản thanh toán:

                – Thanh toán phải được thực hiện trong vòng 14 ngày làm việc kể từ ngày xuất hóa đơn.
                – Vui lòng gửi tiền chuyển khoản đến hello@reallygreatsite.com.

                # Cảm ơn bạn đã hợp tác kinh doanh.

                Các trường hợp sử dụng

                Xử lý hóa đơn : Tự động trích xuất các thông tin chi tiết như tên nhà cung cấp, số tiền và ngày thành các cặp khóa-giá trị cho phần mềm kế toán.
                Trích xuất bảng : Trích xuất dữ liệu có cấu trúc từ các bảng trong tài liệu được quét thành định dạng JSON hoặc CSV.
                Hệ thống quản lý nội dung : Tích hợp OCR để lập chỉ mục các tệp hình ảnh nhằm dễ dàng tìm kiếm và truy xuất.
                Phân tích biểu mẫu : Trích xuất các trường từ biểu mẫu được quét thành dữ liệu có nhãn cho các hệ thống phụ trợ.
                Bài báo nghiên cứu : Trích xuất văn bản từ sơ đồ, biểu đồ và bảng trong các bài báo học thuật có hình ảnh để phân tích thêm.

                5 trường hợp sử dụng tích hợp hàng đầu cho Ollama-OCR

                1.Hệ thống quản lý tài liệu
                Nâng cao các công cụ như SharePoint hoặc Google Drive bằng cách trích xuất và lập chỉ mục văn bản có thể tìm kiếm từ các tài liệu được quét.
                2.Phần mềm kế toán
                Tự động trích xuất dữ liệu từ hóa đơn và biên lai để điền vào các trường trong các nền tảng như QuickBooks hoặc Xero.
                3.Nền tảng thương mại điện tử
                Trích xuất thông tin chi tiết sản phẩm từ danh mục dựa trên hình ảnh để tự động tạo danh sách cho Shopify hoặc WooCommerce.
                4.Ứng dụng chăm sóc sức khỏe
                Số hóa hồ sơ bệnh án và đơn thuốc để tích hợp vào hệ thống Hồ sơ bệnh án điện tử (EMR).
                5.Chatbot hỗ trợ AI
                Cho phép chatbot diễn giải và phản hồi một cách thông minh đối với văn bản được trích xuất từ ​​hình ảnh do người dùng tải lên.

                Mở khóa những khả năng mới với Ollama-OCR

                Với tính linh hoạt, dễ sử dụng và khả năng mạnh mẽ, Ollama-OCR là giải pháp tối ưu của bạn để tích hợp OCR vào bất kỳ quy trình làm việc nào. Cho dù bạn đang quản lý tài liệu, tự động hóa quy trình hay xây dựng các ứng dụng sáng tạo, gói Python này cho phép bạn trích xuất và sử dụng văn bản theo cách chưa từng có.

                nguồn: https://medium.com/@mauryaanoop3/ollama-ocr-now-available-as-a-python-package-ff5e4240eb26

                Docling đơn giản hóa quá trình xử lý tài liệu

                https://github.com/DS4SD/docling?tab=readme-ov-file

                Một số tính năng mới như Hiểu và chuyển đổi PDF, MS Word, MS Powerpoint, HTML và một số định dạng hình ảnh. Tạo ra một biểu diễn tài liệu mới, phổ quát có thể bao hàm hệ thống phân cấp tài liệu. Đi kèm với API và CLI mới

                Để sử dụng Docling, chỉ cần cài đặt doclingtừ trình quản lý gói của bạn, ví dụ pip: pip install docling
                Hoạt động trên môi trường macOS, Linux và Windows. Cả kiến ​​trúc x86_64 và arm64.

                Để chuyển đổi từng tài liệu, hãy sử dụng convert(), ví dụ:

                from docling.document_converter import DocumentConverter

                source = “https://arxiv.org/pdf/2408.09869” # document per local path or URL
                converter = DocumentConverter()
                result = converter.convert(source)
                print(result.document.export_to_markdown()) # output: “## Docling Technical Report[…]”

                tham khảo tính năng thêm https://ds4sd.github.io/docling/usage/

                Cú pháp dòng lệnh của Docling v2 để hỗ trợ nhiều định dạng. Ví dụ được hiển thị bên dưới.

                # Convert a single file to Markdown (default)
                docling myfile.pdf

                # Convert a single file to Markdown and JSON, without OCR
                docling myfile.pdf –to json –to md –no-ocr

                # Convert PDF files in input directory to Markdown (default)
                docling ./input/dir –from pdf

                # Convert PDF and Word files in input directory to Markdown and JSON
                docling ./input/dir –from pdf –from docx –to md –to json –output ./scratch

                # Convert all supported files in input directory to Markdown, but abort on first error
                docling ./input/dir –output ./scratch –abort-on-error

                Công cụ tìm kiếm tạo sinh cho các tệp cục bộ

                https://github.com/imanoop7/Generative-Search-Engine-For-Local-Files

                https://pub.towardsai.net/building-your-own-generative-search-engine-for-local-files-using-open-source-models-b09af871751c

                https://pub.towardsai.net/building-your-own-generative-search-engine-for-local-files-using-open-source-models-part-2-4e869f62a9ee

                Local GenAI Search là hệ thống tìm kiếm tài liệu và trả lời câu hỏi được hỗ trợ bởi AI cho phép người dùng khám phá và trích xuất thông tin từ các tài liệu cục bộ của họ bằng các truy vấn ngôn ngữ tự nhiên. Ứng dụng này kết hợp khả năng tìm kiếm ngữ nghĩa với AI tạo ra để cung cấp các câu trả lời chính xác và có nhận thức về ngữ cảnh dựa trên nội dung của các tệp cục bộ của bạn.

                Sao chép kho lưu trữ này:

                git clone https://github.com/imanoop7/Generative-Search-Engine-For-Local-Files
                cd Generative-Search-Engine-For-Local-Files
                Cài đặt các gói cần thiết:

                pip install -r requirements.txt
                Đảm bảo bạn đã cài đặt Ollama và có sẵn mô hình ‘tinyllama’.

                Cách sử dụng
                Chạy ứng dụng Streamlit:

                streamlit run local_genai_search.py
                Mở trình duyệt web của bạn và điều hướng đến URL cục bộ được cung cấp (thường là http://localhost:8501).

                Nhập đường dẫn đến thư mục tài liệu của bạn vào trường nhập văn bản.

                Nhấp vào nút “Lập chỉ mục tài liệu” để xử lý và lập chỉ mục các tệp của bạn (bước này chỉ cần thực hiện một lần hoặc khi bạn thêm tài liệu mới).

                Sau khi lập chỉ mục xong, bạn có thể bắt đầu đặt câu hỏi về tài liệu của mình trong phần “Đặt câu hỏi”.

                AI sẽ cung cấp câu trả lời dựa trên nội dung tài liệu được lập chỉ mục của bạn, cùng với các tài liệu tham khảo nguồn.

                Nó hoạt động như thế nào
                Lập chỉ mục tài liệu : Hệ thống đọc và phân đoạn tài liệu của bạn, sau đó tạo nhúng bằng mô hình chuyển đổi câu. Các nhúng này được lưu trữ trong chỉ mục FAISS để tìm kiếm tương đồng hiệu quả.

                Tìm kiếm ngữ nghĩa : Khi bạn đặt câu hỏi, hệ thống sẽ chuyển đổi câu hỏi đó thành nội dung nhúng và tìm các đoạn tài liệu giống nhau nhất trong chỉ mục FAISS.

                Tạo câu trả lời : Các đoạn tài liệu có liên quan được sử dụng làm bối cảnh cho mô hình AI Ollama, giúp tạo ra câu trả lời toàn diện cho câu hỏi của bạn.

                Trình bày kết quả : Câu trả lời được hiển thị cùng với các tham chiếu đến tài liệu nguồn, có thể mở rộng để xem toàn bộ bối cảnh hoặc tải xuống để xem lại thêm.

                1 hệ thống Tạo dữ liệu tăng cường truy xuất (RAG)

                Các tác nhân hỗ trợ AI đang cách mạng hóa cách chúng ta truy xuất và xử lý thông tin. Bằng cách kết hợp DeepSeek R1 , một mô hình lý luận mạnh mẽ, với SmolAgents , một khuôn khổ tác nhân nhẹ từ Hugging Face, chúng ta có thể xây dựng các trợ lý AI hiệu quả và thông minh có khả năng suy luận logic và truy xuất tài liệu.

                • Tải và xử lý tệp PDF để truy xuất văn bản liền mạch.
                • Lưu trữ thông tin trong cơ sở dữ liệu vector để tìm kiếm nhanh chóng và chính xác.
                • Sử dụng DeepSeek R1 để suy luận nâng cao nhằm đưa ra câu trả lời có cấu trúc tốt.
                • Tận dụng SmolAgents để tạo ra trợ lý AI nhẹ và nhạy.

                Sự kết hợp này đảm bảo phản hồi do AI điều khiển hiệu quả về mặt chi phí, chính xác và có thể mở rộng , lý tưởng cho nghiên cứu, hỗ trợ khách hàng và truy xuất kiến ​​thức tự động.

                Việc triển khai này tích hợp DeepSeek R1 vào một tác nhân AI có khả năng Retrieval-Augmented Generation (RAG) . Nó bao gồm:

                • Tải và xử lý tệp PDF → Chuyển đổi tài liệu thành các đoạn văn bản có thể tìm kiếm được.
                • Tạo kho lưu trữ vector → Lưu trữ các nhúng để truy xuất hiệu quả.
                • Thế hệ tăng cường truy xuất (RAG) với bộ suy luận → Trả lời các truy vấn của người dùng bằng cách truy xuất các tài liệu có liên quan và suy luận về chúng.
                • Tác nhân AI chính → Chỉ đạo cuộc trò chuyện và thực hiện các phản hồi dựa trên lý luận.

                Bước 1: Tải và xử lý PDF

                from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader
                from langchain.text_splitter import RecursiveCharacterTextSplitter
                from langchain_huggingface import HuggingFaceEmbeddings
                from langchain_community.vectorstores import Chroma
                import os
                import shutil

                def load_and_process_pdfs(data_dir: str):
                “””
                Load PDFs from a directory and split them into manageable chunks.

                Args:
                data_dir (str): The directory containing PDF files.

                Returns:
                list: A list of document chunks.
                “””
                loader = DirectoryLoader(
                data_dir,
                glob=“**/*.pdf”,
                loader_cls=PyPDFLoader
                )
                documents = loader.load()

                text_splitter = RecursiveCharacterTextSplitter(
                chunk_size=1000,
                chunk_overlap=200,
                length_function=len,
                )
                chunks = text_splitter.split_documents(documents)
                return chunks

                def create_vector_store(chunks, persist_directory: str):
                “””
                Create and persist a Chroma vector store from document chunks.

                Args:
                chunks (list): The list of document chunks.
                persist_directory (str): Directory to persist the vector store.

                Returns:
                Chroma: The initialized Chroma vector store.
                “””
                if os.path.exists(persist_directory):
                print(f”Clearing existing vector store at {persist_directory})
                shutil.rmtree(persist_directory)

                embeddings = HuggingFaceEmbeddings(
                model_name=“sentence-transformers/all-mpnet-base-v2”,
                model_kwargs={‘device’: ‘cpu’}
                )

                print(“Creating new vector store…”)
                vectordb = Chroma.from_documents(
                documents=chunks,
                embedding=embeddings,
                persist_directory=persist_directory
                )
                return vectordb

                def main():
                data_dir = “data”
                db_dir = “chroma_db”

                print(“Loading and processing PDFs…”)
                chunks = load_and_process_pdfs(data_dir)
                print(f”Created {len(chunks)} chunks from PDFs”)

                print(“Creating vector store…”)
                vectordb = create_vector_store(chunks, db_dir)
                print(f”Vector store created and persisted at {db_dir})

                if __name__ == “__main__”:
                main()

                Tải và xử lý PDF: Tải tất cả các tệp PDF từ một thư mục được chỉ định. Chia chúng thành các phần nhỏ hơn (mỗi phần 1000 ký tự) với 200 ký tự chồng lên nhau để ghi nhớ ngữ cảnh tốt hơn.

                Tạo một cửa hàng Vector: Xóa mọi bộ nhớ vector hiện có. Sử dụng nhúng HuggingFace để chuyển đổi văn bản thành biểu diễn vector. Lưu trữ các nhúng này trong cơ sở dữ liệu vectơ Chroma.

                Bước 2: Triển khai tác nhân lý luận

                from smolagents import OpenAIServerModel, CodeAgent, ToolCallingAgent, HfApiModel, tool, GradioUI
                from langchain_chroma import Chroma
                import os

                reasoning_model_id = “deepseek-r1:7b”

                def get_model(model_id):
                “””
                Initialize an AI model based on the specified model ID.

                Args:
                model_id (str): The ID of the AI model to use.

                Returns:
                OpenAIServerModel: The initialized AI model.
                “””
                return OpenAIServerModel(
                model_id=model_id,
                api_base=“http://localhost:11434/v1”,
                api_key=“ollama”
                )

                # Create the reasoner for better RAG
                reasoning_model = get_model(reasoning_model_id)
                reasoner = CodeAgent(tools=[], model=reasoning_model, add_base_tools=False, max_steps=2)

                # Initialize vector store and embeddings
                embeddings = HuggingFaceEmbeddings(
                model_name=“sentence-transformers/all-mpnet-base-v2”,
                )
                db_dir = “chroma_db”
                vectordb = Chroma(persist_directory=db_dir, embedding_function=embeddings)

                Khởi tạo DeepSeek R1 như một mô hình lý luận. Đối CodeAgenttượng xử lý dữ liệu đầu vào và có thể thực hiện suy luận logic và tạo mã. Kho lưu trữ vector (Chroma) được khởi tạo để lưu trữ các tài liệu đã truy xuất một cách hiệu quả.

                Bước 3: Triển khai Retrieval-Augmented Generation (RAG)

                @tool
                def rag_with_reasoner(user_query: str) -> str:
                “”
                This is a RAG tool that takes in a user query and searches for relevant content from the vector database.
                The result of the search is given to a reasoning LLM to generate a response.

                Args:
                user_query: The user’s question to query the vector database with.

                Returns:
                str: A concise and specific answer to the user’s question.
                “”
                # Search for relevant documents
                docs = vectordb.similarity_search(user_query, k=3)

                # Combine document contents
                context = “\n\n”.join(doc.page_content for doc in docs)

                # Create prompt with context
                prompt = f“”“Based on the following context, answer the user’s question concisely and specifically.
                If the information is insufficient, suggest a better query for further RAG retrieval.

                Context:
                {context}

                Question: {user_query}

                Answer:”“”

                # Get response from reasoning model
                response = reasoner.run(prompt, reset=False)
                return response

                Tiếp nhận truy vấn của người dùng và lấy các tài liệu có liên quan nhất từ ​​kho lưu trữ vector . Gửi ngữ cảnh đã truy xuất tới DeepSeek R1 để lý giải . Nếu thông tin thu thập được không đủ , mô hình sẽ đề xuất truy vấn tốt hơn .

                Bước 4: Triển khai tác nhân AI chính

                # Create the primary agent to direct the conversation
                tool_model = get_model(“llama3.2”)
                primary_agent = ToolCallingAgent(tools=[rag_with_reasoner], model=tool_model, add_base_tools=False, max_steps=3)

                def main():
                “””
                Launch the AI agent with a web interface using Gradio.
                “””

                GradioUI(primary_agent).launch()

                if __name__ == “__main__”:
                main()

                Tác nhân chính ( ToolCallingAgent) đóng vai trò là người quản lý cuộc hội thoại .
                Sử dụng Llama 3.2 làm trình tạo phản hồi chính , trong khi DeepSeek R1 xử lý lý luận .
                Chạy Gradio UI để cung cấp giao diện thân thiện với người dùng.

                Bằng cách tích hợp DeepSeek R1 với SmolAgents , chúng tôi đã xây dựng một trợ lý AI mạnh mẽ nhưng nhẹ có khả năng truy xuất, phân tích và lý luận thông tin một cách hiệu quả . Hệ thống này kết hợp lý luận nâng cao với tìm kiếm tài liệu nhanh , khiến nó trở nên lý tưởng cho nhiều ứng dụng khác nhau như nghiên cứu, hỗ trợ khách hàng tự động và quản lý kiến ​​thức.

                https://medium.com/@mauryaanoop3/building-intelligent-ai-agents-with-deepseek-r1-and-smolagents-e0de20566bf0

                Dựng webserver trên macOS 15.2

                Dựng webserver trên macOS 15.2
                Nội dung

                  Phiên bản macOS mới từ 12 đã xóa hoàn toàn PHP khỏi hệ điều hành. Dùng Homebrew trên macOS để cài PHP. Homebrew là một trình quản lý gói phổ biến cho các hệ điều hành Mac. Nó rất hữu ích để cài đặt hầu hết các phần mềm mã nguồn mở như Node. Sử dụng lệnh brew, bạn có thể dễ dàng thêm chức năng mạnh mẽ vào máy Mac của mình, nhưng trước tiên chúng ta phải cài đặt nó.

                  /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”
                  https://codewithkarani.com/2022/03/10/erpnext-error-after-install-127-0-0-1-does-not-exist/?srsltid=AfmBOop1GT1c2BKP2X6a9Kp1SMcFBu79h79mYoICletd46aLZBB8medf
                  brew –version

                  Có lẽ bạn cũng nên chạy lệnh sau để đảm bảo mọi thứ được định cấu hình chính xác:

                  brew doctor
                  Để nâng cấp các gói chỉ cần gõ:

                  brew update
                  brew upgrade

                  (echo; echo ‘eval “$(/opt/homebrew/bin/brew shellenv)”‘) >> ~/.zprofile
                  eval “$(/opt/homebrew/bin/brew shellenv)”

                  Thêm thư viện: brew install openssl

                  Cài Apache

                  Mặc dù macOS đi kèm với phiên bản Apache tích hợp sẵn, nhiều người dùng thích xóa phiên bản này và cài đặt phiên bản mới nhất thông qua Homebrew, một trình quản lý gói cho macOS.
                  macOS đi kèm với một máy chủ Apache được cài đặt sẵn. Nếu bạn muốn cài đặt phiên bản Apache mới nhất, trước tiên bạn cần dừng và vô hiệu hóa phiên bản tích hợp này.

                  1. Dừng máy chủ Apache: Mở thiết bị đầu cuối của bạn và nhập lệnh sau để dừng máy chủ Apache: sudo apachectl stop

                  sudo apachectl -k stop

                  1. Vô hiệu hóa Máy chủ Apache: Để vô hiệu hóa máy chủ tự động khởi động, hãy sử dụng lệnh sau:
                    sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null

                  Cài đặt Apache bằng cách chạy:
                  brew install httpd

                  Sau khi cài đặt hoàn tất, bạn có thể khởi động Apache bằng cách gõ:
                  sudo brew services start httpd

                  Bạn đã cài đặt thành công máy chủ web Apache thông qua Homebrew và định cấu hình nó để tự động khởi động với tài khoản đặc quyền. hãy mở trình duyệt web của bạn và điều hướng đến http://localhost:8080. Bạn sẽ thấy một thông báo nói rằng “Nó hoạt động!”

                  Nếu bạn nhận được thông báo rằng trình duyệt không thể kết nối với máy chủ, trước tiên hãy kiểm tra để đảm bảo máy chủ đã hoạt động.

                  ps -aef | grep httpd

                  Bạn có thể xem nhật ký lỗi Apache trong tab/cửa sổ Terminal mới trong quá trình khởi động lại để xem có bất kỳ điều gì không hợp lệ hoặc gây ra sự cố hay không:

                  tail -f /opt/homebrew/var/log/httpd/error_log

                  Bạn sẽ thấy một vài quy trình httpd nếu Apache đang hoạt động.
                  brew services stop httpd
                  brew services start httpd
                  brew services restart httpd
                  Kiểm tra trạng thái dịch vụ Apache: Để kiểm tra trạng thái của dịch vụ Apache, bạn có thể sử dụng lệnh này:
                  brew services list
                  Lệnh này sẽ liệt kê tất cả các dịch vụ được quản lý bởi Homebrew cùng với trạng thái của họ. Tìm httpd trong danh sách này để kiểm tra trạng thái của nó.

                  Cấu hình Apache

                  Hãy nhớ rằng, mỗi khi bạn thực hiện thay đổi đối với tệp cấu hình Apache, bạn cần khởi động lại dịch vụ để các thay đổi có hiệu lực.
                  Bây giờ bạn sẽ muốn thực hiện một số thay đổi cấu hình theo môi trường phát triển cục bộ của bạn.

                  code /opt/homebrew/etc/httpd/httpd.conf

                  nếu dùng default TextEditor dùng lệnh open -e panh.

                  Đặt cổng Apache: Phiên bản httpd của Homebrew sử dụng cổng 8080. Bạn phải thay đổi thủ công cổng nghe từ cổng 8080 mặc định sang cổng 80 tiêu chuẩn.
                  Tìm dòng có nội dung
                  Listen 8080
                  và thay đổi nó thành 80:
                  Listen 80

                  Bây giờ, thay đổi gốc tài liệu cho Apache. Đây là thư mục mà Apache tìm cách phục vụ tệp từ đó. Theo mặc định, thư mục gốc tài liệu được định cấu hình là /opt/homebrew/var/www. Vì đây là một máy phát triển, hãy giả sử chúng ta muốn thay đổi thư mục gốc tài liệu để trỏ đến một thư mục trong thư mục chính của chúng ta.
                  Tìm vả thay thành mặc định /opt/homebrew/var/www:
                  DocumentRoot “/Users/minhtoan/Sites”
                  Bạn cũng cần thay đổi thẻ được định cấu hình ngay bên dưới dòng DocumentRoot.
                  <Directory “/Users/your_user/Sites”>

                  #
                  # AllowOverride controls what directives may be placed in .htaccess files.
                  # It can be “All”, “None”, or any combination of the keywords:
                  # AllowOverride FileInfo AuthConfig Limit
                  #
                  AllowOverride all

                  Ngoài ra, bạn nên bật mô-đun mod_rewrite bằng cách xóa biểu tượng # đứng đầu khỏi dòng sau. Tìm kiếm dòng và cập nhật nó. điều này sẽ cho phép viết lại URL trên Apache.
                  LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so

                  Vì bạn đã định cấu hình thư mục gốc tài liệu Apache vào thư mục chính của mình. Bạn sẽ gặp sự cố với các quyền vì theo mặc định, Apache chạy dưới dạng trình nền người dùng và trình nền nhóm (Có thể tên người dùng và nhóm là _www). Đối với các hệ thống cá nhân, Bạn có thể thay đổi chúng để khớp với tài khoản người dùng của mình (thay thế user_name bằng tên người dùng thực của bạn), với một nhóm nhân viên.
                  User user_name
                  Group staff
                  Khởi động lại apache để đảm bảo các thay đổi cấu hình của bạn đã có hiệu lực:
                  sudo apachectl -k restart
                  Apache thích có tên máy chủ trong cấu hình, nhưng điều này bị tắt theo mặc định, vì vậy hãy tìm kiếm:
                  #ServerName www.example.com:8080
                  và thay thế nó bằng:
                  ServerName localhost
                  Tạo trang web xem thử:
                  mkdir ~/Sites
                  echo ” h1>My User Web Root /h1>” > ~/Sites/index.html

                  Bây giờ, trỏ trình duyệt của bạn đến http://localhost, Điều này sẽ hiển thị index.html mới được tạo của bạn. Tất cả đã xong.
                  Nếu bạn nhận được lỗi khi khởi động lại Apache, hãy thử xóa các dấu ngoặc kép xung quanh các chỉ định DocumentRoot và Directory mà chúng tôi đã thiết lập trước đó.
                  xóa tất cả các tệp nhật ký httpd nhật ký hiện tại: rm -Rf /opt/homebrew/var/log/httpd/*

                  Apache 2 as Reverse Proxy

                  TÌm path config apache2
                  ps -ef | grep httpd
                  Bỏ dấu # cho những dòng trong file /opt/homebrew/etc/httpd/httpd.conf
                  LoadModule xml2enc_module modules/mod_xml2enc.so
                  LoadModule proxy_html_module modules/mod_proxy_html.so
                  LoadModule proxy_module modules/mod_proxy.so
                  LoadModule proxy_connect_module modules/mod_proxy_connect.so
                  LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
                  LoadModule proxy_http_module modules/mod_proxy_http.so

                  Include /private/etc/apache2/extra/httpd-vhosts.conf
                  LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so
                  Qua file /opt/homebrew/etc/httpd/extra/httpd-vhosts.conf
                  chỉnh nội dung ví dụ:
                  <VirtualHost *:80>
                  ServerName example.domain.com
                  ServerAlias example.domain.com
                  ProxyRequests Off
                  <Proxy *>
                  Require all granted
                  </Proxy>
                  ProxyPass / http://example.domain.com:8069/
                  ProxyPassReverse / http://example.domain.com:80>
                  ErrorLog /var/log/apache2/error.log
                  CustomLog /var/log/apache2/access.log combined
                  <Location />
                  Require all granted
                  </Location>
                  </VirtualHost>

                  VirtualHost *:8080 và Listen 8080 phải giống nhau.

                  Hay như xem https://kcntt.duytan.edu.vn/uploads/6847dd74-a8f8-4bbb-8b82-430a56fecf58_vhostonmacos.pdf:

                  ServerName apple.com
                  ServerAlias www.apple.com
                  DocumentRoot “/Users/USERNAME/Sites/apple”
                  ErrorLog “/private/var/log/apache2/apple.com-error_log”
                  CustomLog “/private/var/log/apache2/apple.com-access_log” common ServerAdmin web@apple.com

                  LoadModule ssl_module modules/mod_ssl.so

                  Shown in context, my http-vhosts.conf file looked like this:

                  Listen *:443
                  NameVirtualHost *:80
                  NameVirtualHost *:443

                  <VirtualHost *:80>
                     DocumentRoot "/Library/WebServer/Documents"
                     ServerName localhost
                  </VirtualHost>
                  
                  <VirtualHost *:80>
                     DocumentRoot "/Users/me/Sites/testsite.com
                     ServerName testsite.dev
                  </VirtualHost>
                  
                  <VirtualHost *:443>
                     SSLEngine on
                     SSLCertificateFile /private/etc/apache2/ssl/server.crt
                     SSLCertificateKeyFile /private/etc/apache2/ssl/server.key
                     DocumentRoot "/Users/me/Sites/testsite2.com"
                     ServerName testsite2.dev
                  </VirtualHost>

                  sudo apachectl -k restart

                  brew services restart httpd

                  brew services

                  Gỡ cài đặt Apache HTTP Server được cài đặt thông qua Homebrew

                  bạn có thể dễ dàng thực hiện bằng cách làm theo các bước sau:
                  Dừng dịch vụ Apache: Trước khi gỡ cài đặt, bạn cần dừng dịch vụ Apache nếu nó hiện đang chạy. Bạn có thể làm điều này bằng cách gõ: brew services stop httpd
                  Gỡ cài đặt Apache: Sau khi dừng dịch vụ, bạn có thể gỡ cài đặt Apache bằng cách chạy:
                  brew uninstall httpd
                  Xác minh gỡ cài đặt: Để xác minh rằng Apache đã được gỡ cài đặt, bạn có thể thử điều hướng đến http://localhost (hoặc http://localhost:8080 nếu bạn không thay đổi cổng mặc định) trong trình duyệt web của mình. Bạn sẽ không còn thấy “Nó hoạt động!” thông điệp.
                  Xin lưu ý rằng việc gỡ cài đặt Apache thông qua Homebrew sẽ không tự động xóa các tệp cấu hình nằm trong /usr/local/etc/httpd/. Nếu bạn muốn xóa hoàn toàn tất cả các dấu vết của Apache, bạn sẽ cần xóa thư mục này theo cách thủ công.

                  Edit code Visual Studio

                  Mặc định dùng TextEdit không hữu ích khi dùng Visual Studio Code miễn phí trên Mac, Windows, and Linux
                  brew install –cask visual-studio-code
                  Nếu bạn đã cài đặt Visual Studio Code, bạn có thể dễ dàng tạo một liên kết mã tượng trưng với: ln -s /Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code /opt/homebrew/bin/code

                  Cài PHP

                  PHP 8.3 ổn định mới nhất mới được Brew chính thức hỗ trợ và phải được xây dựng từ nguồn khá chậm: brew install php
                  brew install php@8.3
                  Chúng tôi đã cài đặt nhưng không liên kết các phiên bản PHP này.
                  brew unlink php && brew link –overwrite –force php@8.3

                  Kiểm tra: php -v
                  php -m xem các module cài vô.
                  Một điều phổ biến cần thay đổi là cài đặt bộ nhớ hoặc cấu hình date.timezone. Các tệp php.ini được đặt trong thư mục /opt/homebrew/etc/php/8.3/php.ini

                  Một bước bổ sung là cần thiết cho PHP 8 và macOS đi kèm Apache:

                  sudo nano /etc/apache2/httpd.conf
                  /opt/homebrew/etc/httpd/httpd.conf
                  Sau đoạn
                  LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so

                  thêm dòng này vô
                  LoadModule php_module /opt/homebrew/opt/php@8.3/lib/httpd/modules/libphp.so

                  Ngoài ra, bạn phải đặt Chỉ mục Thư mục cho PHP một cách rõ ràng, vì vậy hãy tìm kiếm khối này:

                  <IfModule dir_module>
                  DirectoryIndex index.html
                  </IfModule>

                  và thay thế nó bằng cái này:

                  <IfModule dir_module>
                  DirectoryIndex index.php index.html
                  </IfModule>

                  <FilesMatch \.php$>
                  SetHandler application/x-httpd-php
                  </FilesMatch>

                  Lưu tệp và dừng Apache sau đó bắt đầu lại, bây giờ chúng ta đã cài đặt PHP:

                  brew services stop httpd
                  brew services start httpd

                  kiểm tra xem PHP có được cài đặt và chạy echo “<?php phpinfo();” > ~/Sites/info.php

                  ERPNext trên MacOS

                  do nhiều yêu cầu thư viện python nên thiết lập môi trường ảo lên

                  hãy làm theo các bước sau:

                  Mở cửa sổ Terminal.

                  python3 -m pip install virtualenv

                  Điều hướng đến nơi chứa thư mục gốc của môi trường ảo của bạn.

                  python3 -m venv myenv

                  Chạy chong lệnh này sẽ thấy ở thư mục hiện tại xuất hiện thêm một thư mục myenv. kích hoạt môi trường ảo lên bằng lệnh:

                  source myenv/bin/activate

                  Bây giờ thì các bạn có thể tha hồ cài cắm bằng lệnh pip install quen thuộc rồi. Thích cài gì thì cài, thích cắm gì thì cắm và nếu lỗi thì chỉ cần xoá béng cái thư mục myenv đi và tạo lại.

                  thoát khỏi môi trường ảo

                  deactivate

                  Hủy kích hoạt môi trường ảo trên macOS và Linux, một số điều quan trọng bạn nên làm để đảm bảo môi trường của bạn luôn sạch sẽ và ngăn nắp trước khi ra ngoài:

                  pip list

                  pip uninstall package-name

                  Nếu muốn lưu các yêu cầu để có thể dễ dàng tạo lại môi trường trong tương lai. pip freeze > requirements.txt

                  Trước khi thoát khỏi môi trường ảo, hãy xóa mọi tệp tạm thời

                  python -c “import tempfile, shutil; shutil.rmtree(tempfile.gettempdir())”

                  Vô hiệu hóa môi trường ảo trên Windows bằng lệnh sau

                  scripts\deactivate

                  Vô hiệu hóa môi trường ảo trên macOS hoặc Linux bằng lệnh sau:

                  source bin/deactivate

                  Nếu bạn không còn cần môi trường ảo nữa, bạn có thể xóa nó để giải phóng dung lượng đĩa. Để xóa môi trường ảo, chỉ cần điều hướng đến thư mục chứa môi trường và xóa toàn bộ thư mục.

                  hãy làm theo các bước sau:

                  1. Mở cửa sổ Terminal.
                  2. Điều hướng đến thư mục gốc của môi trường ảo của bạn
                  3. Chạysource bin/deactivate
                  4. Nó sẽ vô hiệu hóa môi trường ảo Python trên macOS.

                  Yêu cầu cài:
                  Python > 3.6+
                  Homebrew >3.6+
                  Node.js 14
                  Redis 5 (caching and real time updates)
                  MariaDB (to run database driven apps)
                  yarn 1.12+ (js dependency manager)
                  pip 20+
                  https://dev.to/ahmadfarazcrypto/erpnext-installation-guide-mac-1p79
                  Đầu tiên, Git là hệ thống kiểm soát phiên bản được sử dụng phổ biến nhất. Git theo dõi các thay đổi bạn thực hiện đối với các tệp, vì vậy bạn có bản ghi về những gì đã được thực hiện và bạn có thể hoàn nguyên về các phiên bản cụ thể nếu cần. Git cũng giúp việc cộng tác dễ dàng hơn, cho phép các thay đổi của nhiều người được hợp nhất thành một nguồn.

                  brew install git
                  Cài đặt setuptools và pip (Python’s Package Manager). Setuptools là một tập hợp các cải tiến cho Python distutils cho phép các nhà phát triển xây dựng và phân phối các gói Python dễ dàng hơn, đặc biệt là những gói có phụ thuộc vào các gói khác. Các gói được xây dựng và phân phối bằng cách sử dụng công cụ thiết lập trông giống như các gói Python thông thường dựa trên distutils. pip là một trình quản lý gói cho Python. Đó là một công cụ cho phép bạn cài đặt và quản lý các thư viện và phụ thuộc bổ sung không được phân phối như một phần của thư viện tiêu chuẩn.

                  sudo pip3 install setuptools
                  Cài đặt virtualenv. virtualenv là một công cụ để tạo các môi trường Python bị cô lập có chứa bản sao python, pip và nơi riêng của chúng để giữ các thư viện được cài đặt từ PyPI. Nó được thiết kế để cho phép bạn làm việc trên nhiều dự án với các phụ thuộc khác nhau cùng một lúc trên cùng một máy.

                  sudo pip3 install virtualenv
                  Cài đặt MariaDB. MariaDB được phát triển dưới dạng phần mềm mã nguồn mở và là cơ sở dữ liệu quan hệ, nó cung cấp giao diện SQL để truy cập dữ liệu.
                  /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)”
                  brew install mariadb
                  mysql_install_db
                  mariadb-secure-installation
                  mariadb -u root -p
                  Trong quá trình cài đặt này, bạn sẽ được nhắc đặt mật khẩu root MySQL. Nếu bạn không được nhắc như vậy Bạn có thể khởi tạo thiết lập máy chủ MySQL bằng cách thực hiện lệnh sau: sudo mysql_secure_installation

                  Các tệp phát triển cơ sở dữ liệu MySQL: brew install mysql-client
                  Chỉnh sửa cấu hình mariadb (mã hóa ký tự unicode)
                  sudo nano /opt/homebrew/mariadb/my.cnf
                  thêm cái này vào tập tin my.cnf

                  [mysqld] character-set-client-handshake = FALSE
                  character-set-server = utf8mb4
                  collation-server = utf8mb4_unicode_ci

                  [mysql] default-character-set = utf8mb4
                  Bây giờ nhấn (Ctrl-X) để thoát

                  brew services start mariadb

                  Cài đặt Redis. Redis là một mã nguồn mở (được cấp phép BSD), kho lưu trữ cấu trúc dữ liệu trong bộ nhớ, được sử dụng làm cơ sở dữ liệu, bộ nhớ đệm và môi giới tin nhắn.

                  brew install redis
                  Cài đặt Node.js 14. package X

                  Node.js là một môi trường thời gian chạy đa nền tảng, mã nguồn mở để phát triển các ứng dụng mạng và phía máy chủ. Các ứng dụng Node.js được viết bằng JavaScript và có thể chạy trong thời gian chạy Node.js trên OS X, Microsoft Windows và Linux.

                  brew install node
                  Đây sẽ là phiên bản mới nhất của Node.

                  Nếu bạn muốn thay đổi phiên bản nút, bạn có thể sử dụng NVM.

                  How to Install and Configure NVM on macOS


                  BƯỚC 10 cài đặt Yarn

                  Yarn là một trình quản lý gói JavaScript nhằm mục đích nhanh chóng, xác định và an toàn. Hãy xem việc thả sợi ở nơi bạn đã sử dụng npm trước đây dễ dàng như thế nào và nhận được cài đặt nhanh hơn, đáng tin cậy hơn. Yarn là một trình quản lý gói cho JavaScript.

                  sudo npm install -g yarn
                  BƯỚC 11 cài đặt wkhtmltopdf

                  Wkhtmltopdf là một tiện ích shell dòng lệnh mã nguồn mở đơn giản và hiệu quả hơn nhiều cho phép người dùng chuyển đổi bất kỳ HTML (Trang Web) nào sang tài liệu PDF hoặc hình ảnh (jpg, png, v.v.)

                  brew install wkhtmltopdf
                  BƯỚC 12 cài đặt frappe-bench

                  sudo -H pip3 install frappe-bench
                  QUAN TRỌNG: bạn có thể muốn đăng xuất và đăng nhập lại vào thiết bị đầu cuối của mình trước bước tiếp theo và Bạn phải đăng nhập.

                  bench –version
                  BƯỚC 13 khởi tạo băng ghế frappe & cài đặt frappe phiên bản mới nhất

                  bench init frappe-bench –frappe-branch version-13

                  cd frappe-bench/
                  bench start
                  STEP 14 create a site in frappe bench
                  bench new-site site1.local
                  LƯU Ý: Nếu bạn gặp phải loại vấn đề này.

                  For key collation_server. Expected value utf8mb4_unicode_ci, found value utf8mb4_general_ci
                  ================================================================================
                  Creation of your site – site11.locale failed because MariaDB is not properly
                  configured. If using version 10.2.x or earlier, make sure you use the
                  the Barracuda storage engine.
                  Please verify the settings above in MariaDB’s my.cnf. Restart MariaDB. And
                  then run `bench new-site site1.locale` again.
                  sau đó bạn phải vào mariadb shell và chạy các lệnh này

                  SET GLOBAL collation_server = ‘utf8mb4_unicode_ci’;
                  và khởi động lại mariadb

                  brew services restart mariadb
                  BƯỚC 15 cài đặt ERPNext phiên bản mới nhất trong băng ghế dự bị & trang web

                  bench get-app erpnext –branch version-13
                  ###OR
                  bench get-app https://github.com/frappe/erpnext –branch version-13

                  bench –site site1.local install-app erpnext

                  bench –site site1.local add-to-hosts

                  bench start

                  Máy chủ của bạn sẽ chạy trên máy chủ này

                  http://site1.local:8000/

                  Lỗi 404 sau khi cài đặt do chưa chỉ web nào là default site. thiếu file currentsite.txt. dùng câu lệnh như sau

                  bench use [your-site]

                  thêm tên site vào hosts dùng lệnh: bench –site [your-site] add-to-hosts

                  | $ bench start

                  dùng tên site hoặc ip vô [your-site]:[port-number]

                   

                  NextCloud cài trên máy MacOS

                  Cần điều chỉnh php: nano /opt/homebrew/etc/php/8.3/php.ini

                  max_execution_time = 300
                  memory_limit = 512M
                  post_max_size = 128M
                  upload_max_filesize = 128M

                  khởi dộng lại:

                  brew services restart php@8.3

                  xem trạng thái nơi lưu trữ dữ liệu

                  Như MariaDB

                  brew services mariadb status

                  Cài mới thì: brew install mariadb@10.6

                  thêm vào $PATH:

                  echo ‘export PATH=”/opt/homebrew/opt/mariadb@10.6/bin:$PATH”‘ >> ~/.zshrc

                  Để bảo mật cài đặt MariaDB của bạn, hãy đặt mật khẩu root.

                  sudo /opt/homebrew/opt/mariadb@10.6/bin/mysqladmin -u root password $NEW_PASSWORD

                  Đảm bảo MariaDB sử dụng các bộ ký tự thích hợp.

                  Thêm các cấu hình sau vào:

                  [mysqld] character-set-client-handshake = FALSE
                  character-set-server = utf8mb4
                  collation-server = utf8mb4_unicode_ci
                  bind-address = 127.0.0.1

                  [mysql] default-character-set = utf8mb4

                  Khởi động lại: brew services restart mariadb@10.6

                  Nếu không thì dùng MySQL.

                  https://lipn.univ-paris13.fr/~cerin/HDU/nextcloud.html

                  MySQL

                  Cài mới: $ brew install mysql

                  Chạy MySQL
                  $ brew services start mysql

                  Khai báo như cả hai MySQL và mariadb

                  sudo mysql_secure_installation
                  Tập lệnh này sẽ đặt mật khẩu root, xóa người dùng ẩn danh, không cho phép đăng nhập root từ xa và xóa cơ sở dữ liệu thử nghiệm và quyền truy cập vào MariaDB an toàn như hình dưới đây:
                  Đầu tiên n
                  Set root password? [Y/n] y
                  Remove anonymous users? [Y/n] y
                  Disallow root login remotely? [Y/n] y
                  Remove test database and access to it? [Y/n] y
                  Reload privilege tables now? [Y/n] y

                  Khởi động services mysql:
                  brew services start|stop|restart mysql.

                  Rồi bây giờ vô thực hiện tạo database: mysql -u root -p

                  Tiếp theo tạo cơ sở dữ liệu cho Next Cloud và gán cho 1 user khác.

                  CREATE DATABASE nextclouddb;
                  GRANT ALL ON nextclouddb.* TO ‘nextcloud_user’@’localhost’ IDENTIFIED BY ‘strong password’;
                  FLUSH PRIVILEGES;
                  EXIT;

                  Thử xem bằng cách dùng code sau vào file index.php và truy cập http://localhost/index.php

                  Nội dung xem ở trang https://lipn.univ-paris13.fr/~cerin/HDU/nextcloud.html

                  Tiếp đến, download Nextcloud trên server, bún nén vào thư mục Sites. Dùng lệnh pwd xem chi tiết đường dẫn

                  Thay đổi quyền:

                  chown -R YOUR_NAME:staff /usr/local/var/www/nextcloud

                  Nếu không, bạn sẽ gặp lỗi vì các quyền không chính xác. Để kiểm tra lỗi, bạn có thể kiểm tra các tệp /usr/local/var/log/httpd/access_log /usr/local/var/log/httpd/error_log và /usr/local/var/www/nextcloud/data/nextcloud.log.

                  Cài richdocumentscode_arm64, app office cần load libfuse.so, libfontconfig.so trong httpd.config, cấu hình thêm /tmp.

                  brew install libfuse

                  brew install fontconfig

                  • Nền tảng chạy Linux x86-64 hoặc ARM64 (aarch64)

                  Xem hướng dẫn tại https://docs.nextcloud.com/server/29/Nextcloud_Server_Administration_Manual.pdf

                  Cho phép máy chủ sử dụng các địa chỉ cục bộ, ví dụ như trong các chia sẻ liên kết, dịch vụ webcal, v.v. Mặc định là false`. Thêm vào config.php

                  ‘allow_local_remote_servers’ => true,

                  Thêm app External storage

                  External storage support: Ứng dụng này cho phép quản trị viên cấu hình kết nối đến các lưu trữ ngoài, chẳng hạn như máy chủ FTP, S3 hoặc SWIFT, các máy chủ Nextcloud khác, máy chủ WebDAV, v.v. Quản trị viên có thể chọn loại lưu trữ nào để bật và có thể gắn các vị trí lưu trữ này cho một tài khoản, một nhóm hoặc toàn bộ hệ thống. Người dùng sẽ thấy một thư mục mới xuất hiện trong thư mục Nextcloud gốc của họ, họ có thể truy cập và sử dụng thư mục này giống như bất kỳ thư mục Nextcloud nào khác. Lưu trữ ngoài cũng cho phép mọi người chia sẻ các tệp được lưu trữ trong các vị trí ngoài này. Trong những trường hợp này, thông tin xác thực của chủ sở hữu tệp được sử dụng khi người nhận yêu cầu tệp từ lưu trữ ngoài, do đó đảm bảo rằng người nhận có thể truy cập tệp được chia sẻ. Lưu trữ ngoài có thể được cấu hình bằng GUI hoặc tại dòng lệnh. Tùy chọn thứ hai này cung cấp cho quản trị viên tính linh hoạt hơn để cấu hình các điểm gắn lưu trữ ngoài hàng loạt và thiết lập các ưu tiên gắn kết. Thông tin chi tiết hơn có sẵn trong tài liệu GUI lưu trữ ngoài và tài liệu Tệp cấu hình lưu trữ ngoài.

                  Xuất hiện lỗi“smbclient” is not installed. Mounting of “SMB / CIFS”, “SMB / CIFS using OC login”

                  Cài vô bằng câu lệnh: brew install samba

                  Sau đó: brew list –versions samba

                  và smbutil statshares -a

                  Load lại trang nextcloud.

                   

                  Noip

                  https://www.noip.com/support/knowledgebase/installing-the-dynamic-update-client-on-a-mac

                  https://developers.cloudflare.com/dns/manage-dns-records/how-to/managing-dynamic-ip-addresses/

                  https://gist.github.com/tehpeh/11274305

                   

                  Tối ưu chi phí cho Mac mini M4

                  Tối ưu chi phí cho Mac mini M4

                  Mac mini M4 là một lựa chọn tuyệt vời cho những ai đang tìm kiếm một chiếc máy tính để bàn hay server nhỏ gọn, mạnh mẽ và chạy macOS. Tuy nhiên, để tối ưu hóa chi phí cho chiếc máy này, bạn cần cân nhắc một số yếu tố sau như:

                  • Chip M4: Đây là yếu tố cốt lõi quyết định hiệu năng của máy. Nếu nhu cầu sử dụng của bạn chủ yếu là các tác vụ văn phòng, làm phim ngắn dưới 4k thì chip M4 tiêu chuẩn là đủ. Một server web thì cũng đáp ứng tương đối ổn cho tác vụ. Tuy nhiên, nếu bạn làm đồ họa, video, hoặc các tác vụ nặng hơn, hãy cân nhắc phiên bản M4 Pro để có hiệu năng tốt hơn.
                  • RAM: RAM 16GB là tiêu chuẩn trên Mac mini M4, đủ cho hầu hết người dùng. Tuy nhiên, nếu bạn thường xuyên chạy nhiều ứng dụng cùng lúc hoặc làm việc với các tập tin lớn, bạn có thể nâng cấp lên 32GB hoặc 64GB.
                  • Ổ cứng: Ổ SSD 256GB là lựa chọn cơ bản. Nếu bạn cần nhiều dung lượng lưu trữ hơn, hãy nâng cấp lên 512GB hoặc 1TB.
                  • Cổng kết nối mạng Ethernet Gigabit. Để kết nối mạng nhanh hơn, bạn có thể định cấu hình Mac mini với Ethernet 10Gb, sẽ cung cấp băng thông kết nối cao hơn để chia sẻ các tệp và làm việc với bộ nhớ mạng hiệu năng cao.

                  Lưu ý: Việc nâng cấp RAM và ổ cứng, Cổng kết nối mạng sau khi mua máy sẽ tốn kém hơn so với việc chọn cấu hình cao ngay từ đầu. Mà chạy LM studio gói Model Granite 3.1 chuẩn GGUF thì không thể chạy trên SSD bên ngoài.

                  Ram và Cổng kết nối mạng mình nên cân nhắc trước khi mua nên chi thêm khoảng này. Còn SSD chỉ cần cơ bản, chỉ còn để chạy macOS. Nó có thể kết nối ssd bên ngoài mà việc này tốt nhất nên làm ngay sau khi cài máy, nhớ mật khẩu đăng nhập máy, iCloud. Và nếu quyết định dùng cách này lâu dài thì nên dùng box và ssd có khả năng hoạt động liên tục, lâu dài. Bây giờ bắt tay thêm bằng cách như sau:

                  Bước 1. Erase lại SSD đúng chuẩn

                  – Vào Disk Utility, Chọn vào tên ổ cứng> chọn vào tên ổ cứng (ở trên cùng)> chọn Erase> và Đặt tên, Format định dạng APFS> Scheme chọn đúng GUID Partiton Map như hình

                  Lưu ý: Ai không thấy mục Scheme thì Và View> chọn Show All Device (như hình) rồi nhấn lại vào cấp cao nhất của tên ổ cứng> nhấn Erase lại sẽ thấy

                  Lưu ý: Nếu trước đó anh em có cài nhiều phần mềm và thiết đặt thì nên đặt tên này giống hệt với tên User lúc đăng nhập máy (cũng là tên thư mục Home). Lúc chuyển xong mọi thứ sẽ như cũ không cần phải thiết đặt lại.

                  Bước 2. Tạo thư mục chứa Home Folder trong ổ cứng ngoài

                  Sau khi Erase xong, mở ổ cứng ngoài lên, tạo 1 thư mục có tên bất kỳ để ở bước kế tiếp sẽ trỏ đường dẫn thư mục Home của Mac vào đây.

                  Bước 3. Copy toàn bộ dữ liệu thư mục Home sang thư mục vừa tạo trên ổ cứng gắn ngoài

                  Như hình ghi chú ở trên, thư mục Home có tên chính là tên User bạn đặt lúc cài máy, nằm ở đường dẫn/Users. Ở bước 3 ngày bạn sẽ copy toàn bộ nội dung trong thư mục home, sang thư mục vừa tạo trên SSD. Ở trường hợp của mình là nội dung trong thư mục maclife sang maclife_ex

                  Bước 4: Trỏ đường dẫn thư mục Home sang thư mục Home mới

                  Vào System Setting> chọn Users & Groups> sau đó click chuột phải vào tên User hiện tại> Sẽ thấy chữ Advanced Options> Sau đó nhập mật khẩu đăng nhập máy

                  Chọn Choose và chọn tới ổ cứng ngoài> Chọn vào thư mục đã tạo sẵn trên SSD ở bước 2.

                  Sau khi nhấn OK, máy sẽ khởi động lại và bạn phải làm lại các thao tác tương tự như lúc mới mua máy. Tới đoạn này nếu ai đã cài khá nhiều ứng dụng hoặc có các thiết đặt với dock, chuột, phím… thì sẽ phải thiết đặt lại từ đầu. Chính vì vậy mình mới khuyên nên làm ngay sau khi cài máy là tốt nhất.

                  Bước 5: [Cần đọc kỹ] Di chuyển các ứng dụng trong thư mục Application

                  Thư mục chiếm nhiều dung lượng nhất nếu anh em sử dụng nhiều phần mềm có lẽ là Application. Sau khi đã di chuyển thư mục Home sang ổ cứng ngoài thì việc di chuyển và chạy ứng dụng trong thư mục trên ổ cứng ngoài sẽ rất mượt và không lỗi. Để di chuyển thư mục Application anh em làm như sau:

                  – Mở ổ Macintosh HD (hoặc tên khác nếu AE có đổi, đại khái là ổ cài Mac), sau đó kéo thư mục Application sang thư mục Home đã tạo trên ổ cứng ngoài ở Bước 2

                  [Quan trọng quan trọng] Sau đó, ví dụ tải ứng dụng gì đó trên App Store, App thường sẽ tự động vô thư mục Applications trên ổ cứng của máy (ổ cứng gắn trong), bạn chỉ việc chép ưng dụng đó qua thư mục Applications trên ổ cứng gắn ngoài, và xóa ứng dụng trên ổ cứng gắn trong đi. Ứng dụng vẫn hoạt động bình thường và ổn định, các thư mục Cache của phần mềm nếu có cũng sẽ được tạo trong các thư mục của ổ cứng gắn ngoài.

                  Việc cài ứng dụng xong phải di chuyển qua Applications hơi cực tí, nhưng thường anh em không cài quá nhiều ứng dụng, và chỉ di chuyển 1 lần rồi xài hoài, nên cũng đáng để đánh đổi với cái giá SSD đắt đỏ của Apple, thay vào đó anh em đầu tư vào RAM sẽ tốt hơn. Chúc anh em thành công

                  Lưu ý: Sẽ có bạn nói việc move thư mục Home ra ổ cứng ngoài là không cần thiết, tuy nhiên, anh em nào có xài Zalo, Telegram hoặc một số ứng dụng có tạo cache trong thư mục Home sẽ thấy việc nó ngốn dung lượng nhiều và rất nhanh sau một thời gian sử dụng, ổ cứng 256 sẽ không trụ nổi sau vài tháng. Nên việc có thực hiện thao tác di chuyển thư mục Home ra ssd ngoài hay không là tùy mỗi người.

                  Nguồn maclife.io/cach-dua-thu-muc-home-va-ung-dung-ra-o-cung-ngoai.html

                  Có cần tắt gatekeeper

                  Hướng dẫn tắt gatekeeper trên macOS Sequoia 15


                  Cũng chả cần tắt gatekeeper vẫn cài được App thoải mái nha. Chuột phải chọn open 2 lần, rồi xattr -cr link path app.

                  Xài lệnh xattr -cr. Ko cần tắt gatekeeper gì hết.

                  Máy in Samsung cũ dùng trên Mac OS 1

                  Trình điều khiển không được cập nhật để cho phép bạn thực sự cài đặt nó trên máy tính mới. Tuy nhiên, nếu bạn có thể cài đặt nó, trình điều khiển sẽ hoạt động. Nó có thể sẽ áp dụng cho bất kỳ máy in Samsung nào có vấn đề tương tự. Pacifist là một công cụ đa năng để làm việc với các tệp gói macOS ver cũ, hình ảnh đĩa và tệp lưu trữ. Sử dụng Pacifist, bạn có thể:

                  Mở nhiều kho lưu trữ tập tin khác nhau, bao gồm: Các tệp gói macOS .pkg, Hình ảnh đĩa .dmg, Danh mục tài sản macOS, Các tệp Tome của trình cài đặt Mac OS 9 và .zip, .tar, .tar.gz, .tar.bz2, .xar và .yaa, Kiểm tra và trích xuất các tệp và thư mục riêng lẻ, Kiểm tra tập lệnh cài đặt và các tài nguyên gói khác để đảm bảo rằng một gói đáng tin cậy trước khi cài đặt nó, Phân tích các cài đặt hiện có trên hệ thống của bạn, để giúp bạn xác định ai đã cài đặt một tệp cụ thể trên hệ thống của bạn, Xem nội dung lưu trữ trực tiếp từ Finder thông qua QuickLook, Xem và trích xuất các tệp từ kho lưu trữ thông qua sự lựa chọn của bạn về giao diện GUI mượt mà hoặc giao diện dòng lệnh thân thiện với tự động hóa và thậm chí kiểm tra nội dung của các tệp .zip (và các loại được hỗ trợ khác) qua Web mà không cần tải xuống toàn bộ kho lưu trữ trước.

                  Pacifist được tối ưu hóa cho Apple Silicon và cũng hoạt động trên bộ xử lý Intel™ 64 bit. Ứng dụng Pacifist được sử dụng miễn phí ít nhất một lần mà không tính phí. Không chắc nó cho phép nó bao nhiêu lần.

                  1. Tải xuống tệp .dmg từ Samsung Printer Drivers v2.6 cho OS X (AU)
                  2. Tải xuống ứng dụng macOS của bên thứ 3 có tên Pacifist của CharlesSoft từ https://www.charlessoft.com
                  3. Mở .dmg sao cho nó gắn vào Finder
                  4. Mở Pacifist
                  5. Chọn Gói Mở
                  6. Xác định vị trí tệp bên trong tệp .dmg được gắn
                  7. Chọn Cài đặt trên thanh công cụ trên cùng của Pacifist và cung cấp thông tin đăng nhập quản trị viên của bạn khi được nhắc
                  8. Thêm máy in của bạn từ Tùy chọn hệ thống > In và quét > + thành công!

                  Gói SAMSUNG v2.6 hỗ trợ các máy: C410, C460, CLP-300, CLP-610, CLP-680, CLX-216x, CLX-6260, CLX-8640_8650, CLX-92x1_93x1, M2020, M2070, M262x_282x, M267x_287x, M332x_382x_402x, M337x_387x_407x, MFP_65x, ML-1630, ML-1630W, ML-1640, ML-191x_252x, ML-2240, ML-2245, PDEs, SCMS, SCX-4300, SCX-4500, SCX-4500W, SCX-4600, SCX-4623, SCX-4623FW, SCX-4×24, SCX-8123_8128.

                  Gói Samsung_Mac_Driver_V3.93.08: C268x, C3010, C3060, C351x, C401x, C406x, C43x, C48x, C51x, K2200, K302, K3250, M2010, M2020, M203x, M2060, M2070, M262x_282x, M263x_M284x, M267x_287x, M283x, M288x, M301x, M306x, M332x_382x_402x, M337x_387x_407x, M403x, M408x, M456x, ML-2160, SCX-3400, SCX-4650_4x21S, SF-760, UPD, X3220

                  Triển khai LLM trên Apple Silicon (M1, M2, M3, M4)

                  Triển khai LLM trên Apple Silicon (M1, M2, M3, M4)
                  Nội dung

                    Chạy mô hình ngôn ngữ lớn như Llama 3 trên Apple Silicon với MLX Framework của Apple. Người dùng Mac, việc tận dụng MLX Framework của Apple có thể nâng cao đáng kể hiệu quả đào tạo và triển khai các mô hình này trên silicon của Apple. Hướng dẫn này cung cấp hướng dẫn chi tiết về các bước và cân nhắc cần thiết để chạy Llama 3 hoặc bất kỳ LLM nào khác bằng MLX Framework.

                    Yêu cầu phần cứng:
                    – Bạn cần ít nhất 8 GB VRAM để thực hiện chính xác hướng dẫn này.

                    – Sử dụng chip dòng M (chip Apple)

                    – Sử dụng Python gốc >= 3.9

                    – macOS >= 13.5 nên sử dụng macOS 14 (Sonoma)

                    Thử nghiệm với LLM trên máy tính của bạn. Giao diện trò chuyện và API có thể lập trình https://lmstudio.ai/download?os=mac

                    Để sử dụng MLX với LibreChat https://www.librechat.ai/blog/2024-05-01_mlx

                    Framework MLX

                    Lấy cảm hứng từ PyTorch, Jax và ArrayFire, MLX là một khuôn khổ đào tạo và phục vụ mô hình được thiết kế riêng cho silicon của Apple bởi Apple Machine Learning Research. Nó hỗ trợ một loạt các tác vụ học máy, bao gồm tạo văn bản quy mô lớn, tạo hình ảnh và nhận dạng giọng nói. Khuôn khổ này được tích hợp với Hugging Face, cho phép tải và phục vụ mô hình liền mạch.

                    Triển khai LLM trên Apple Silicon (M1, M2, M3, M4)

                    Các tính năng chính

                    – API quen thuộc : MLX cung cấp API Python bám sát NumPy, cùng với các API C++, C và Swift có đầy đủ tính năng tương tự như API Python.
                    – Chuyển đổi hàm có thể cấu hình : Hỗ trợ tính toán phân biệt tự động, vectơ hóa và tối ưu hóa đồ thị tính toán.
                    – Tính toán Lazy : Tính toán MLX linh động, nghĩa là các mảng chỉ được thực hiện khi cần thiết, giúp tăng hiệu quả.
                    – Xây dựng đồ thị động : Đồ thị tính toán được xây dựng theo kiểu động, tránh biên dịch chậm và đơn giản hóa việc gỡ lỗi.
                    – Hỗ trợ nhiều thiết bị : Các hoạt động có thể được thực hiện trên bất kỳ thiết bị được hỗ trợ nào (CPU hoặc GPU) mà không cần truyền dữ liệu.
                    – Mô hình bộ nhớ hợp nhất : MLX sử dụng mô hình bộ nhớ hợp nhất, cho phép CPU và GPU chia sẻ cùng một nhóm bộ nhớ, loại bỏ nhu cầu truyền dữ liệu giữa chúng và do đó nâng cao hiệu quả và hiệu suất.

                    Hạn chế

                    – Dành riêng cho Apple Silicon : MLX được thiết kế dành riêng cho Apple silicon, giới hạn việc sử dụng cho phần cứng tương thích.
                    – Hỗ trợ cộng đồng hạn chế : Là một khuôn khổ tương đối mới, MLX có cộng đồng nhỏ hơn và ít tài nguyên hơn so với các khuôn khổ đã được thành lập lâu đời hơn.
                    – Thách thức về tối ưu hóa : Mặc dù khuôn khổ này hiệu quả, nhưng để đạt được hiệu suất tối ưu có thể cần phải điều chỉnh đáng kể và hiểu biết sâu sắc về cả phần cứng và khuôn khổ.

                    Cài đặt

                    Tạo một môi trường ảo (khuyến nghị)

                    Đầu tiên, hãy tạo một môi trường ảo cho dự án của bạn. Bước này là tùy chọn nếu bạn đã thiết lập một môi trường ảo.

                    1. Điều hướng đến thư mục dự án của bạn và tạo môi trường ảo:
                    python3 -m venv env_name
                    2. Kích hoạt môi trường:
                    source env_name\\bin\\activate

                    Cài đặt MLX-LM

                    MLX là một gói độc lập và có một gói phụ gọi là MLX-LM tích hợp Hugging Face cho các Mô hình ngôn ngữ lớn.

                    1. Cài đặt MLX-LM
                    pip3 install mlx-lm
                    Tùy chọn: Cài đặt PyTorch (phiên bản nightly) — ẩn cảnh báo:

                    pip3 install –pre torch –index-url <https://download.pytorch.org/whl/nightly/cpu>

                    Tải xuống mô hình

                    1. Tải xuống mô hình từ kho lưu trữ Hugging Face Hub
                    Nếu bạn muốn sử dụng mô hình lượng tử (dành cho máy tính có RAM dưới 16):

                    python3 -m mlx_lm.convert –hf-path meta-llama/Meta-Llama-3-8B-Instruct -q
                    Thao tác này sẽ lưu mô hình vào thư mục dự án của bạn tại mlx_model.

                    Nếu không thì:

                    python3 -m mlx_lm.generate –model meta-llama/Meta-Llama-3-8B-Instruct
                    2. Kiểm tra mô hình

                    python3 -m mlx_lm.generate –model model_path –prompt “xin chào”

                    Thực hiện

                    Để sử dụng mô hình đã tải xuống trong ứng dụng của bạn, bạn có thể sử dụng triển khai máy chủ do mlx-lm cung cấp. Điều này sẽ khởi động máy chủ cục bộ giống OpenAI trên http://localhost:8080 .

                    Điểm cuối: http://localhost:8080/v1/chat/completions

                    Các trường yêu cầu:

                    messages tin nhắn : Mảng các đối tượng tin nhắn có vai trò (ví dụ: người dùng, trợ lý) và nội dung (văn bản tin nhắn).
                    – role_mapping : Từ điển tùy chọn để tùy chỉnh tiền tố vai trò trong lời nhắc.
                    stop dừng : Chuỗi mã thông báo tùy chọn mà quá trình tạo sẽ dừng lại.
                    – max_tokens : Số nguyên tùy chọn cho số lượng mã thông báo tối đa cần tạo (mặc định: 100).
                    – stream : Boolean tùy chọn để chỉ ra liệu phản hồi có nên được truyền phát hay không (mặc định: false).
                    temperature nhiệt độ : Tùy chọn float cho nhiệt độ lấy mẫu (mặc định: 1.0).
                    – top_p : Giá trị float tùy chọn cho tham số lấy mẫu hạt nhân (mặc định: 1.0).
                    – repetition_penalty : Tùy chọn float để áp dụng hình phạt cho các mã thông báo lặp lại (mặc định: 1.0).
                    – repetition_context_size : Kích thước tùy chọn của cửa sổ ngữ cảnh cho hình phạt lặp lại (mặc định: 20).
                    – logit_bias : Tùy chọn ánh xạ ID mã thông báo từ điển với giá trị độ lệch của chúng.

                    Khởi động máy chủ

                    mlx_lm.server –model model_path

                    Trò chuyện bằng Python

                    Sau khi máy chủ chạy, bạn có thể gửi yêu cầu POST đến máy chủ. Sau đây là ví dụ về chatbot được tạo bằng Python:

                    import requests
                    import json
                    from typing import List, Dict

                    # Function to send a request to the server and get a response
                    def get_response(
                    server_url: str,
                    messages: List[Dict[str, str]],
                    temperature: float = 0.7,
                    top_p: float = 0.9,
                    max_tokens: int = 4096,
                    stream: bool = True,
                    ) -> str:
                    headers = {“Content-Type”: “application/json”}
                    data = {
                    “messages”: messages,
                    “temperature”: temperature,
                    “top_p”: top_p,
                    “max_tokens”: max_tokens,
                    “stream”: stream,
                    }

                    # Send POST request to the server
                    response = requests.post(
                    f”{server_url}/v1/chat/completions”,
                    headers=headers,
                    data=json.dumps(data),
                    stream=stream,
                    )
                    response.raise_for_status() # Ensure the request was successful

                    if stream:
                    content = “”
                    for line in response.iter_lines():
                    if line:
                    decoded_line = line.decode(“utf-8”).lstrip(“data: “)
                    try:
                    json_line = json.loads(decoded_line)
                    if “choices” in json_line and len(json_line[“choices”]) > 0:
                    delta = json_line[“choices”][0].get(“delta”, {})
                    content_piece = delta.get(“content”, “”)
                    content += content_piece
                    print(content_piece, end=“”, flush=True)
                    except json.JSONDecodeError:
                    continue
                    print() # Ensure the next prompt starts on a new line
                    return content
                    else:
                    result = response.json()
                    if “choices” in result and len(result[“choices”]) > 0:
                    return result[“choices”][0][“message”][“content”]else:
                    return “”

                    # Function to run the chatbot
                    def chatbot(
                    server_url: str,
                    system_instructions: str = “”,
                    temperature: float = 0.7,
                    top_p: float = 0.9,
                    max_tokens: int = 4096,
                    stream: bool = True,
                    ):
                    messages = [{“role”: “system”, “content”: system_instructions}]while True:
                    prompt = input(“User: “)
                    if prompt.lower() in [“exit”, “quit”]:
                    break
                    messages.append({“role”: “user”, “content”: prompt})
                    print(“Assistant: “, end=“”)
                    response = get_response(
                    server_url, messages, temperature, top_p, max_tokens, stream
                    )
                    messages.append({“role”: “assistant”, “content”: response})

                    if __name__ == “__main__”:
                    server_url = “http://localhost:8080”
                    chatbot(server_url=server_url)

                    Kết luận

                    framework MLX cung cấp giải pháp mạnh mẽ và hiệu quả để chạy các mô hình ngôn ngữ lớn trên silicon của Apple. Thiết kế thân thiện với người dùng, lấy cảm hứng từ các framework như NumPy và PyTorch, giúp các nhà nghiên cứu và nhà phát triển dễ tiếp cận. Bất chấp những hạn chế của nó, khả năng đào tạo và suy luận mô hình quy mô lớn của MLX khiến nó trở thành một công cụ có giá trị trong bối cảnh học máy.

                    Tài liệu tham khảo
                    https://github.com/ml-explore/mlx-examples/blob/main/llms/mlx_lm
                    https://github.com/ml-explore/mlx-examples/blob/main/llms/mlx_lm/SERVER.md
                    https://github.com/ml-explore/mlx?tab=readme-ov-file
                    https://huggingface.co/docs/hub/en/mlx

                    https://medium.com/@manuelescobar-dev/running-large-language-models-llama-3-on-apple-silicon-with-apples-mlx-framework-4f4ee6e15f31

                    Khung Nexa suy luận cục bộ trên thiết bị

                    Nexa SDK là một khuôn khổ suy luận cục bộ trên thiết bị cho các mô hình ONNX và GGML, hỗ trợ tạo văn bản, tạo hình ảnh, mô hình ngôn ngữ thị giác (VLM), mô hình ngôn ngữ âm thanh, khả năng chuyển giọng nói thành văn bản (ASR) và chuyển văn bản thành giọng nói (TTS). Có thể cài đặt thông qua Python Package hoặc Executable Installer.

                    Running Local LLMs and VLMs on the Raspberry Pi

                    https://github.com/NexaAI/nexa-sdk

                    Thiết lập máy chủ LLM của riêng bạn bằng MLX Server, Chainlit và Llama 3.1

                    Sau đây là bản demo về máy chủ LLM cục bộ chạy thành công trên MacBook Pro M2 2022 với RAM 16 GB và Python 3.12.4. Để chạy MLX Server trơn tru, thiết bị của bạn phải đáp ứng các yêu cầu sau:

                    Chip silicon của Apple (dòng M)
                    Phiên bản Python gốc >= 3.8
                    Phiên bản macOS >= 13.3 (Ventura)

                    https://github.com/flaviodelgrosso/mlx-chainlit-llama3

                    https://anakin.ai/blog/how-to-run-llama-3-3-70b-locally-mac-windows-linux/

                    Cài đặt

                    python3 -m venv venv
                    source venv/bin/activate
                    pip install -r requirements.txt

                    Máy chủ đang chạy

                    python -m mlx_lm.server –model mlx-community/Meta-Llama-3.1-8B-Instruct-4bit –log-level DEBUG

                    Thao tác này sẽ khởi động máy chủ MLX và sẽ tải xuống LLM nếu nó chưa được tải xuống từ Hugging Face. Kiểm tra liên kết này để biết thêm thông tin về MLX.

                    Ứng dụng đang chạy

                    chainlit run app.py

                    Thao tác này sẽ khởi động ứng dụng Chainlit.

                    llamafile cho phép bạn phân phối và chạy LLM bằng một tệp duy nhất

                    Cách dễ nhất để tự mình thử là tải xuống llamafile mẫu của chúng tôi cho mô hình LLaVA (giấy phép: LLaMA 2 , OpenAI ). LLaVA là một LLM mới có thể làm nhiều việc hơn là chỉ trò chuyện; bạn cũng có thể tải hình ảnh lên và hỏi nó các câu hỏi về chúng. Với llamafile, tất cả những điều này đều diễn ra cục bộ; không có dữ liệu nào rời khỏi máy tính của bạn.

                    Tải xuống llava-v1.5-7b-q4.llamafile (4,29 GB).

                    Mở terminal của máy tính.

                    Nếu bạn đang sử dụng macOS, Linux hoặc BSD, bạn sẽ cần cấp quyền cho máy tính của mình để thực thi tệp mới này. (Bạn chỉ cần thực hiện việc này một lần.)

                    chmod +x llava-v1.5-7b-q4.llamafile
                    Nếu bạn sử dụng Windows, hãy đổi tên tệp bằng cách thêm “.exe” vào cuối.

                    Chạy llamafile. Ví dụ:

                    ./llava-v1.5-7b-q4.llamafile
                    Trình duyệt của bạn sẽ tự động mở và hiển thị giao diện trò chuyện. (Nếu không, chỉ cần mở trình duyệt và trỏ tới http://localhost:8080 )

                    Khi bạn trò chuyện xong, hãy quay lại thiết bị đầu cuối và nhấn Control-C để tắt llamafile.

                    chạy Ollama và thư viện Swift SwiftOpenAI

                    Tôi không ngờ việc có thể chạy các mô hình mã nguồn mở cục bộ trong ứng dụng Mac OS lại dễ dàng đến vậy, đây sẽ là hướng dẫn ngắn về cách thực hiện việc này bằng Ollama và thư viện Swift SwiftOpenAI.

                    Năm nay, Ollama đã xây dựng khả năng tương thích cho OpenAI Chat Completions API . Điều này cho phép bạn sử dụng các mô hình cục bộ với cùng API mà bạn sẽ sử dụng để tương tác với các mô hình OpenAI.

                    Bạn có thể sử dụng các mô hình mạnh mẽ nhưllama3hoặcMistraltrong ứng dụng của mình bằng cách làm theo các bước đơn giản sau!

                    Bước 1:

                    Để sử dụngOllama,trước tiên bạn cần tải xuống từ trang web chính thức của họtại đây.

                    Bước 2:

                    Bây giờ bạn cần tải xuống mô hình bạn muốn sử dụng. Ví dụ, điều này sẽ tải xuống Llama 3:ollama pull llama3

                    Bước 3:

                    Bây giờ bạn có thể sử dụng terminal của mình nếu bạn muốn tương tác với LLM. Bạn chỉ cần làm như sau:ollama run llama3

                    Bước 4:

                    Nếu bạn muốn sử dụng điều này trong một ứng dụng, bạn có thể sử dụngSwiftOpenAItrong máy khách của mình. Tất cả những gì bạn cần làm là thêm gói dưới dạng phụ thuộc vào dự án của bạn và sau đó…

                    import SwiftOpenAI 
                    
                    // Khởi tạo một dịch vụ và sử dụng URL localhost do Ollama cung cấp. 
                    let service =  OpenAIServiceFactory .service(baseURL: "http://localhost:11434" )

                    Sau đó, bạn có thể sử dụng API hoàn thành như sau:

                    cho lời nhắc =  "Kể cho tôi một câu chuyện cười" 
                    let prompt = "Tell me a joke"
                    let parameters = ChatCompletionParameters(messages: [.init(role: .user, content: .text(prompt))], model: .custom("llama3"))
                    let chatCompletionObject = service.startStreamedChat(parameters: parameters)
                    

                    Đó là tất cả những gì bạn cần để chạy các mô hình cục bộ bên trong ứng dụng của riêng bạn! Để biết bản demo về cách sử dụng nó trong iOS, hãy kiểm tradự án ví dụ trong kho lưu trữ này.

                    https://www.llama.com/docs/llama-everywhere/running-meta-llama-on-mac/

                    https://github.com/huggingface/transformers.js-examples/tree/main/llama-3.2-webgpu

                    Chạy cục bộ LM Studio và Anything LLM Desktop

                    LM Studio: Công cụ đa năng này cho phép bạn khám phá và chạy các LLM khác nhau cục bộ trên máy của mình.
                    Anything LLM: Một ứng dụng máy tính để bàn giúp nâng cao khả năng của LM Studio, cung cấp một bộ toàn diện để tương tác với các tài liệu, trang web, v.v.
                    Cả hai công cụ LM Studio và Anything LLM đều là mã nguồn mở, cho phép bạn tự do sử dụng và thậm chí đóng góp vào sự phát triển của chúng.

                    Thiết lập LM Studio

                    LM Studio cực kỳ dễ để bắt đầu: Chỉ cần cài đặt, tải xuống một mô hình và chạy nó. Có rất nhiều hướng dẫn trực tuyến. Ngoài ra, nó sử dụng llama.cpp, về cơ bản có nghĩa là bạn phải sử dụng các mô hình có định dạng tệp .gguf. Đây là định dạng phổ biến nhất hiện nay và có hỗ trợ rất tốt. Đối với mô hình nào để chạy, nó phụ thuộc vào bộ nhớ GPU của bạn. Về cơ bản:

                    4GB VRAM -> Chạy Gemma 2B, Phi 3 Mini ở Q8 hoặc Llama 3 8B/ Gemma 9B ở Q4
                    8GB VRAM -> Chạy Llama 3 8B/ Gemma 9B ở Q8
                    16GB VRAM -> Chạy Gemma 27B/ Command R 35B ở Q4
                    24GB VRAM -> Chạy Gemma 27B ở Q6 hoặc Llama 3 70B ở Q2 (Số lượng thấp, không khuyến khích để mã hóa)

                    Lượng tử hóa Quantizations (Q2, Q4, v.v.) giống như phiên bản nén của một mô hình. Q8 có chất lượng rất cao (bạn sẽ không nhận thấy nhiều sự khác biệt). Q6 cũng khá cao, gần bằng Q8. Q4 ở mức trung bình nhưng vẫn khá tốt. Q2 ổn đối với các mô hình lớn cho các tác vụ không phải mã hóa nhưng nó khá tàn bạo và làm giảm trí thông minh của chúng. (Đối với các mô hình nhỏ, chúng bị ‘nén’ quá nhiều và mất đi rất nhiều trí thông minh)

                    Đối với vector hóa, LM studio cung cấp một số hỗ trợ cho việc nhúng mô hình: họ đề xuất Nomic Embed v1.5, nhẹ và khá tốt. Thêm vào đó, bạn có thể dễ dàng sử dụng vì nó cung cấp API cục bộ giống OpenAI.
                    Bước 1: Tải xuống và cài đặt
                    Đầu tiên, hãy tải xuống LM Studio cho hệ điều hành của bạn. Sau khi quá trình tải xuống hoàn tất, hãy cài đặt nó theo các bước thông thường.
                    Bước 2: Khám phá các mô hình
                    Sau khi cài đặt, hãy mở LM Studio. Bạn sẽ đến một trang khám phá giới thiệu các mô hình phổ biến khác nhau. Đối với hướng dẫn này, hãy tải xuống mô hình Mistal 7B Instruct, một phiên bản lượng tử 4 bit.
                    Việc tải xuống các mô hình có thể tốn thời gian, vì vậy hãy bắt đầu quá trình này sớm. Sau khi tải xuống, bạn có thể tìm thấy các mô hình của mình trong tab “Mô hình”.
                    Bước 3: Chạy mô hình
                    Để kiểm tra mô hình của bạn, hãy chuyển đến biểu tượng bong bóng trò chuyện và chọn mô hình bạn đã tải xuống. Bạn có thể đặt trước lời nhắc hệ thống và bật tính năng giảm tải GPU nếu máy của bạn hỗ trợ nó.

                    Tăng cường với Anything LLM

                    Nếu bạn biết LLM nào bạn muốn và tất cả các tùy chọn liên quan đến việc điều chỉnh hiệu suất mô hình, như chuyển tải GPU và các tùy chọn tương tự, thì bạn có thể sử dụng LMStudio + AnythingLLM cùng lúc. AnythingLLM dành cho RAG, Agents và tooling, và LMStudio chỉ để chạy mô hình bạn muốn với các thiết lập đã xác định của bạn. Nó tiên tiến hơn một bước so với AnythingLLM độc lập.

                    AnythingLLM hoạt động như thế nào

                    Một không gian làm việc được tạo. LLM chỉ có thể “xem” các tài liệu được nhúng trong không gian làm việc này. Nếu một tài liệu không được nhúng thì LLM không có cách nào có thể xem hoặc truy cập nội dung của tài liệu đó.

                    Bạn tải lên một tài liệu, điều này giúp bạn có thể “Chuyển vào không gian làm việc” hoặc “nhúng” tài liệu. Tải lên sẽ lấy tài liệu của bạn và biến nó thành văn bản – thế là xong.

                    Bạn “Di chuyển tài liệu đến không gian làm việc”. Thao tác này sẽ lấy văn bản từ bước 2 và chia thành các phần dễ tiêu hóa hơn. Sau đó, các khối này sẽ được gửi đến mô hình nhúng của bạn và chuyển thành một danh sách các số, được gọi là chuỗi số này được lưu. vào cơ sở dữ liệu vectơ của bạn và về cơ bản là cách RAG hoạt động. Không có gì đảm bảo rằng văn bản có liên quan sẽ ở cùng nhau trong bước này!

                    Bạn nhập câu hỏi vào hộp trò chuyện và nhấn gửi.

                    Câu hỏi của bạn sau đó sẽ được nhúng giống như văn bản tài liệu của bạn.

                    Sau đó, cơ sở dữ liệu vectơ sẽ tính toán vectơ đoạn “gần nhất”. AnythingLLM lọc bất kỳ đoạn văn bản “có điểm thấp” nào (bạn có thể sửa đổi phần này). Mỗi vectơ có văn bản gốc được lấy từ đó. Đây không phải là một ngữ nghĩa thuần túy. quá trình để cơ sở dữ liệu vectơ không “hiểu ý bạn”. Đây là một quá trình toán học sử dụng công thức “Khoảng cách Cosine”. Tuy nhiên, đây là nơi mô hình nhúng được sử dụng và các cài đặt AnythingLLM khác có thể tạo ra sự khác biệt lớn nhất. phần tiếp theo.

                    Bất kỳ đoạn nào được coi là hợp lệ sẽ được chuyển đến LLM dưới dạng văn bản gốc. Những văn bản đó sau đó sẽ được thêm vào LLM là “Thông báo hệ thống” của nó. Ngữ cảnh này được chèn bên dưới lời nhắc hệ thống của bạn cho không gian làm việc đó.

                    LLM sử dụng lời nhắc hệ thống + ngữ cảnh, truy vấn và lịch sử của bạn để trả lời câu hỏi một cách tốt nhất có thể.

                    Bước 1: Tải xuống và cài đặt
                    Tiếp theo, tải xuống Anything LLM cho hệ điều hành của bạn từ trang web chính thức. Cài đặt nó như bạn làm với bất kỳ phần mềm nào khác.
                    Bước 2: Cấu hình ban đầu
                    Khi bạn mở Anything LLM lần đầu tiên, bạn sẽ được nhắc cấu hình phiên bản. Chọn LM Studio làm LLM của bạn và nhập URL cơ sở cho máy chủ cục bộ của LM Studio.
                    Để tìm URL này, hãy chuyển đến tab Máy chủ cục bộ trong LM Studio. Khởi động máy chủ và sao chép URL được cung cấp.
                    Bước 3: Thêm tài liệu và trang web
                    Với Anything LLM, bạn có thể tương tác với nhiều tài liệu và trang web khác nhau. Tải lên tệp PDF, tài liệu văn bản hoặc quét trang web trực tiếp từ giao diện.

                    Cấu hình nâng cao

                    Nhúng vào cơ sở dữ liệu vector: Bất cứ điều gì LLM bao gồm mô hình nhúng và cơ sở dữ liệu vector của riêng nó, đảm bảo tất cả dữ liệu của bạn vẫn ở chế độ cục bộ và riêng tư. Trong quá trình thiết lập, bạn có thể chọn sử dụng các tính năng tích hợp sẵn này hoặc kết nối với các dịch vụ bên ngoài.

                    Không gian làm việc tùy chỉnh: Tạo không gian làm việc tùy chỉnh cho các dự án khác nhau. Ví dụ: tạo một không gian làm việc có tên là “Dự án X” và tải lên tất cả các tài liệu và dữ liệu web có liên quan. LLM sẽ sử dụng ngữ cảnh này để đưa ra câu trả lời chính xác hơn.

                    Ứng dụng trong thế giới thực: Ví dụ: Quét một trang web
                    Để thu thập thông tin từ một trang web cụ thể, hãy sử dụng tính năng cạo trong Anything LLM. Sau khi cạo, nhúng dữ liệu vào mô hình. Bây giờ, khi bạn đặt câu hỏi LLM liên quan đến nội dung của trang web đó, nó sẽ cung cấp các câu trả lời sáng suốt.

                    Cân nhắc về hiệu suất

                    Yêu cầu phần cứng
                    Mặc dù hướng dẫn này trình bày các mô hình đang chạy trên CPU, nhưng việc có GPU sẽ cải thiện đáng kể hiệu suất. Ví dụ, các mô hình như Llama 2 sẽ chạy nhanh hơn nhiều trên các máy được trang bị GPU.
                    Lựa chọn mô hình
                    Việc lựa chọn mô hình ảnh hưởng đến hiệu suất. Các mô hình nhỏ hơn như phiên bản 7 tỷ tham số của Llama 2 dễ quản lý hơn trên phần cứng kém mạnh mẽ hơn nhưng có thể cung cấp các phản hồi ít phức tạp hơn so với các mô hình lớn hơn.

                    https://pyimagesearch.com/2024/06/24/integrating-local-llm-frameworks-a-deep-dive-into-lm-studio-and-anythingllm/

                    Thêm tiện ích cho lập trình

                    Vô Extention của Visual Studio code thêm Cline (prev. Claude). Thêm model code, rồi xong.

                    Những Model

                    DeepSeek của Trung Quốc đã phát hành mô hình mã nguồn mở DeepSeek-v3, mô hình này đã vượt trội hơn tất cả các tên tuổi lớn như Claude3.5 Sonnet, GPT-4o, Qwen2.5 Coder và các tên tuổi khác. có kích thước ấn tượng là 685 tỷ tham số, 60 token/giây. Nếu bạn chỉ muốn trò chuyện, mô hình được lưu trữ miễn phí trên kênh trò chuyện chính thức của deepseek:https://www.deepseek.com/

                    Jan

                    Jan là một ứng dụng điện tử có các tính năng tương tự như LM Studio. Nó làm cho AI trở nên mở và dễ tiếp cận với tất cả mọi người bằng cách biến máy móc của người tiêu dùng thành máy tính AI. Vì đây là một dự án nguồn mở, hỗ trợ các kiến ​​trúc phổ quát GPUs (fast), Apple M-series (fast), Apple Intel, Linux Debian và Windows x64. Sau đây là phân tích các tính năng chính của Jan.

                    Cục bộ : Bạn có thể chạy các mô hình AI ưa thích trên các thiết bị mà không cần kết nối chúng với Internet.
                    Các mô hình sẵn sàng sử dụng : Sau khi tải xuống Jan, bạn sẽ nhận được một bộ các mô hình đã cài đặt để bắt đầu. Ngoài ra còn có khả năng tìm kiếm các mô hình cụ thể.
                    Nhập mô hình : Hỗ trợ nhập mô hình từ các nguồn như Hugging Face.
                    Miễn phí, đa nền tảng và mã nguồn mở : Jan hoàn toàn miễn phí, mã nguồn mở và hoạt động trên Mac, Windows và Linux.
                    Tùy chỉnh tham số suy luận : Điều chỉnh các tham số mô hình như Mã thông báo tối đa, nhiệt độ, luồng, hình phạt tần suất, v.v. Tất cả các tùy chọn, cách sử dụng mô hình và cài đặt đều được lưu cục bộ trên máy tính của bạn.
                    Tiện ích mở rộng : Jan hỗ trợ các tiện ích mở rộng như TensortRT và Inference Nitro để tùy chỉnh và nâng cao mô hình AI của bạn.
                    Lợi ích của việc sử dụng Jan
                    Jan cung cấp một giao diện sạch sẽ và đơn giản để tương tác với LLM và nó lưu trữ tất cả dữ liệu và thông tin xử lý của bạn cục bộ. Nó có hơn bảy mươi mô hình ngôn ngữ lớn đã được cài đặt sẵn để bạn sử dụng. Tính khả dụng của các mô hình sẵn sàng sử dụng này giúp bạn dễ dàng kết nối và tương tác với các API từ xa như OpenAI và Mistral. Jan cũng có một cộng đồng GitHub , Discord và Hugging Face tuyệt vời để theo dõi và yêu cầu trợ giúp. Tuy nhiên, giống như tất cả các công cụ LLM, các mô hình hoạt động nhanh hơn trên máy Mac Apple Silicon so với trên máy Intel.

                    GPT4All

                    GPT4All có thể chạy LLM trên phần cứng tiêu dùng chính như chip Mac M-Series, GPU AMD và NVIDIA. Sau đây là các tính năng chính của nó.

                    Quyền riêng tư là trên hết : Chỉ lưu trữ thông tin trò chuyện riêng tư và nhạy cảm cũng như lời nhắc trên máy của bạn.
                    Không cần Internet : Hoạt động hoàn toàn ngoại tuyến.
                    Khám phá mô hình : Tính năng này cho phép các nhà phát triển duyệt và tải xuống các loại LLM khác nhau để thử nghiệm. Bạn có thể chọn khoảng 1000 mô hình ngôn ngữ nguồn mở từ các tùy chọn phổ biến như LLama, Mistral, v.v.
                    Tài liệu cục bộ : Bạn có thể cho phép LLM cục bộ của mình truy cập dữ liệu nhạy cảm bằng các tài liệu cục bộ như .pdfvà .txtkhông cần dữ liệu rời khỏi thiết bị của bạn cũng như không cần mạng.
                    Tùy chọn tùy chỉnh : Cung cấp một số tùy chọn điều chỉnh chatbot như nhiệt độ, kích thước lô, độ dài ngữ cảnh, v.v.
                    Phiên bản doanh nghiệp : GPT4ALL cung cấp gói doanh nghiệp với tính năng bảo mật, hỗ trợ và giấy phép theo từng thiết bị để mang AI cục bộ đến với doanh nghiệp.

                    Ứng dụng thu thập dữ liệu người dùng ẩn danh về phân tích sử dụng và chia sẻ trò chuyện. Tuy nhiên, người dùng có tùy chọn tham gia hoặc không tham gia. Sử dụng GPT4ALL, các nhà phát triển được hưởng lợi từ lượng người dùng lớn, cộng đồng GitHub và Discord.

                    Qwen2.5-Coder chạy cục bộ

                    Qwen2.5-Coder xây dựng dựa trên nền tảng của các phiên bản trước đó đồng thời giới thiệu những cải tiến đáng kể về hiệu quả và hiệu suất của mô hình. Chuỗi mô hình có nhiều kích cỡ, mỗi kích cỡ được tối ưu hóa cho các trường hợp sử dụng và ràng buộc tính toán khác nhau. Kiến trúc sử dụng thiết kế máy biến áp đã sửa đổi với các cơ chế chú ý nâng cao và sử dụng tham số được tối ưu hóa.
                    Triển khai LLM trên Apple Silicon (M1, M2, M3, M4)
                    Ollama cung cấp một phương pháp hợp lý để chạy Qwen2.5-Coder cục bộ. Sau đây là quy trình thiết lập chi tiết:

                    # Cài đặt Ollama
                    curl – fsSL < https: / / ollama.com / install.sh > | sh

                    # Kéo Qwen2 .5 – Mô hình Coder
                    ollama pull qwen2 .5 – coder

                    # Tạo một Modelfile tùy chỉnh cho các cấu hình cụ thể
                    cat << EOF > Modelfile
                    FROM qwen2.5coder

                    # Cấu hình các tham số mô hình
                    PARAMETER temperature 0.7
                    PARAMETER top_p 0.9
                    PARAMETER repeat_penalty 1.1
                    PARAMETER context_length 32768

                    # Đặt thông báo hệ thống You are an expert programming assistant.

                    SYSTEM “Bạn là trợ lý lập trình chuyên gia.”
                    EOF

                    # Tạo mô hình tùy chỉnh
                    ollama create qwen2 .5 – coder – custom – f Modelfile

                    Phân tích hiệu suất Coder Qwen2.5

                    Đánh giá hiệu suất cho thấy khả năng ấn tượng trên nhiều tác vụ mã hóa khác nhau. Mô hình này chứng minh sức mạnh đặc biệt trong việc hoàn thành mã, phát hiện lỗi và tạo tài liệu. Khi chạy trên phần cứng tiêu dùng với NVIDIA RTX 3090, mô hình 7B đạt thời gian suy luận trung bình là 150ms cho các tác vụ hoàn thành mã, đồng thời duy trì độ chính xác cao trên nhiều ngôn ngữ lập trình.

                    Triển khai Qwen2.5-Coder bằng Python
                    Sau đây là một ví dụ triển khai toàn diện sử dụng Python và API HTTP của Ollama:

                    import requests
                    import json

                    class Qwen25Coder :
                    def __init__ ( self, base_url= “<http://localhost:11434>” ):
                    self.base_url = base_url
                    self.api_generate = f” {base_url} /api/generate”

                    def generate_code ( self, prompt, model= “qwen2.5-coder-custom” ):
                    payload = {
                    “model” : model,
                    “prompt” : prompt,
                    “stream” : False ,
                    “options” : {
                    “temperature” : 0.7 ,
                    “top_p” : 0.9 ,
                    “repeat_penalty” : 1.1
                    }
                    }

                    response = requests.post(self.api_generate, json=payload)
                    return response.json()[ “response” ]

                    def code_review ( self, code ):
                    prompt = f”””Xem lại mã sau và cung cấp phản hồi chi tiết:

                    “`
                    {code}
                    “`

                    Vui lòng phân tích:
                    1. Chất lượng mã
                    2. Lỗi tiềm ẩn
                    3. Ý nghĩa về hiệu suất
                    4. Cân nhắc về bảo mật”””

                    return self.generate_code(prompt)

                    # Ví dụ về cách sử dụng
                    coder = Qwen25Coder()

                    # Ví dụ về hoàn thành mã
                    code_snippet = “””
                    def calculate_fibonacci(n):
                    if n <= 0:
                    return [] elif n == 1:
                    return [0] “””

                    completion = coder.generate_code( f”Hoàn thành hàm chuỗi Fibonacci này: {code_snippet} )

                    Việc triển khai ở trên cung cấp một giao diện mạnh mẽ để tương tác với Qwen2.5-Coder thông qua Ollama. Qwen25Coder Lớp này đóng gói các hoạt động chung và cung cấp một API sạch cho các tác vụ tạo và xem xét mã. Mã này bao gồm các tùy chọn xử lý lỗi và cấu hình phù hợp, giúp nó phù hợp với môi trường sản xuất.

                    Cấu hình và tối ưu hóa nâng cao

                    Khi triển khai Qwen2.5-Coder trong môi trường sản xuất, một số chiến lược tối ưu hóa có thể cải thiện đáng kể hiệu suất. Sau đây là ví dụ cấu hình chi tiết sử dụng các tính năng nâng cao của Ollama:# qwen25-config.yaml
                    models:
                    qwen2.5-coder:
                    type: llama
                    parameters:
                    context_length: 32768
                    num_gpu: 1
                    num_thread: 8
                    batch_size: 32
                    quantization:
                    mode: ‘int8’
                    cache:
                    type: ‘redis’
                    capacity: ’10gb’
                    runtime:
                    compute_type: ‘float16’
                    tensor_parallel: true

                    Cấu hình này cho phép thực hiện một số tối ưu hóa quan trọng:

                    • Song song hóa tenxơ tự động cho hệ thống đa GPU
                    • Lượng tử hóa Int8 để giảm thiểu dấu chân bộ nhớ
                    • Bộ nhớ đệm phản hồi dựa trên Redis
                    • Float16 tính toán để cải thiện hiệu suất
                    • Tối ưu hóa cài đặt kích thước luồng và lô

                    Tích hợp với quy trình phát triển: Qwen2.5-Coder có thể được tích hợp liền mạch vào quy trình phát triển hiện có thông qua nhiều tiện ích mở rộng IDE và công cụ dòng lệnh.

                    Giám sát và tối ưu hóa hiệu suất

                    Để đảm bảo hiệu suất tối ưu trong môi trường sản xuất, việc triển khai giám sát phù hợp là rất quan trọng. Sau đây là ví dụ về thiết lập giám sát:import time
                    import psutil
                    import logging
                    from dataclasses import dataclass
                    from typing import Optional

                    @dataclass
                    class PerformanceMetrics:
                    inference_time: float
                    memory_usage: float
                    token_count: int
                    success: bool
                    error: Optional[str] = None

                    class Qwen25CoderMonitored(Qwen25Coder):
                    def __init__(self, *args, **kwargs):
                    super().__init__(*args, **kwargs)
                    self.logger = logging.getLogger(“qwen2.5-coder”)

                    def generate_code_with_metrics(self, prompt: str) -> tuple[str, PerformanceMetrics]:
                    start_time = time.time()
                    initial_memory = psutil.Process().memory_info().rss / 1024 / 1024

                    try:
                    response = self.generate_code(prompt)
                    success = True
                    error = None
                    except Exception as e:
                    response = “”
                    success = False
                    error = str(e)

                    end_time = time.time()
                    final_memory = psutil.Process().memory_info().rss / 1024 / 1024

                    metrics = PerformanceMetrics(
                    inference_time=end_time – start_time,
                    memory_usage=final_memory – initial_memory,
                    token_count=len(response.split()),
                    success=success,
                    error=error
                    )

                    self.logger.info(f“Performance metrics: {metrics}”)
                    return response, metrics

                    Việc triển khai giám sát này cung cấp thông tin chi tiết về các đặc điểm hiệu suất của mô hình, bao gồm thời gian suy luận, mức sử dụng bộ nhớ và tỷ lệ thành công. Các số liệu có thể được sử dụng để tối ưu hóa tài nguyên hệ thống và xác định các điểm nghẽn tiềm ẩn.

                    Hệ sinh thái Qwen2.5-Coder tiếp tục phát triển với những cải tiến được lên kế hoạch trong một số lĩnh vực chính. Mô hình tham số 32B sắp tới hứa hẹn khả năng nâng cao trong khi vẫn duy trì các yêu cầu về tài nguyên thực tế. Cộng đồng phát triển đang tích cực làm việc trên các phương pháp tinh chỉnh chuyên biệt cho các ngôn ngữ lập trình và khuôn khổ cụ thể.

                    Kiến trúc của mô hình được thiết kế để đáp ứng những cải tiến trong tương lai về xử lý độ dài ngữ cảnh và hiệu quả bộ nhớ. Nghiên cứu đang diễn ra về các cơ chế chú ý hiệu quả hơn và các kỹ thuật tối ưu hóa tham số cho thấy các phiên bản trong tương lai có thể đạt hiệu suất thậm chí còn tốt hơn với yêu cầu tài nguyên thấp hơn.

                    Thông qua bộ tính năng toàn diện và các đặc điểm hiệu suất mạnh mẽ, Qwen2.5-Coder đại diện cho một bước tiến đáng kể trong các mô hình ngôn ngữ tập trung vào mã. Cho dù được triển khai cho các tác vụ phát triển riêng lẻ hay được tích hợp vào các hệ thống quy mô doanh nghiệp, mô hình này cung cấp các khả năng mạnh mẽ để tạo, phân tích và tối ưu hóa mã. Sự kết hợp với Ollama làm cho nó đặc biệt dễ tiếp cận để triển khai cục bộ trong khi vẫn duy trì hiệu suất cấp độ chuyên nghiệp.

                    https://sebastian-petrus.medium.com/how-to-run-qwen2-5-coder-locally-a-comprehensive-guide-a3bc0284714a

                    Ví dụ: xây dựng huấn luyện viên thể hình

                    Trong thời đại công nghệ thông tin này, tại sao phải trả tiền cho một huấn luyện viên thể hình khi bạn có thể tự xây dựng huấn luyện viên AI của riêng mình? Hãy tưởng tượng bạn có một kế hoạch tập luyện tùy chỉnh được thiết kế riêng cho mục tiêu, tình trạng sức khỏe và lối sống của bạn. Sử dụng sức mạnh của AI, chúng tôi có thể tạo ra một thói quen tập thể dục được cá nhân hóa, phù hợp với tiến trình của bạn và giúp bạn luôn có động lực!

                    Xây dựng một huấn luyện viên thể hình AI có khả năng:

                    • Thu thập dữ liệu người dùng như tuổi, cân nặng và mục tiêu thể dục.
                    • Tạo thói quen tập thể dục được cá nhân hóa.
                    • Thu thập phản hồi của người dùng sau mỗi phiên và cập nhật kế hoạch cho phù hợp.
                    • Theo dõi tiến trình của bạn theo thời gian.
                    • Động viên bạn bằng sự khích lệ và lời khuyên.

                    LangGraph giống như bộ não đằng sau nhiều tác nhân AI làm việc cùng nhau để hoàn thành công việc. LangGraph được thiết kế để tạo ra các quy trình làm việc có trạng thái cho các tác nhân. Điều đó có nghĩa là, thay vì thực hiện mọi thứ theo cách tuyến tính, như thực thi mã đơn giản, nó xử lý từng bước của ứng dụng của bạn như một trạng thái trong biểu đồ . Các trạng thái này giao tiếp với nhau theo một luồng logic, giống như một loạt các phòng được kết nối trong một tòa nhà.

                    Mỗi “phòng” hoặc trạng thái này có thể thực hiện một chức năng chuyên biệt và LangGraph đảm bảo chúng hợp tác nhịp nhàng. Nếu bạn nghĩ về điều đó, việc tạo thói quen tập thể dục không chỉ là liệt kê các bài tập. Mà là về:

                    Hiểu được mục tiêu và hạn chế cá nhân của bạn.
                    Thiết kế kế hoạch tập luyện dựa trên loại cơ thể, sở thích và mục tiêu thể dục của bạn.
                    Điều chỉnh kế hoạch đó khi bạn đưa ra phản hồi hoặc tiến triển theo thời gian.
                    Thúc đẩy bạn bằng cách theo dõi tiến độ thực hiện của bạn.
                    Mỗi trạng thái này là một trạng thái riêng biệt và LangGraph cho phép tôi xử lý chúng một cách độc lập trong khi vẫn duy trì được bức tranh toàn cảnh.

                    Bước 1: Thiết lập Huấn luyện viên thể hình AI
                    AI Fitness Coach sẽ hoạt động như một loạt các tác nhân, mỗi tác nhân chịu trách nhiệm cho một nhiệm vụ khác nhau, chẳng hạn như thu thập thông tin đầu vào của người dùng, tạo thói quen tập thể dục, phân tích phản hồi và theo dõi tiến trình. Các tác nhân này hợp tác để tạo ra một huấn luyện viên thể dục tương tác và thích ứng.

                    from typing import Annotated, TypedDict, List
                    from langgraph.graph import StateGraph, END
                    from langchain_community.chat_models import ChatOllama
                    from langchain_core.prompts import ChatPromptTemplate
                    from langchain_core.output_parsers import StrOutputParser
                    from langgraph.graph.message import add_messages
                    from langchain_core.messages import HumanMessage, AIMessage
                    import json

                    # State definition
                    class State(TypedDict):
                    user_data: dict
                    fitness_plan: str
                    feedback: str
                    progress: List[str] messages: Annotated[list, add_messages]

                    # Utility function to get Ollama LLM
                    def get_ollama_llm(model_name=“tinyllama”):
                    return ChatOllama(model=model_name)

                    Ở đây, chúng tôi định nghĩa lớp State lưu trữ dữ liệu người dùng, kế hoạch thể dục, phản hồi và tiến trình. Chúng tôi cũng tạo một hàm tiện ích để lấy mô hình Ollama để tạo văn bản.

                    Bước 2: Tác nhân nhập liệu của người dùng
                    Bước đầu tiên là thu thập dữ liệu người dùng, chẳng hạn như tuổi, cân nặng và mục tiêu thể dục, để tạo hồ sơ người dùng. Hồ sơ này được cấu trúc dưới dạng JSON để dễ xử lý.

                    def user_input_agent(state: State, llm):
                    prompt = ChatPromptTemplate.from_template(
                    “””You are an AI fitness coach assistant. Process the following user information:

                    {user_input}

                    Create a structured user profile based on this information. Include all relevant details for creating a personalized fitness plan.
                    Return the profile as a valid JSON string.”””
                    )
                    chain = prompt | llm | StrOutputParser()
                    user_profile = chain.invoke({“user_input”: json.dumps(state[“user_data”])})

                    try:
                    state[“user_data”] = json.loads(user_profile)
                    except json.JSONDecodeError:
                    pass
                    return state

                    Tác nhân này xử lý thông tin đầu vào của người dùng (như tuổi, cân nặng và sở thích tập luyện) và tạo ra hồ sơ có cấu trúc mà huấn luyện viên thể hình sẽ sử dụng để xây dựng kế hoạch tập luyện.

                    Bước 3: Tác nhân tạo ra thói quen
                    Sau khi có hồ sơ người dùng, đã đến lúc tạo một kế hoạch thể dục được cá nhân hóa. Tác nhân này sẽ tạo ra một kế hoạch bao gồm các loại bài tập, thời lượng, cường độ và thậm chí cả ngày nghỉ.

                    def routine_generation_agent(state: State, llm):
                    prompt = ChatPromptTemplate.from_template(
                    “””You are an AI fitness coach. Create a personalized fitness routine based on the following user data:

                    {user_data}

                    Create a detailed weekly fitness plan that includes:
                    1. Types of exercises
                    2. Duration and frequency of workouts
                    3. Intensity levels
                    4. Rest days
                    5. Any dietary recommendations”””
                    )
                    chain = prompt | llm | StrOutputParser()
                    plan = chain.invoke({“user_data”: json.dumps(state[“user_data”])})
                    state[“fitness_plan”] = plan
                    return state

                    Tác nhân này cung cấp một kế hoạch tập thể dục hàng tuần có cấu trúc phù hợp với hồ sơ của người dùng. Chương trình tập luyện sẽ bao gồm tim mạch, rèn luyện sức mạnh hoặc bất kỳ sở thích nào mà người dùng lựa chọn.

                    Bước 4: Phản hồi và điều chỉnh
                    Sau mỗi buổi tập, người dùng có thể đưa ra phản hồi. Dựa trên phản hồi này, huấn luyện viên AI có thể điều chỉnh thói quen tập luyện để phù hợp hơn với nhu cầu của người dùng.

                    def feedback_collection_agent(state: State, llm):
                    prompt = ChatPromptTemplate.from_template(
                    “””Analyze the following user feedback on their recent workout session:

                    Current fitness plan: {current_plan}
                    User feedback: {user_feedback}

                    Suggest any immediate adjustments.”””
                    )
                    chain = prompt | llm | StrOutputParser()
                    feedback_summary = chain.invoke({“current_plan”: state[“fitness_plan”], “user_feedback”: state[“feedback”]})
                    return state

                    Tác nhân này thu thập phản hồi, phân tích và đề xuất thay đổi thói quen tập thể dục hiện tại nếu cần thiết.

                    Bước 5: Tác nhân thúc đẩy
                    Cuối cùng, một huấn luyện viên không có động lực thì sẽ thế nào? Người thúc đẩy động lực sẽ gửi những thông điệp khích lệ để giúp người dùng đi đúng hướng.

                    def motivational_agent(state: State, llm):
                    prompt = ChatPromptTemplate.from_template(
                    “””Provide encouragement, tips, or reminders to the user:

                    User Data: {user_data}
                    Current Plan: {current_plan}
                    Recent Progress: {recent_progress}”””
                    )
                    chain = prompt | llm | StrOutputParser()
                    motivation = chain.invoke(
                    {“user_data”: str(state[“user_data”]), “current_plan”: state[“fitness_plan”], “recent_progress”: state[“progress”][-1] if state[“progress”] else “”}
                    )
                    return state

                    Tác nhân này gửi tin nhắn động viên, đưa ra lời khuyên hữu ích và nhắc nhở người dùng về tiến trình của họ để họ luôn có động lực.

                    Bước 6: Xây dựng giao diện người dùng với Gradio
                    Để giúp huấn luyện viên thể hình AI này dễ tiếp cận hơn, chúng tôi sử dụng Gradio để xây dựng giao diện web trực quan nơi người dùng có thể nhập dữ liệu, lập kế hoạch và đưa ra phản hồi.

                    import gradio as gr

                    # Gradio UI
                    with gr.Blocks() as demo:
                    gr.Markdown(“# AI Fitness Coach”)

                    # Tab for creating the initial fitness plan
                    with gr.Tab(“Create Fitness Plan”):
                    age = gr.Number(label=“Age”)
                    weight = gr.Number(label=“Weight (kg)”)
                    height = gr.Number(label=“Height (cm)”)
                    gender = gr.Radio([“Male”, “Female”, “Other”], label=“Gender”)
                    primary_goal = gr.Dropdown([“Weight loss”, “Muscle gain”, “Endurance improvement”, “General fitness”], label=“Primary Goal”)
                    target_timeframe = gr.Dropdown([“3 months”, “6 months”, “1 year”], label=“Target Timeframe”)

                    workout_preferences = gr.CheckboxGroup([“Cardio”, “Strength training”, “Yoga”, “HIIT”], label=“Workout Preferences”)
                    workout_duration = gr.Slider(15, 120, step=15, label=“Workout Duration (minutes)”)
                    workout_days = gr.CheckboxGroup([“Monday”, “Wednesday”, “Friday”], label=“Workout Days”)
                    activity_level = gr.Radio([“Sedentary”, “Lightly active”, “Moderately active”, “Highly active”], label=“Activity Level”)

                    health_conditions = gr.Textbox(label=“Health Conditions”)
                    dietary_preferences = gr.Textbox(label=“Dietary Preferences (Optional)”)

                    create_button = gr.Button(“Create Fitness Plan”)
                    plan_output = gr.Textbox(label=“Your Fitness Plan”)

                    create_button.click(
                    process_user_input,
                    inputs=[age, weight, height, gender, primary_goal, target_timeframe, workout_preferences,
                    workout_duration, workout_days, activity_level, health_conditions, dietary_preferences],
                    outputs=plan_output
                    )

                    # Tab for updating the fitness plan based on feedback
                    with gr.Tab(“Update Fitness Plan”):
                    feedback = gr.Textbox(label=“Feedback”)
                    update_button = gr.Button(“Update Fitness Plan”)
                    updated_plan_output = gr.Textbox(label=“Updated Fitness Plan”)

                    update_button.click(update_plan, inputs=[feedback], outputs=updated_plan_output)

                    # Launch Gradio demo
                    demo.launch()

                    Giao diện người dùng Gradio cho phép người dùng dễ dàng tương tác với huấn luyện viên AI và quản lý hành trình rèn luyện thể chất của mình.

                    Phần kết luận
                    Chỉ với một vài dòng mã và các công cụ phù hợp, bạn có thể xây dựng huấn luyện viên thể dục hỗ trợ AI của riêng mình. Bằng cách tích hợp các mô hình ngôn ngữ như Ollama với giao diện tương tác bằng Gradio , bạn có thể cá nhân hóa các kế hoạch thể dục và cung cấp phản hồi theo thời gian thực. Cho dù bạn đang muốn giảm cân, tăng cơ hay cải thiện sức bền, huấn luyện viên thể dục AI này sẽ giúp bạn luôn có động lực và đi đúng hướng.

                    https://pub.towardsai.net/how-to-build-your-own-ai-fitness-coach-using-open-source-llms-and-gradio-3151e429692f