Запрос новостных статей через приложение Streamlit с использованием OpenAI, Langchain и Qdrant DB

Запрос новостных статей через приложение Streamlit с использованием OpenAI, Langchain и Qdrant DB

4 января 2024 г.

Чат-боты, интегрированные в запросы новостей, служат различным важным целям. Они предлагают пользователям удобный и диалоговый подход к доступу к новостям, устраняя необходимость навигации по веб-сайтам или приложениям. Пользователи могут просто запросить у чат-бота новости по определенной теме или событию, что делает информацию более доступной, особенно для тех, кому традиционные методы кажутся сложными.

Персонализация — ключевая особенность чат-ботов в новостной индустрии. Изучая прошлые запросы и взаимодействия пользователей, чат-боты могут представлять более актуальные и персонализированные новостные статьи, улучшая общий пользовательский опыт. Такая адаптация контента гарантирует, что пользователи получат информацию, соответствующую их предпочтениям.

Экономия времени – еще одно существенное преимущество. Чат-боты быстро анализируют огромные объемы информации, предоставляя пользователям самые актуальные новостные статьи. Этот аспект экономии времени особенно полезен для пользователей, которым в противном случае пришлось бы вручную искать и фильтровать многочисленные источники.

Более того, чат-боты способствуют интерактивному потреблению новостей. Они вовлекают пользователей в разговор, отвечая на дополнительные вопросы и предоставляя дополнительный контекст или соответствующую информацию. Этот интерактивный подход делает чтение новостей более глубоким, превосходя пассивный характер традиционных методов.

Информационная перегрузка — распространенная проблема в эпоху цифровых технологий, и чат-боты помогают смягчить ее, фильтруя шум. Они предоставляют новости, наиболее соответствующие интересам и потребностям пользователя, оптимизируя процесс потребления и повышая удовлетворенность пользователей.

Пользователи с нарушениями зрения получают значительную выгоду от чат-ботов, особенно при интеграции с голосовыми технологиями. Эта комбинация обеспечивает бесценный аудио-метод доступа к новостям, способствуя инклюзивности в потреблении новостей.

Интеграция с широко используемыми платформами, такими как приложения для обмена сообщениями, повышает удобство пользователя. Пользователи могут получать обновления новостей в той же среде, где они общаются с другими, что упрощает работу с цифровыми технологиями.

Автоматические обновления и оповещения — это проактивная функция чат-ботов. Чат-боты, запрограммированные на своевременную отправку обновлений новостей или оповещений о последних новостях, гарантируют, что пользователи будут получать информацию в режиме реального времени, способствуя созданию более подключенной и осведомленной пользовательской базы.

Языковая и региональная настройка еще больше расширяют доступность новостей. Чат-боты могут быть предназначены для доставки новостей на нескольких языках и адаптации контента к региональным или местным интересам с учетом различных демографических групп и предпочтений.

Подводя итог, можно сказать, что чат-боты в новостной индустрии повышают качество обслуживания пользователей благодаря удобному, персонализированному и интерактивному доступу к новостям. Они решают различные проблемы традиционных методов потребления новостей, одновременно удовлетворяя широкий спектр потребностей и предпочтений пользователей.

В этой статье мы спроектируем конвейер RAG с использованием OpenAI, Langchain и Qdrant DB и включим его в пользовательский интерфейс через Streamlit.

Что такое RAG

RAG означает «генерация с расширенным поиском». Это метод, используемый в обработке естественного языка и машинном обучении, особенно при разработке продвинутых языковых моделей, таких как чат-боты. В настройке RAG, когда вводится запрос (например, вопрос или подсказка), поисковая система сначала выполняет поиск в своей базе данных. найти соответствующую информацию или документы. Затем эта информация передается генеративной модели, которая синтезирует ее для создания последовательного и контекстуально соответствующего ответа.

Визуализация конвейера RAG

Краткое описание компонентов

Langchain: LangChain — это платформа с открытым исходным кодом, предназначенная для упрощения создания приложений с использованием больших языковых моделей (LLM). Варианты использования LangChain во многом совпадают с вариантами использования языковых моделей в целом, включая анализ и обобщение документов, чат-ботов и анализ кода. LangChain позволяет разработчикам подключать LLM к другим источникам данных, взаимодействовать со своей средой и создавать сложные приложения. Он написан на Python и JavaScript и поддерживает множество языковых моделей, включая GPT-3, LLAMA, Hugging Face Jurassic-1 Jumbo и другие.

Qdrant: Qdrant — это система поиска сходства векторов с открытым исходным кодом и база данных векторов, написанная на Rust. Он предоставляет готовый к использованию сервис с удобным API для хранения, поиска и управления точками — векторами с дополнительной полезной нагрузкой. Qdrant адаптирован для расширенной поддержки фильтрации, что делает его полезным для различных нейронных сетей или семантического сопоставления, фасетного поиска и других приложений.

Настройка среды и усиление; Код

Сначала в своем каталоге создайте файл require.txt со следующим содержимым:

langchain

streamlit

requests

opeanai

qdrant-client

tiktoken

Затем запустите команду для установки этих зависимостей:

pip install -r requirements.txt

Теперь создайте файл с именем app.py и вставьте в него следующий код, комментарии объясняют его функциональность:

#importing the needed libraries

import streamlit as st

import requests

from langchain.text_splitter import RecursiveCharacterTextSplitter

from langchain.embeddings.openai import OpenAIEmbeddings

from langchain.vectorstores import Qdrant

from langchain.chat_models import ChatOpenAI

from langchain.chains import RetrievalQA

import os

#function to fetch text data from the links of news websites
def fetch_article_content(url):

headers = { 

    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' 

} 

try: 

    response = requests.get(url, headers=headers) 

    response.raise_for_status() 

    return response.text 

except requests.RequestException as e: 

    st.error(f"Error fetching {url}: {e}") 

    return "" 

#function to collate all the text from the news website into a single string
def process_links(links):

all_contents = "" 

for link in enumerate(links): 

    content = fetch_article_content(link.strip()) 

    all_contents += content + "nn" 

return all_contents 

#function to chunk the articles beofore creating vector embeddings
def get_text_chunks_langchain(text):

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100) 

texts = text_splitter.split_text(text) 

return texts 

#creating the streamlit app
def main():

st.title('News Article Fetcher') 

# Initialize state variables 

if 'articles_fetched' not in st.session_state: 

    st.session_state.articles_fetched = False 

if 'chat_history' not in st.session_state: 

    st.session_state.chat_history = "" 



# Model selection 

model_choice = st.radio("Choose your model", ["GPT 3.5", "GPT 4"], key= "model_choice") 

model = "gpt-3.5-turbo-1106" if st.session_state.model_choice == "GPT 3.5" else "gpt-4-1106-preview" 



#API_KEY 

API_KEY = st.text_input("Enter your OpenAI API key", type="password", key= "API_KEY") 



# Ensure API_KEY is set before proceeding 

if not API_KEY: 

    st.warning("Please enter your OpenAI API key.") 

    st.stop() 



#asking user to upload a text file with links to news articles (1 link per line) 

uploaded_file = st.file_uploader("Upload a file with links", type="txt") 



# Read the file into a list of links 

if uploaded_file: 

    stringio = uploaded_file.getvalue().decode("utf-8") 

    links = stringio.splitlines() 



# Fetch the articles' content 

if st.button("Fetch Articles") and uploaded_file: 

    progress_bar = st.progress(0) 

    with st.spinner('Fetching articles...'): 

        article_contents = process_links(links) 

        progress_bar.progress(0.25)  # Update progress to 25% 



        #Process the article contents 

        texts = get_text_chunks_langchain(article_contents) 

        progress_bar.progress(0.5)  # Update progress to 50% 



        #storing the chunked articles as embeddings in Qdrant 

        os.environ["OPENAI_API_KEY"] =  st.session_state.API_KEY 

        embeddings = OpenAIEmbeddings() 

        vector_store = Qdrant.from_texts(texts, embeddings, location=":memory:",) 

        retriever = vector_store.as_retriever() 

        progress_bar.progress(0.75)  # Update progress to 75% 



        #Creating a QA chain against the vectorstore 

        llm = ChatOpenAI(model_name= model) 

        if 'qa' not in st.session_state: 

            st.session_state.qa = RetrievalQA.from_llm(llm= llm, retriever= retriever) 

        progress_bar.progress(1) 



        st.success('Articles fetched successfully!') 

        st.session_state.articles_fetched = True 



#once articles are fetched, take input for user query 



if 'articles_fetched' in st.session_state and st.session_state.articles_fetched: 



    query = st.text_input("Enter your query here:", key="query") 



    if query: 

        # Process the query using your QA model (assuming it's already set up) 

        with st.spinner('Analyzing query...'): 

            qa = st.session_state.qa 

            response = qa.run(st.session_state.query)   

        # Update chat history 

        st.session_state.chat_history += f"> {st.session_state.query}n{response}nn" 



    # Display conversation history 

    st.text_area("Conversation:", st.session_state.chat_history, height=1000, key="conversation_area") 

    # JavaScript to scroll to the bottom of the text area 

    st.markdown( 

        f"<script>document.getElementById('conversation_area').scrollTop = document.getElementById('conversation_area').scrollHeight;</script>", 

        unsafe_allow_html=True 

    ) 

if name == "main":

main() 

Затем сохраните app.py и выполните в терминале следующую команду:

streamlit run app.py

Это запустит ваше приложение на локальном хосте с номером порта 8051.

Заключение

В заключение отметим, что интеграция чат-ботов в систему запросов новостей не только решает проблемы традиционного потребления новостей, но и значительно повышает удобство работы пользователей, предоставляя удобный, персонализированный и интерактивный доступ к информации. Обсуждаемый конвейер RAG, включающий OpenAI, Langchain и Qdrant DB в сочетании с пользовательским интерфейсом на основе Streamlit, иллюстрирует передовые технологические достижения в области обработки естественного языка и машинного обучения. Это комплексное решение не только оптимизирует процесс получения и анализа новостных статей, но также демонстрирует потенциал систем на базе искусственного интеллекта в предоставлении адаптированного контента, уменьшении информационной перегрузки и обеспечении инклюзивности для пользователей с нарушениями зрения. Описанная реализация кода служит практическим руководством для разработчиков, заинтересованных в создании продвинутых приложений чат-ботов для поиска новостей, демонстрируя сочетание языковых моделей, поисковых систем по сходству векторов и эффективного дизайна пользовательского интерфейса. В конечном счете, этот инновационный подход представляет собой сдвиг парадигмы потребления новостей, предлагая заглянуть в будущее ориентированного на пользователя и технологического доступа к информации.

Ссылки

  • https://api.python.langchain.com/en/latest/api_reference.html
  • https://python.langchain.com/docs/integrations/vectorstores/qdrant


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE