Tüm Ürünler
Search
Belge Merkezi

ApsaraDB RDS:Build an LLM-driven dedicated chatbot using RDS for PostgreSQL

Son Güncelleme:Oct 03, 2026

ChatGPT'nin ortaya çıkışı, büyük dil modellerinin (LLM) ve üretken yapay zekanın birçok alandaki potansiyelini göstermiştir. Bu alanlar arasında içerik yazma, görüntü oluşturma, kod optimizasyonu ve bilgi arama yer alır. LLM'ler bireyler ve işletmeler için güçlü araçlar haline gelerek süper uygulamalara dönüşmüş ve yeni ekosistemler yaratmıştır. Bu konuda ApsaraDB RDS for PostgreSQL kullanarak özel bir sohbet robotunun nasıl oluşturulacağı açıklanmaktadır.

Arka Plan

Daha fazla işletme ve birey, belirli alanlarına yönelik yapay zeka destekli ürünler oluşturmak için LLM'leri ve üretken yapay zekayı kullanmak istemektedir. LLM'ler genel sorunlarda iyi performans gösterir ancak uzmanlaşmış bilgi ve gerçek zamanlı bilgilerle ilgilenirken sınırlamaları vardır. Bu durum eğitim verileri ve yanıt oluşturma biçimlerinden kaynaklanır. Bilgi çağında işletmeler bilgi tabanlarını sık sık günceller. Belgeler, görüntüler ve ses/video dosyalarını içeren bu dikey alan bilgi tabanları özel veya gizli olabilir. Bir LLM üzerinde alana özgü bir yapay zeka ürünü oluşturmak için işletmenin modeli kendi bilgi tabanı ile sürekli olarak eğitmesi gerekir.

İki yaygın yöntem mevcuttur:

  • İnce ayar: Mevcut bir modelin ağırlıklarını ince ayarlamak için yeni veri kümeleri sağlayın. İstenilen sonucu elde etmek için girdiyi sürekli olarak güncelleyebilir ve çıktıyı ayarlayabilirsiniz. Bu yöntem küçük veri kümeleri veya belirli görev türleri ya da stiller üzerinde eğitim yapmak için uygundur. Ancak eğitim maliyeti yüksektir.

  • İstem ayarlama: Çıktıyı ayarlamak için model ağırlıklarını değiştirmek yerine girdi istemlerini ayarlayın. İnce ayara kıyasla istem ayarlama daha düşük hesaplama maliyetine sahiptir, daha az kaynak ve daha az eğitim süresi gerektirir ve daha esnektir.

ApsaraDB RDS for PostgreSQL üzerinde bir sohbet robotu oluşturmanın avantajları şunlardır:

  • ApsaraDB RDS for PostgreSQL bir pgvector eklentisine sahiptir. Gerçek zamanlı içeriği veya alana özgü bilgiyi vektör gömülmesine dönüştürmek için bu eklentiyi kullanabilirsiniz. Bu gömmelerin ApsaraDB RDS for PostgreSQL içinde depolanması vektör aramalarını hızlandırır. Bu durum özel verileriniz için soru-cevap doğruluğunu artırır.

  • Gelişmiş bir açık kaynaklı işlemesel işleme (TP) motoru olarak ApsaraDB RDS for PostgreSQL çevrimiçi kullanıcı etkileşimlerini ve veri depolama görevlerini aynı anda yönetir. Örneğin konuşma geçmişini, etkileşim kayıtlarını ve sohbet zaman damgalarını yönetebilir. ApsaraDB RDS for PostgreSQL'in çok yönlülüğü özel iş hizmetleri oluşturma sürecini basitleştirir ve mimariyi hafifletir.

  • pgvector eklentisi geliştirici topluluğunda ve açık kaynak PostgreSQL veritabanlarında yaygın olarak kullanılmaktadır. ChatGPT Retrieval Plugin gibi araçlar da PostgreSQL desteğini hızla eklemiştir. Bu durum ApsaraDB RDS for PostgreSQL'in güçlü bir ekosistem desteğine ve vektör alma için geniş bir uygulama tabanına sahip olduğunu gösterir ve kullanıcılara birçok araç ve kaynak sunar.

Bu konu size özel bir sohbet robotunun nasıl oluşturulacağını göstermek için ApsaraDB RDS for PostgreSQL için açık kaynaklı vektör dizini eklentisi olan pgvector ve OpenAI'nin gömme yeteneklerini kullanır.

Önkoşullar

  • Aşağıdaki koşulları karşılayan bir RDS PostgreSQL örneği oluşturulmuştur:

    • Örnek PostgreSQL 14 veya sonraki bir sürümü çalıştırır.

    • Örneğin küçük motor sürümü 20230430 veya sonraki bir sürümdür.

  • Bu konudaki özel sohbet robotu ApsaraDB RDS for PostgreSQL için açık kaynaklı pgvector eklentisine dayanır. Kullanımını ve temel kavramlarını tamamen anladığınızdan emin olun. Daha fazla bilgi için bkz. pgvector kullanıcı kılavuzu.

  • Bu konudaki özel sohbet robotu OpenAI yeteneklerini kullanır. Bir Secret API Key sahibi olduğunuzdan ve ağ ortamınızın OpenAI'ye erişebildiğinden emin olun. Bu konudaki kod örnekleri Singapur bölgesindeki bir ECS örneğine dağıtılır.

  • Bu konudaki örnek kod Python kullanır. Bir Python geliştirme ortamınız olduğundan emin olun. Bu örnekte Python 3.11.4 ve PyCharm 2023.1.2 kullanılır.

İlgili kavramlar

Gömme (Embedding)

Gömme yüksek boyutlu verileri düşük boyutlu bir temsille eşleme sürecidir. Makine öğrenimi ve doğal dil işleme (NLP) alanında gömme genellikle ayrık sembolleri veya nesneleri sürekli bir vektör uzayındaki noktalar olarak temsil etmek için kullanılır.

NLP'de kelime gömme yaygın bir tekniktir. Bilgisayarların metni daha iyi anlamasını ve işlemesini sağlamak için kelimeleri reel sayı vektörlerine eşler. Kelime gömme sayesinde kelimeler arasındaki anlamsal ve dilbilgisel ilişkiler vektör uzayında temsil edilebilir.

OpenAI bir Embeddings özelliği sağlar.

Uygulama ilkeleri

Özel sohbet robotunu oluşturma süreci iki aşamadan oluşur:

Aşama 1: Veri hazırlığı

  1. Bilgi tabanından bilgileri çıkarın ve parçalara ayırın: Alan bilgi tabanından ilgili metni çıkarın ve parçalara işleyin. Bu süreç uzun metinleri paragraflara veya cümlelere bölmeyi ya da anahtar kelimeleri veya varlıkları çıkarmayı içerebilir. Bu süreç bilgi tabanı içeriğini düzenlemeye ve yönetmeye yardımcı olur.

  2. Gömmeleri oluşturmak için bir LLM arayüzünü çağırın: OpenAI gibi bir LLM tarafından sağlanan bir arayüz kullanarak metin parçalarını girdi olarak verin ve karşılık gelen metin gömmelerini oluşturun. Bu gömmeler metnin anlamsal ve bağlamsal bilgilerini yakalar ve sonraki arama ve eşleştirme için bir temel sağlar.

  3. Gömme bilgilerini depolayın: Oluşturulan metin gömmelerini, metin parçalarını ve ilişkili meta verileri ApsaraDB RDS for PostgreSQL veritabanında depolayın.

Aşama 2: Soru-cevap

  1. Bir kullanıcı bir soru sorar.

  2. OpenAI tarafından sağlanan gömme arayüzünü kullanarak soru için bir gömme oluşturun.

  3. Belirli bir eşiğin üzerinde benzerlik puanına sahip belge parçalarını ApsaraDB RDS for PostgreSQL veritabanında filtrelemek için pgvector kullanın ve sonuçları döndürün.

Aşağıdaki akış şeması süreci göstermektedir:

image..png

Yordam

Aşama 1: Veri hazırlığı

Bu konu örnek olarak RDS for PostgreSQL örneği oluşturun belgesindeki metin içeriğini kullanır. İçerik bölünür ve bir ApsaraDB RDS for PostgreSQL veritabanında depolanır. Kendi alana özgü bilgi tabanınızı hazırlamanız gerekir.

Veri hazırlığı aşamasının anahtarı alana özgü bilgiyi metin gömmelerine dönüştürmek ve bu bilgileri etkili bir şekilde depolamak ve eşleştirmektir. LLM'lerin güçlü anlamsal anlama yeteneklerini kullanarak belirli alanınızla ilgili yüksek kaliteli yanıtlar ve öneriler alabilirsiniz. LangChain ve OpenAI'nin açık kaynaklı ChatGPT Retrieval Plugin gibi bazı mevcut açık kaynak çerçeveler URL, Markdown, PDF ve Word gibi formatlardaki bilgi tabanı dosyalarını kolayca yüklemenize ve ayrıştırmanıza olanak tanır. Hem LangChain hem de ChatGPT Retrieval Plugin arka uç vektör veritabanı olarak pgvector uzantısına sahip PostgreSQL'i zaten destekler. Bu durum ApsaraDB RDS for PostgreSQL örneğinizle entegrasyonu kolaylaştırır. Bu entegrasyon sayesinde Aşama 1'de alan bilgi tabanınız için veri hazırlığını tamamlayabilirsiniz. Ayrıca pgvector'un vektör dizine alma ve benzerlik arama özelliklerini verimli metin eşleştirme ve sorgular için tamamen kullanabilirsiniz.

  1. PostgreSQL örneğine bağlanın.

  2. Bir test veritabanı oluşturun. Bu örnekte rds_pgvector_test kullanılır.

    CREATE DATABASE rds_pgvector_test;
  3. Test veritabanına bağlanın ve pgvector eklentisini oluşturun.

    CREATE EXTENSION IF NOT EXISTS vector;
  4. Bilgi tabanı içeriğini depolamak için bir test tablosu oluşturun. Bu örnekte rds_pg_help_docs kullanılır.

    CREATE TABLE rds_pg_help_docs (
      id bigserial PRIMARY KEY, 
      title text,			-- Document title
      description text, 		-- Description
      doc_chunk text, 		-- Document chunk
      token_size int, 		-- Token count of the document chunk
      embedding vector(1536));	-- Text embedding information
  5. Sorguları optimize etmek ve hızlandırmak için embedding sütununda bir dizin oluşturun.

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

    Vektör sütununda dizin oluşturma hakkında daha fazla bilgi için bkz. pgvector kullanıcı kılavuzu.

  6. PyCharm'da bir proje oluşturun, Terminal'i açın ve gerekli bağımlılıkları yüklemek için aşağıdaki komutu çalıştırın.

    pip install openai psycopg2 tiktoken requests beautifulsoup4 numpy
  7. Bilgi tabanı belgesini bölmek ve veritabanında depolamak için bir .py dosyası oluşturun. Bu örnekte knowledge_chunk_storage.py kullanılır. Örnek kod aşağıdaki gibidir:

    Not

    Aşağıdaki örnek kodda özel bölme yöntemi bilgi tabanı belgesini yalnızca sabit sayıda karaktere göre böler. Bölme işlemi için LangChain ve OpenAI'nin açık kaynaklı ChatGPT Retrieval Plugin gibi açık kaynak çerçeveler tarafından sunulan yöntemleri kullanabilirsiniz. Bilgi tabanındaki belgelerin kalitesi ve bölme sonuçları nihai çıktı üzerinde önemli bir etkiye sahiptir.

    import openai
    import psycopg2
    import tiktoken
    import requests
    from bs4 import BeautifulSoup
    
    EMBEDDING_MODEL = "text-embedding-ada-002"
    tokenizer = tiktoken.get_encoding("cl100k_base")
    
    # Connect to the RDS for PostgreSQL database
    conn = psycopg2.connect(database="<database_name>",
                            host="<instance_endpoint>",
                            user="<username>",
                            password="<password>",
                            port="<port>")
    conn.autocommit = True
    
    # OpenAI API key
    openai.api_key = '<Secret API Key>'
    
    # Custom splitting method (for example only)
      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_
    
    # Specify the web page to split
    url = 'https://www.alibabacloud.com/help/document_detail/148038.html'
    
    response = requests.get(url)
    if response.status_code == 200:
        # Get the web page content
        web_html_data = response.text
        soup = BeautifulSoup(web_html_data, 'html.parser')
        # Get the title (H1 tag)
        title = soup.find('h1').text.strip()
    
        # Get the description (content of the p tag with class='shortdesc')
        description = soup.find('p', class_='shortdesc').text.strip()
    
        # Split and store
        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('Failed to fetch web page')
  8. Python programını çalıştırın.

  9. Veritabanında oturum açın ve bilgi tabanı içeriğinin bölünüp vektör verileri olarak depolanıp depolanmadığını kontrol etmek için aşağıdaki komutu çalıştırın.

    SELECT * FROM rds_pg_help_docs;

    image..png

Aşama 2: Soru-cevap

  1. Python projesinde bir soru oluşturmak, bunun veritabanındaki bilgi tabanı içeriğiyle benzerliğini karşılaştırmak ve sonucu döndürmek için bir .py dosyası oluşturun. Bu örnekte chatbot.py kullanılır.

    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
    
    # OpenAI API key
    openai.api_key = '<Secret API Key>'
    
    prompt = 'How to create an RDS for PostgreSQL instance'
    
    prompt_response = openai.Embedding.create(
        model=EMBEDDING_MODEL,
        input=prompt,
    )
    prompt_embedding = prompt_response['data'][0]['embedding']
    
    # Connect to the RDS for PostgreSQL database
    conn = psycopg2.connect(database="<database_name>",
                            host="<instance_endpoint>",
                            user="<username>",
                            password="<password>",
                            port="<port>")
    conn.autocommit = True
    
    def answer(prompt_doc, prompt):
        improved_prompt = f"""
        Answer the following question based on the provided document and steps:
        (1) First, analyze the content of the document to see if it is relevant to the question.
        (2) Second, use only the content from the document for the reply. Be as detailed as possible and output in markdown format.
        (3) Finally, if the question is not related to RDS for PostgreSQL, reply with "I am not very knowledgeable about topics other than RDS for PostgreSQL."
    
        Document:
        \"\"\"
        {prompt_doc}
        \"\"\"
    
        Question: {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
    
    # Filter out document chunks with a similarity greater than a certain threshold using pgvector
    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('Answer: \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. Python programını çalıştırdıktan sonra çalışma penceresinde aşağıdakine benzer bir yanıt görünür:

    Not

    Daha doğru ve eksiksiz yanıtlar almak için bölme yöntemini ve soru istemini optimize edebilirsiniz. Bu konu yalnızca bir örnek sağlar.

    image..png

Özet

Özel bir bilgi tabanı bağlı değilse OpenAI'nin "Bir RDS for PostgreSQL örneği nasıl oluşturulur?" sorusuna verdiği yanıt genellikle Alibaba Cloud ile ilgili değildir. Örneğin:

image..png

ApsaraDB RDS for PostgreSQL veritabanında depolanan özel bilgi tabanına bağlandıktan sonra "Bir RDS for PostgreSQL örneği nasıl oluşturulur?" sorusuna verilen yanıt Alibaba Cloud'un ApsaraDB RDS for PostgreSQL hizmetine özgü olacaktır.

Yukarıdaki örneğe dayanarak ApsaraDB RDS for PostgreSQL'in dikey bir alan için LLM tabanlı bir bilgi tabanı oluşturma konusunda tamamen yeterli olduğu açıktır.