全部产品
Search
文档中心

ApsaraDB RDS:Membangun Chatbot Khusus Berbasis LLM di ApsaraDB RDS for PostgreSQL

更新时间:Jul 02, 2025

Dengan kemajuan ChatGPT, model bahasa besar (LLM) dan AI generatif telah menjadi elemen penting di berbagai bidang seperti penulisan, pembuatan gambar, optimasi kode, dan pengambilan informasi. LLM memberikan manfaat signifikan bagi pengguna individu maupun perusahaan, mempercepat inovasi ekosistem, serta mendukung pengembangan aplikasi super. Topik ini menjelaskan cara membangun chatbot khusus di ApsaraDB RDS for PostgreSQL.

Informasi latar belakang

Semakin banyak perusahaan dan pengguna individu ingin memanfaatkan LLM dan AI generatif untuk mengembangkan aplikasi berbasis AI yang disesuaikan dengan skenario bisnis tertentu. Meskipun LLM menunjukkan performa luar biasa dalam menyelesaikan masalah umum, mereka memiliki keterbatasan dalam hal ketepatan waktu dan pengetahuan profesional karena batasan pelatihan korpus dan kompleksitas model besar. Di era informasi saat ini, perusahaan sering memperbarui basis pengetahuan mereka. Basis pengetahuan vertikal industri, termasuk dokumen, gambar, file audio, dan video, mungkin bersifat rahasia atau tidak dapat diungkapkan kepada publik. Jika sebuah perusahaan ingin menggunakan LLM untuk membangun aplikasi berbasis AI untuk vertikal industri, perusahaan tersebut harus terus mengimpor basis pengetahuannya ke dalam LLM untuk pelatihan.

Berikut adalah pendekatan pelatihan umum:

  • Fine-tuning: Dataset baru digunakan untuk menyesuaikan bobot model yang ada, dan dataset tersebut diperbarui secara berkala untuk mencapai hasil yang diinginkan. Pendekatan ini cocok untuk melatih model berdasarkan dataset kecil atau model spesifik tugas. Namun, pendekatan ini mahal dan memerlukan pelatihan intensif.

  • Prompt-tuning: Alih-alih menyesuaikan bobot model, prompt disesuaikan untuk mendapatkan efek yang diinginkan. Prompt-tuning menghasilkan biaya komputasi lebih rendah, memerlukan lebih sedikit sumber daya dan waktu pelatihan, serta lebih fleksibel dibandingkan fine-tuning.

Berikut adalah keuntungan membangun chatbot di ApsaraDB RDS for PostgreSQL:

  • ApsaraDB RDS for PostgreSQL menyediakan ekstensi pgvector yang dapat digunakan untuk menerjemahkan data real-time atau keahlian vertikal industri menjadi penyematan vektor. ApsaraDB RDS for PostgreSQL menyimpan penyematan ini untuk mempercepat pencarian berbasis vektor dan meningkatkan akurasi Q&A pada domain privat tertentu.

  • ApsaraDB RDS for PostgreSQL adalah sistem OLTP open source canggih yang dapat mengeksekusi transaksi database online dan tugas penyimpanan data secara bersamaan. Misalnya, ApsaraDB RDS for PostgreSQL dapat memproses interaksi, catatan historis, dan durasi obrolan transaksi. Sebagai sistem database populer dengan berbagai fitur, ApsaraDB RDS for PostgreSQL memudahkan pembangunan layanan domain privat dan membuat arsitektur mudah digunakan.

  • Ekstensi pgvector telah banyak digunakan di komunitas pengembang dan database PostgreSQL open source. Selain itu, alat seperti ChatGPT Retrieval Plugin didukung oleh database PostgreSQL sejak awal. ApsaraDB RDS for PostgreSQL telah banyak digunakan dan sepenuhnya didukung untuk melakukan pencarian berbasis vektor, serta menyediakan alat dan sumber daya yang melimpah.

Topik ini memberikan contoh cara membangun chatbot khusus menggunakan ekstensi pgvector dan penyematan OpenAI. Ekstensi pgvector disediakan oleh ApsaraDB RDS for PostgreSQL untuk melakukan pencarian kesamaan vektor. Untuk informasi lebih lanjut tentang ekstensi, lihat Gunakan Ekstensi pgvector.

Prasyarat

  • Sebuah instance ApsaraDB RDS for PostgreSQL yang memenuhi persyaratan berikut telah dibuat:

    • Instance RDS menjalankan PostgreSQL 14 atau yang lebih baru.

    • Versi mesin minor dari instance RDS adalah 20230430 atau yang lebih baru.

    Catatan

    Untuk informasi lebih lanjut tentang cara meningkatkan versi mesin utama atau memperbarui versi mesin minor dari instance RDS, lihat Tingkatkan Versi Mesin Utama atau Perbarui Versi Mesin Minor.

  • Anda sudah familiar dengan penggunaan dan istilah dasar ekstensi pgvector. Untuk informasi lebih lanjut, lihat Gunakan Ekstensi pgvector.

  • Sebuah Secret API key telah diperoleh, dan OpenAI tersedia di lingkungan jaringan Anda. Contoh kode yang digunakan dalam topik ini diterapkan pada instance Elastic Compute Service (ECS) di wilayah Singapura.

  • Lingkungan pengembangan Python telah diterapkan. Dalam topik ini, Python 3.11.4 dan PyCharm 2023.1.2 digunakan.

Istilah

penyematan

Penyematan adalah metode yang menerjemahkan data berdimensi tinggi ke dalam ruang berdimensi rendah. Dalam pembelajaran mesin dan pemrosesan bahasa alami (NLP), penyematan merupakan metode umum untuk merepresentasikan simbol atau objek jarang sebagai vektor kontinu.

Dalam NLP, penyematan kata adalah metode yang digunakan untuk merepresentasikan kata dalam bentuk vektor bernilai riil. Hal ini memungkinkan komputer untuk lebih memahami teks. Penyematan kata digunakan untuk menerjemahkan semantik dan hubungan tata bahasa kata ke dalam ruang vektor.

OpenAI mendukung penyematan.

Prinsip Implementasi

Berikut adalah fase-fase untuk membangun chatbot khusus:

Fase 1: Persiapan Data

  1. Ekstrak teks dari basis pengetahuan domain spesifik dan pecah teks menjadi chunk. Misalnya, Anda dapat memecah potongan teks besar menjadi paragraf atau kalimat, serta mengekstrak kata kunci atau entitas. Hal ini memudahkan pengaturan dan pengelolaan data dalam basis pengetahuan.

  2. Panggil operasi LLM seperti operasi yang disediakan oleh OpenAI untuk mengimpor chunk teks ke model dan menghasilkan penyematan teks. Penyematan menangkap informasi semantik dan kontekstual teks untuk pencarian dan pencocokan selanjutnya.

  3. Simpan penyematan teks yang dihasilkan, chunk teks, dan metadata teks ke instance RDS Anda.

Fase 2: Q&A

  1. Ajukan pertanyaan.

  2. Panggil operasi penyematan yang disediakan oleh OpenAI untuk membuat penyematan untuk pertanyaan.

  3. Gunakan ekstensi pgvector untuk mencari chunk teks yang memiliki kesamaan lebih besar dari ambang batas tertentu di instance RDS dan dapatkan hasilnya.

Gambar berikut menunjukkan prosesnya.

image..png

Prosedur

Fase 1: Persiapan Data

Dalam contoh ini, data teks di Buat Instance ApsaraDB RDS for PostgreSQL dipecah dan disimpan di instance RDS Anda. Anda harus menyiapkan basis pengetahuan domain spesifik.

Dalam fase ini, hal terpenting adalah menerjemahkan basis pengetahuan domain spesifik menjadi penyematan teks dan menyimpan serta mencocokkan penyematan tersebut secara efisien. Dengan cara ini, Anda bisa mendapatkan jawaban dan saran berkualitas tinggi yang sesuai dengan domain dengan memanfaatkan kemampuan pemahaman semantik yang kuat dari LLM. Beberapa kerangka kerja open source yang ada memungkinkan Anda mengunggah dan mengurai file basis pengetahuan dalam format seperti URL, Markdown, PDF, dan Word, dengan cara yang nyaman. Misalnya, kerangka kerja LangChain dan ChatGPT Retrieval Plugin open source dari OpenAI didukung. LangChain dan ChatGPT Retrieval Plugin dapat menggunakan database PostgreSQL yang mendukung ekstensi pgvector sebagai backend database vektor. Hal ini memudahkan integrasi antara LangChain dan ChatGPT Retrieval Plugin dengan instance RDS. Setelah integrasi, Anda dapat menyiapkan basis pengetahuan domain spesifik secara efisien dan memanfaatkan indeks vektor dan pencarian kesamaan yang disediakan oleh ekstensi pgvector untuk menerapkan pencocokan teks dan query yang efisien.

  1. Hubungkan ke Instance RDS.

  2. Buat database uji. Contoh: rds_pgvector_test.

    CREATE DATABASE rds_pgvector_test;
  3. Pergi ke database uji dan buat ekstensi pgvector.

    CREATE EXTENSION IF NOT EXISTS vector;
  4. Buat tabel uji untuk menyimpan data basis pengetahuan. Contoh: rds_pg_help_docs.

    CREATE TABLE rds_pg_help_docs (
      id bigserial PRIMARY KEY, 
      title text,			-- Judul
      description text, 		-- Deskripsi
      doc_chunk text, 		-- Chunk teks
      token_size int, 		-- Jumlah kata dalam chunk teks
      embedding vector(1536));	-- Penyematan teks
  5. Buat indeks untuk kolom penyematan untuk mengoptimalkan dan mempercepat query.

    CREATE INDEX ON rds_pg_help_docs USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
    Catatan

    Untuk informasi lebih lanjut tentang cara membuat indeks untuk vektor, lihat Gunakan Ekstensi pgvector.

  6. Buat proyek di PyCharm, buka terminal, dan masukkan pernyataan berikut untuk menginstal dependensi berikut:

    pip install openai psycopg2 tiktoken requests beautifulsoup4 numpy
  7. Buat file .py untuk memecah data dalam basis pengetahuan dan menyimpan data yang dipecah dalam instance RDS. Dalam contoh ini, file knowledge_chunk_storage.py dibuat. Contoh kode:

    Catatan

    Dalam contoh kode berikut, metode pemecahan kustom hanya membagi data dalam basis pengetahuan menjadi chunk dengan jumlah karakter tetap. Anda dapat menggunakan metode pemecahan yang disediakan oleh LangChain dan ChatGPT Retrieval Plugin open source dari OpenAI. Kualitas data dalam basis pengetahuan dan hasil pemecahan memiliki dampak besar pada hasil akhir.

    import openai
    import psycopg2
    import tiktoken
    import requests
    from bs4 import BeautifulSoup
    
    EMBEDDING_MODEL = "text-embedding-ada-002"
    tokenizer = tiktoken.get_encoding("cl100k_base")
    
    # Hubungkan ke instance RDS.
    conn=psycopg2.connect (database="<Nama Database>",
                            host="<Endpoint instance RDS>",
                            user="<Username>",
                            password="<Password>",
                            port="<Nomor port database>")
    conn.autocommit = True
    
    # Kunci API OpenAI
    openai.api_key = '<Secret API Key>'
    
    # Metode pemecahan kustom (Metode berikut adalah contoh.)
      def get_text_chunks(text, max_chunk_size):
        chunks_ = []
        soup_ = BeautifulSoup(text, 'html.parser')
    
        content = ''.join(soup_.strings).strip()
    
        length = len(content)
        start = 0
        while start < length:
            end = start + max_chunk_size
            if end >= length:
                end = length
    
            chunk_ = content[start:end]
            chunks_.append(chunk_)
    
            start = end
    
        return chunks_
    
    
    # Tentukan halaman web yang akan dipecah.
    url = 'https://www.alibabacloud.com/help/document_detail/148038.html'
    
    response = requests.get(url)
    if response.status_code == 200:
        # Dapatkan data di halaman web.
        web_html_data = response.text
        soup = BeautifulSoup(web_html_data, 'html.parser')
        # Dapatkan judul dengan tag H1.
        title = soup.find('h1').text.strip()
    
        # Dapatkan deskripsi (Deskripsi diapit oleh tag p dan milik kelas shortdesc.)
        description = soup.find('p', class_='shortdesc').text.strip()
    
        # Pecah dan simpan data.
        chunks = get_text_chunks(web_html_data, 500)
        for chunk in chunks:
            doc_item = {
                'title': title,
                'description': description,
                'doc_chunk': chunk,
                'token_size': len(tokenizer.encode(chunk))
            }
    
            query_embedding_response = openai.Embedding.create(
                model=EMBEDDING_MODEL,
                input=chunk,
            )
    
            doc_item['embedding'] = query_embedding_response['data'][0]['embedding']
    
            cur = conn.cursor()
            insert_query = '''
            INSERT INTO rds_pg_help_docs 
                (title, description, doc_chunk, token_size, embedding) VALUES (%s, %s, %s, %s, %s);
            '''
    
            cur.execute(insert_query, (
                doc_item['title'], doc_item['description'], doc_item['doc_chunk'], doc_item['token_size'],
                doc_item['embedding']))
    
            conn.commit()
    
    else:
        print('Gagal mengambil halaman web')
  8. Jalankan program Python.

  9. Masuk ke database dan jalankan pernyataan berikut untuk memeriksa apakah data dalam basis pengetahuan dipecah dan disimpan sebagai vektor:

    SELECT * FROM rds_pg_help_docs;

    image..png

Fase 2: Q&A

  1. Dalam proyek Python, buat file .py, definisikan pertanyaan dalam file, dan bandingkan kesamaan antara pertanyaan dan data dalam basis pengetahuan instance RDS. Dalam contoh ini, file chatbot.py dibuat. Contoh kode:

    import openai
    import psycopg2
    from psycopg2.extras import DictCursor
    
    GPT_MODEL = "gpt-3.5-turbo"
    EMBEDDING_MODEL = "text-embedding-ada-002"
    GPT_COMPLETIONS_MODEL = "text-davinci-003"
    MAX_TOKENS = 1024
    
    # Kunci API OpenAI
    openai.api_key = '<Secret API Key>'
    
    prompt ='Buat instance RDS.'
    
    prompt_response = openai.Embedding.create(
        model=EMBEDDING_MODEL,
        input=prompt,
    )
    prompt_embedding = prompt_response['data'][0]['embedding']
    
    # Hubungkan ke instance RDS.
    conn=psycopg2.connect (database="<Nama Database>",
                            host="<Endpoint instance RDS>",
                            user="<Username>",
                            password="<Password>",
                            port="<Nomor port database>")
    conn.autocommit = True
    
    
    def answer(prompt_doc, prompt):
        improved_prompt = f"""
        Jawab pertanyaan berikut berdasarkan file dan langkah-langkah berikut:
        a. Periksa apakah konten dalam file terkait dengan pertanyaan.
        b. Referensikan konten dalam file untuk menjawab pertanyaan dan berikan jawaban rinci sebagai file Markdown.
        c. Gunakan "Saya tidak tahu karena pertanyaan melebihi ruang lingkup saya" untuk menjawab pertanyaan yang tidak relevan dengan ApsaraDB RDS for PostgreSQL.
    
        File:
        \"\"\"
        {prompt_doc}
        \"\"\"
    
        Pertanyaan: {prompt}
        """
    
        response = openai.Completion.create(
            model=GPT_COMPLETIONS_MODEL,
            prompt=improved_prompt,
            temperature=0.2,
            max_tokens=MAX_TOKENS
        )
    
        print(f"{response['choices'][0]['text']}\n")
    
    
    similarity_threshold = 0.78
    max_matched_doc_counts = 8
    
    # Gunakan ekstensi pgvector untuk mencari chunk file yang memiliki kesamaan lebih besar dari ambang batas tertentu.
    similarity_search_sql = f'''
    SELECT doc_chunk, token_size, 1 - (embedding <=> '{prompt_embedding}') AS similarity 
    FROM rds_pg_help_docs WHERE 1 - (embedding <=> '{prompt_embedding}') > {similarity_threshold} ORDER BY id LIMIT {max_matched_doc_counts};
    '''
    
    cur = conn.cursor(cursor_factory=DictCursor)
    cur.execute(similarity_search_sql)
    matched_docs = cur.fetchall()
    
    total_tokens = 0
    prompt_doc = ''
    print('Jawaban: \n')
    for matched_doc in matched_docs:
        if total_tokens + matched_doc['token_size'] <= 1000:
            prompt_doc += f"\n---\n{matched_doc['doc_chunk']}"
            total_tokens += matched_doc['token_size']
            continue
    
        answer(prompt_doc,prompt)
    
        total_tokens = 0
        prompt_doc = ''
    
    answer(prompt_doc,prompt)
  2. Lihat jawaban setelah Anda menjalankan program Python. Gambar berikut memberikan contoh jawaban.

    Catatan

    Untuk mendapatkan jawaban yang lebih akurat dan lengkap, Anda dapat mengoptimalkan metode pemecahan dan prompt pertanyaan.

    image..png

Kesimpulan

Jika basis pengetahuan khusus tidak terhubung, jawaban OpenAI untuk pertanyaan "Bagaimana cara membuat instance ApsaraDB RDS for PostgreSQL?" tidak relevan dengan Alibaba Cloud. Contoh:

image..png

Setelah basis pengetahuan khusus yang disimpan di instance RDS Anda terhubung, jawaban untuk pertanyaan "Bagaimana cara membuat instance ApsaraDB RDS for PostgreSQL?" sangat relevan dengan instance ApsaraDB RDS for PostgreSQL.

Secara keseluruhan, ApsaraDB RDS for PostgreSQL sepenuhnya mampu membangun basis pengetahuan berbasis LLM untuk vertikal industri.