برنامه نویسی

پیاده سازی ساده: ChatGPT در Streamlit و نظارت بر پاسخ پرس و جو

در این پست وبلاگ، ما رویکرد خود را برای ایجاد یک نمونه اولیه یا MVP بررسی خواهیم کرد که استفاده از ChatGPT API را برای بازیابی پاسخ‌ها در پرسش‌های تغذیه‌شده، بهینه‌سازی شده برای کلمات کلیدی خاص و همچنین ارائه کاوشی از پاسخ‌ها را نشان می‌دهد.

ChatGPT مدل فوق‌العاده محبوبی است که توسط OpenAI ساخته شده است و بر روی مقادیر انبوهی از داده‌ها آموزش داده شده است تا پاسخ‌هایی شبیه انسان به درخواست‌ها ارائه دهد، اخیراً تیم OpenAI APIهایی را منتشر کرده است که ما را قادر می‌سازد این تابع عظیم را از برنامه خود فراخوانی کنیم.

برای ساختن چنین برنامه وب سایتی، از کتابخانه Streamlit پایتون استفاده می کنیم که یک چارچوب برنامه منبع باز است و شاید بهترین برای هر کسی که امیدوار است نمونه های اولیه سریع ایجاد کند، در این پست آن را در حال کار خواهیم دید.

این پروژه به بخش های اصلی تقسیم می شود:
کلید API را از OpenAI ایجاد کنید
بخش اول این برنامه آشنایی با OpenAi ChatGPT API است، ابتدا یک حساب کاربری در اینجا ایجاد کنید و سپس به ایجاد کلیدهای API خود بروید که به ما امکان می دهد با استفاده از این مدل قدرتمند کوئری ها را اجرا کنیم.

کلید API شما باید چیزی شبیه به آن باشد Openai_SECRET_KEY = "sk-123oNeTwoTHRee" و شما باید آن را خصوصی نگه دارید. در مرحله بعد، ما شروع به ساخت برنامه وب خود می کنیم.

محیط Streamlit و نصب بسته را تنظیم کنید
قبل از شروع، به فهرست کار خود بروید و بسته‌های خود را به‌روزرسانی کنید، سپس می‌توانیم با وارد کردن/نصب کتابخانه‌های مورد نیاز شروع کنیم، بیایید ببینیم چگونه می‌توانیم با محیط‌های pipenv و conda به این هدف برسیم.
پیپنف
مدیر محیطی که رسماً از Streamlit برای macOS و Linux پشتیبانی می شود Pipenv است.
به پوشه پروژه حاوی محیط Pipenv خود بروید:

cd myproject
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آن محیط را فعال کنید، Streamlit را ارتقا دهید و تأیید کنید که آخرین نسخه (حداقل 1.10.1) را دارید:

pipenv shell
pip install --upgrade streamlit
pip install --upgrade openai
streamlit version
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یا اگر می خواهید از محیطی با قابلیت تکرار آسان استفاده کنید، هر بار که بسته ای را نصب یا به روز می کنید، pip را با pipenv جایگزین کنید:

pipenv update streamlit
pipenv update openai
pipenv run streamlit version
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کوندا
محیط conda را که Streamlit در آن نصب شده است فعال کنید:

conda activate $ENVIRONMENT_NAME
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

حتما تعویض کنید $ENVIRONMENT_NAME ☝️ با نام محیط کاندا شما!
Streamlit را در محیط فعال conda به روز کنید و تأیید کنید که آخرین نسخه را دارید:

conda update -c conda-forge streamlit -y
conda install -c anaconda openai
streamlit version
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ساخت وب اپلیکیشن

در پوشه کاری خود، یک فایل به نام ایجاد کنید app.py و وارد کردن بسته های لازم را شروع کنید.

import streamlit
import openai
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس برای کلید مخفی ما، یک dir به نام ایجاد کنید جریان روشن، در این پوشه یک را ایجاد کنید Secret.toml فایل و کلید خود را در این فایل قرار دهید، در نهایت فراموش نکنید که یک فایل git.ignore ایجاد کنید که حاوی **.toml* برای نادیده گرفتن این فایل هنگام فشار دادن کد خود به GitHub.

سپس شروع به فراخوانی API می کنیم. از فایل app.py ما کد زیر را وارد کنید

def ChatGPT(user_query):
    '''
    This function uses the OpenAI API to generate a response to the given
    user_query using the ChatGPT model
    :param user_query:
    :return:
    '''
    # Use the OpenAI API to generate a response
    completion = openai.Completion.create(
        engine=model_engine,
        prompt=user_query,
        max_tokens=1024,
        n=1,
        temperature=0.5,
    )
    response = completion.choices[0].text
    return response
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

@st.cache_data
def api_call_on(query):
    '''
    This function gets the user input, pass it to ChatGPT function and
    displays the response
    '''

    response = ChatGPT(query)
    return response
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

# Set the model engine and your OpenAI API key
model_engine = "text-davinci-003"
openai.api_key = st.secrets["Openai_SECRET_KEY"]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به سادگی، اولین تابع گره تعامل API را ایجاد می کند و api_call_on پاسخ query st.cache_data را بازیابی می کند، روش Streamlit دیگری برای مدیریت تماس های API مکرر.
در این مرحله، می‌توانید به سادگی یک عنصر ورودی متن ایجاد کنید و پرس و جوهای خود را بر روی آنها اجرا کنید:

# Get user input
user_query = st.text_input("Enter query here, to exit enter :q",
                           "what is ChatGPT?")
# Retrieve response on input
response = api_call_on(prefix_query)
# Present response
st.success(f"{response}")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ساده و این تمرین کامل و همچنین مدیون آموزش یاسر مصطفی در این مورد است. با این حال، این می تواند بهبود یابد و برای این پروژه خاص، ما در حال تطبیق با کلمات کلیدی خاص برای پشتیبانی از ورودی های کاربر و همچنین مکانیسم های مدیریت و نظارت بر این ورودی ها و پاسخ ها هستیم.

می‌توانید در اینجا توقف کنید یا دنبال کنید تا ببینید چگونه به این هدف می‌رسید.

ساخت Web-Application II

ایجاد و اصلاح کلمات کلیدی

یک دایرکتوری جدید در فهرست کاری خود ایجاد کنید، ، و a اضافه کنید csv فایل فهرستی از کلمات، کلمات عملی را بگویید.
به فایل app.py خود بروید و موارد زیر را اضافه کنید تا نوار کناری ارائه شود که در آن بتوانیم با این کلمات تعامل داشته باشیم و همچنین آنها را با ورودی کاربر خود ادغام کنیم:

import pandas as pd
## Function to create list of words selected
def create_action(response_type):
    strList = [str(i) for i in response_type]
    myString = ", ".join(strList)
    prefix_keyword = myString + " and " + str(response_type)
    return prefix_keyword

## Read a list of adjectives and actions
actions = pd.read_csv('./<keyword_dir>/<action_words.>csv')

response_type = st.sidebar.selectbox("Please specify action", actions)
## Main Statement
if response_type != "":
    prefix_keyword = create_action(response_type)
    prefix_query = f'A {prefix_keyword} response to {user_query}'
    st.sidebar.markdown('##')  ##-> Empty Space Divider
    if st.sidebar.button("Run"):
        with st.spinner('Your query is running...'):
            response = api_call_on(prefix_query)
            st.success(f"{response}")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به این توجه کنید”بیانیه اصلی“، ما به زودی به این موضوع باز خواهیم گشت.

اصلاح کلمات کلیدی

برای اصلاح فایل کلمات کلیدی که ایجاد کرده بودیم، از آن استفاده می کنیم st_experimental_data_editor ویژگی در Streamlit، که به ما اجازه می‌دهد تا فریم داده خود را باز کنیم csv مقادیر، تغییر، حذف یا حتی اضافه کردن موارد جدید و ذخیره خودکار آن در فایل ما، تغییر در زمان واقعی است و موارد زیر به ما کمک می کند تا به این هدف برسیم:

if st.sidebar.button("Edit Keywords"):
    ### Lifecycle of Editable Dataframe
    ## Read csv
    df = pd.read_csv('./<keyword_dir>/<action_words.>csv', names=['ACTIONS'], header=1)

    ## Editable Dataframe
    editable_df = st.sidebar.experimental_data_editor(df, axis=1), num_rows="dynamic")

    ## Update csv
    editable_df['ACTIONS'].to_csv('./<keyword_dir>/<action_words.>csv', index=False)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه داشته باشید که چگونه دستگیره های خود را در یک نوار کناری نگه می داریم، این برای این است که این را مرتب نگه داریم و به راحتی قابل تطبیق باشیم.

پاسخ های نظارتی
در این بخش، آخرین نکات را به برنامه اضافه می‌کنیم، ویژگی‌ها به ما کمک می‌کنند تا زمان پرس و جو و تجزیه سریع نتایج بازیابی شده را بررسی کنیم، چیزی که از آن قدردانی می‌کنید این است که مدل سریع (یعنی سبک وزن) و بسیار قدرتمند است. ، این یک بحث برای زمان دیگری است.
برای دستیابی به زمان پرس و جو و توزیع کلمه موارد زیر را اجرا می کنیم:

زمان پرس و جو
برای رسیدن به این هدف، “بیانیه اصلی” را با یک تایمر مانند آن بپیچید

import time
## start timer
start = time.time()

##=> "Main Statement" comes here
...
response = api_call_on(user_query)
st.success(f"{response}")

## End Timer
end = time.time()
## Query Time
query_time = end - start
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تعداد کلمه
ما تابعی ایجاد می کنیم که کلمات بازیابی شده از پرس و جو ما را جمع آوری کرده و آنها را حذف می کند، سپس فراوانی را محاسبه می کند. حتی ممکن است یک چارچوب داده ارائه کنیم که هر کلمه و چند بار تکرار آن را نشان می دهد.

## Word count
def word_count(string):
    strip_words = (len(string.strip().split(" ")))
    return strip_words
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

col1, col2 = st.columns(2)

with col1:
    st.warning("Query Data")
    st.write('Keywords: ', prefix_keyword)

with col2:
    st.warning("Basic Text Analysis")
    st.write("Query Time :   s", round(query_time / 1000, 2), "-", round(query_time, 2), "ms")
    st.write("Word Count: ", word_count(response) - 1)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این ما را به پایان این پیاده سازی می رساند، می توانید آنچه را که در اینجا ایجاد کرده اید در نظرات به اشتراک بگذارید.

لطفاً برنامه وب و مخزن GitHub را بررسی کنید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا