Введение:
В этой статье мы рассмотрим, как создать интеллектуального чат-бота, используя OpenAI GPT-3.5, мощную языковую модель, способную понимать и генерировать человекоподобный текст. Мы разобьем процесс на модульные этапы и предоставим подробное объяснение, которое поможет вам создать собственного чат-бота. Чат-бот, который мы создадим, сможет отвечать на вопросы в заданном контексте, что делает его универсальным инструментом для различных приложений.
Предпосылки:
Прежде чем мы углубимся в создание чат-бота, убедитесь, что у вас есть следующие предварительные условия:
1. Базовые знания языка программирования Python.
2. Учетная запись OpenAI и ключ API (вы можете зарегистрироваться для доступа на сайт OpenAI).
Шаг 1: Подготовка среды и библиотек
Для начала убедитесь, что у вас установлены необходимые библиотеки. Мы будем использовать популярные библиотеки Python, такие как pandas, docx и openai. Также нам понадобится библиотека tiktoken для работы с токенизатором cl100k_base, специально разработанная для модели ada-002.
# Import the required libraries import os import pandas as pd import numpy as np from docx import Document from openai.embeddings_utils import distances_from_embeddings import tiktoken import openai
Шаг 2: Чтение данных и предварительная обработка
Мы начнем с чтения данных из файла DOCX и преобразования их в DataFrame pandas. Данные могут содержать различные абзацы, и потребуется предварительная обработка данных для удаления новых строк или ненужных пробелов.
# Specify the path to your DOCX file docx_file_path = "sample.docx" # Function to read text from a DOCX file and convert it into a DataFrame def read_docx_to_dataframe(file_path): doc = Document(file_path) data = [] # Extract text from each paragraph in the document for paragraph in doc.paragraphs: data.append(paragraph.text) # Create pandas DataFrame df = pd.DataFrame(data, columns=["Text"]) return df # Read DOCX file and convert it to a DataFrame df = read_docx_to_dataframe(docx_file_path) # Remove rows with empty or None values df = df.dropna() # Filter out rows with empty text df = df[df['Text'].map(lambda d: len(d)) > 0]
Шаг 3: Токенизация и фрагментация текста
Когда наши данные готовы, мы разметим текст с помощью токенизатора cl100k_base. Чтобы чат-бот мог обрабатывать длинные тексты, мы реализуем функцию под названием «split_into_many», которая разбивает длинные тексты на более мелкие фрагменты, каждый из которых содержит ограниченное количество токенов.
# Tokenize the text and save the number of tokens to a new column tokenizer = tiktoken.get_encoding("cl100k_base") df['n_tokens'] = df.Text.apply(lambda x: len(tokenizer.encode(x))) # Visualize the distribution of the number of tokens per row using a histogram df.n_tokens.hist() # Define the maximum number of tokens allowed per text max_tokens = 500 # Function to split the text into chunks of a maximum number of tokens def split_into_many(text, max_tokens = max_tokens): # Split the text into sentences sentences = text.split('. ') # Get the number of tokens for each sentence n_tokens = [len(tokenizer.encode(" " + sentence)) for sentence in sentences] chunks = [] tokens_so_far = 0 chunk = [] # Loop through the sentences and tokens joined together in a tuple for sentence, token in zip(sentences, n_tokens): # If the number of tokens so far plus the number of tokens in the current sentence is greater # than the max number of tokens, then add the chunk to the list of chunks and reset # the chunk and tokens so far if tokens_so_far + token > max_tokens: chunks.append(". ".join(chunk) + ".") chunk = [] tokens_so_far = 0 # If the number of tokens in the current sentence is greater than the max number of # tokens, go to the next sentence if token > max_tokens: continue # Otherwise, add the sentence to the chunk and add the number of tokens to the total chunk.append(sentence) tokens_so_far += token + 1 return chunks # Shorten long texts by splitting them into chunks with a maximum number of tokens shortened = [] for row in df.iterrows(): if row[1]['Text'] is None: continue if row[1]['n_tokens'] > max_tokens: shortened += split_into_many(row[1]['Text'], max_tokens) else: shortened.append(row[1]['Text']) # Create a new DataFrame with the shortened texts and their token counts df = pd.DataFrame(shortened, columns=['Text']) df['n_tokens'] = df.Text.apply(lambda x: len(tokenizer.encode(x))) df.n_tokens.hist()
Шаг 4. Получение вложений
Теперь начинается захватывающая часть! Мы будем использовать OpenAI GPT-3.5 (ada-002) для получения вложений для каждого фрагмента текста. Эти вложения представляют семантическое понимание текста и позволят нам найти наиболее подходящий контекст для ответов на вопросы.
# Set your OPENAI API key and organization openai.api_key = os.getenv("OPENAI_API_KEY") openai.organization = os.getenv("OPENAI_ORGANIZATION") # Fetch embeddings for the texts using the ada-002 model df['embeddings'] = df.Text.apply(lambda x: openai.Embedding.create(input=x, engine='text-embedding-ada-002')['data'][0]['embedding'])
Шаг 5: Создание логики чат-бота
Чтобы создать интерактивного чат-бота, мы определим функцию под названием «answer_question». Эта функция будет принимать вопрос пользователя в качестве входных данных и использовать вложения для поиска наиболее похожего контекста из текстов DataFrame. Затем чат-бот будет использовать GPT-3.5 для создания соответствующего ответа на основе выбранного контекста.
# Main function to answer a question based on a DataFrame of texts def answer_question(df, model="text-davinci-003", question="", max_len=1800, size="ada", debug=False, max_tokens=150, stop_sequence=None): """ Answer a question based on the most similar context from the dataframe texts """ # Create a context for the question context = create_context( question, df, max_len=max_len, size=size, ) # If debug, print the raw model response if debug: print("Context:\n" + context) print("\n\n") try: # Create completions using the question and context response = openai.Completion.create( prompt=f"Answer the question based on the context below, and if the question can't be answered based on the context, say \"I don't know\"\n\nContext: {context}\n\n---\n\nQuestion: {question}\nAnswer:", temperature=0, max_tokens=max_tokens, top_p=1, frequency_penalty=0, presence_penalty=0, stop=stop_sequence, model=model, ) return response["choices"][0]["text"].strip() except Exception as e: print(e) return "" # Answer a specific question based on the processed texts answer = answer_question(df, question="What is core leadership skill?") print(answer)
Шаг 6: Интеграция и развертывание
С нашей логикой чат-бота вы можете интегрировать ее в свое приложение или веб-сайт. Разверните чат-бот, и он готов отвечать на вопросы пользователей.
Ссылка Github на пример рабочего кода: openai_qa_chatbot_text
Заключение:
Поздравляем! Вы успешно создали чат-бота на базе OpenAI GPT-3.5. Следуя модульным шагам, вы использовали возможности языкового моделирования для создания интеллектуального диалогового агента. С дальнейшими настройками и улучшениями ваш чат-бот можно использовать для различных целей, от поддержки клиентов до помощи в обучении.
Примечание. Убедитесь, что вы соблюдаете условия обслуживания и этические принципы OpenAI при развертывании чат-бота. Важно поддерживать прозрачность с пользователями в отношении использования ИИ в их взаимодействиях.
В этой статье мы лишь коснулись того, чего можно достичь с помощью GPT-3.5. Не стесняйтесь экспериментировать и расширять возможности своего чат-бота. Удачного кодирования и создания вашего интеллектуального чат-бота!
Отказ от ответственности: эта статья создана путем передачи моего кода в ChatGPT.