Ubuntu TechHive
introduction-to-natural-language-processing.md
Introduction To Natural Language Processing
article.detail

Introduction To Natural Language Processing

reading.progress 24 min read

Description of Introduction To Natural Language Processing

Introduction To Natural Language Processing

Text Generation with RAG Development in Natural Language Processing

Course Overview:

English

  • Introduction to natural language processing (NLP) and its applications in text generation.
  • Exploration of Retrieval+Augmented Generation (RAG).
  • Hands+on experience with RAG development and practical applications in creative writing, content generation, and more.
  • Implementation of a text generative application with.
  • Classification

    • Summarization
    • Translation
  • Technology stack includes

Français

  • Introduction au traitement du langage naturel (NLP) et Ă  ses applications dans la gĂ©nĂ©ration de texte.
  • Exploration de la gĂ©nĂ©ration augmentĂ©e par rĂ©cupĂ©ration (RAG).
  • ExpĂ©rience pratique avec le dĂ©veloppement RAG et applications pratiques dans l'Ă©criture crĂ©ative, la gĂ©nĂ©ration de contenu, et plus encore.
  • Mise en Ĺ“uvre d'une application de gĂ©nĂ©ration de texte avec.
  • Classification

    • RĂ©sumĂ©
    • Traduction
  • La pile technologique comprend

Goals

English

  • Understand the fundamentals of natural language processing (NLP) and its significance in various applications, particularly in text generation.
  • Gain familiarity with Retrieval-Augmented Generation (RAG) techniques and comprehend how they enhance text generation tasks.
  • Demonstrate the ability to build a text generative application incorporating classification, summarization, text generation, and a user-friendly graphical user interface (GUI) for seamless interaction.
  • Master the technology stack required for prototyping RAG development, including Transformers, Vector-store databases (e.g., FAISS), Python programming language, LangChain, and Streamlit framework.

Français

  • Comprendre les fondamentaux du traitement du langage naturel (NLP) et son importance dans diverses applications, particulièrement dans la gĂ©nĂ©ration de texte.
  • Se familiariser avec les techniques de gĂ©nĂ©ration augmentĂ©e par rĂ©cupĂ©ration (RAG) et comprendre comment elles amĂ©liorent les tâches de gĂ©nĂ©ration de texte.
  • DĂ©montrer la capacitĂ© Ă  construire une application de gĂ©nĂ©ration de texte incorporant la classification, la rĂ©sumĂ©, la gĂ©nĂ©ration de texte, et une interface graphique utilisateur (GUI) conviviale pour une interaction fluide.
  • MaĂ®triser la pile technologique requise pour le prototypage du dĂ©veloppement RAG, incluant les Transformers, les bases de donnĂ©es de vecteurs (par exemple, FAISS), le langage de programmation Python, LangChain, et le framework Streamlit.

What is Transformer?

flowchart TD
    A(INPUT) -->|Tokenized & Embedded| B
    B -->|N=6 Layers| C[Encoder Stack]
    C -->|Positional Encoding| D
    D -->|Multi-Head Self-Attention| E
    E -->|Add & Norm| F
    F -->|Feed Forward| G
    G -->|Add & Norm| H[Encoder Output]
    H -->|Passed to Decoder| I[Decoder Stack]
    I -->|Positional Encoding| J
    J -->|Multi-Head Self-Attention| K
    K -->|Add & Norm| L
    L -->|Multi-Head Attention over Encoder Output| M
    M -->|Add & Norm| N
    N -->|Feed Forward| O
    O -->|Add & Norm| P[Decoder Output]
    P --> Q[Linear]
    Q --> R[Softmax]
    R --> S(OUTPUT)

    subgraph ENCODER [Encoder]
    B --> C
    end

    subgraph DECODER [Decoder]
    I --> P
    end

    style ENCODER fill:#f9f,stroke:#333,stroke-width:2px
    style DECODER fill:#bbf,stroke:#333,stroke-width:2px

English

The Transformer is good at understanding prompts. The transformer architecture is made up of different components introduced in the original paper "Attention Is All You Need" by Vaswani et al. The components include:

  • Stack of Identical Layers: The encoder consists of a stack of N = 6 identical layers. Each layer performs a series of operations on the input data.
  • Sub-Layers: Each layer in the encoder has two sub-layers:

    • Multi-Head Self-Attention Mechanism: The first sub-layer applies a multi-head self-attention mechanism to the input data. This mechanism allows the model to weigh the importance of different words in the input sequence when encoding each word's representation.
    • Feed-Forward Network: The second sub-layer is a simple, position-wise fully connected feed-forward network. It applies a linear transformation followed by a non-linear activation function (typically ReLU) independently to each position in the sequence.
  • Residual Connections: A residual connection, also known as a skip connection, is employed around each of the two sub-layers. This means that the input to each sub-layer is added to its output before passing through the layer normalization step. This helps in mitigating the vanishing gradient problem during training and facilitates the flow of information through the network.
  • Layer Normalization: After the residual connection, layer normalization is applied. Layer normalization normalizes the activations of each layer across the feature dimension, helping in stabilizing the training process.
  • Dimensionality: To facilitate the residual connections, all sub-layers in the model, as well as the embedding layers, produce outputs of dimension d_model = 512. This means that the output dimensionality of each sub-layer and the embedding layers is 512, which is a hyperparameter of the model.

Decoder: The decoder is also composed of a stack of N = 6 identical layers. In addition to the two sub-layers in each encoder layer, the decoder inserts a third sub-layer, which performs multi-head attention over the output of the encoder stack. Similar to the encoder, we employ residual connections around each of the sub-layers, followed by layer normalization. We also modify the self-attention sub-layer in the decoder stack to prevent positions from attending to subsequent positions. This masking, combined with fact that the output embeddings are offset by one position, ensures that the predictions for position i can depend only on the known outputs at positions less than i.

Français

Le Transformateur est doué pour comprendre les instructions. L'architecture du transformateur se compose de différents composants introduits dans l'article original "L'attention, c'est tout ce dont vous avez besoin" par Vaswani et al. Les composants incluent :

  • Pile de couches identiques : L'encodeur est constituĂ© d'une pile de N = 6 couches identiques. Chaque couche effectue une sĂ©rie d'opĂ©rations sur les donnĂ©es d'entrĂ©e.
  • Sous-couches : Chaque couche de l'encodeur a deux sous-couches :

    • MĂ©canisme d'auto-attention multi-tĂŞtes : La première sous-couche applique un mĂ©canisme d'auto-attention multi-tĂŞtes aux donnĂ©es d'entrĂ©e. Ce mĂ©canisme permet au modèle de peser l'importance des diffĂ©rents mots dans la sĂ©quence d'entrĂ©e lors de l'encodage de la reprĂ©sentation de chaque mot.
    • RĂ©seau de neurones feed-forward : La deuxième sous-couche est un rĂ©seau de neurones feed-forward entièrement connectĂ© et positionnel. Il applique une transformation linĂ©aire suivie d'une fonction d'activation non linĂ©aire (typiquement ReLU) indĂ©pendamment Ă  chaque position dans la sĂ©quence.
  • Connexions rĂ©siduelles : Une connexion rĂ©siduelle, Ă©galement connue sous le nom de connexion de saut, est employĂ©e autour de chacune des deux sous-couches. Cela signifie que l'entrĂ©e de chaque sous-couche est ajoutĂ©e Ă  sa sortie avant de passer par l'Ă©tape de normalisation de couche. Cela aide Ă  attĂ©nuer le problème de disparition de gradient pendant l'entraĂ®nement et facilite le flux d'informations Ă  travers le rĂ©seau.
  • Normalisation de couche : Après la connexion rĂ©siduelle, une normalisation de couche est appliquĂ©e. La normalisation de couche normalise les activations de chaque couche Ă  travers la dimension des caractĂ©ristiques, aidant Ă  stabiliser le processus d'entraĂ®nement.
  • DimensionnalitĂ© : Pour faciliter les connexions rĂ©siduelles, toutes les sous-couches du modèle, ainsi que les couches d'embedding, produisent des sorties de dimension d_model = 512. Cela signifie que la dimensionnalitĂ© de sortie de chaque sous-couche et des couches d'embedding est de 512, qui est un hyperparamètre du modèle.

Décodeur : Le décodeur est également composé d'une pile de N = 6 couches identiques. En plus des deux sous-couches dans chaque couche d'encodeur, le décodeur insère une troisième sous-couche, qui effectue une attention multi-têtes sur la sortie de la pile d'encodeur. De manière similaire à l'encodeur, nous employons des connexions résiduelles autour de chacune des sous-couches, suivies par une normalisation de couche. Nous modifions également la sous-couche d'auto-attention dans la pile de décodeur pour empêcher les positions d'assister aux positions ultérieures. Ce masquage, combiné au fait que les embeddings de sortie sont décalés d'une position, assure que les prédictions pour la position i peuvent dépendre uniquement des sorties connues aux positions inférieures à i.

flowchart TB
    subgraph encoder [Encoder]
        direction TB
        enc_input(Input Embedding) --> enc_pos(Positional Encoding)
        enc_pos --> enc_Nx1[Multi-Head Attention]
        enc_Nx1 --> enc_addnorm1[Add & Norm]
        enc_addnorm1 --> enc_ff1[Feed Forward]
        enc_ff1 --> enc_addnorm2[Add & Norm]
        enc_addnorm2 -.-> enc_Nx2[Multi-Head Attention]
        enc_Nx2 -.-> enc_addnorm3[Add & Norm]
        enc_addnorm3 -.-> enc_ff2[Feed Forward]
        enc_ff2 -.-> enc_addnorm4[Add & Norm]
        enc_addnorm4 -.-> enc_NxN[...]
        enc_NxN -.-> enc_output[Encoder Output]
    end

    subgraph decoder [Decoder]
        direction TB
        dec_input(Output Embedding) --> dec_pos(Positional Encoding)
        dec_pos --> dec_Nx1[Masked Multi-Head Attention]
        dec_Nx1 --> dec_addnorm1[Add & Norm]
        dec_addnorm1 --> dec_ff1[Feed Forward]
        dec_ff1 --> dec_addnorm2[Add & Norm]
        dec_addnorm2 -.-> dec_Nx2[Masked Multi-Head Attention]
        dec_Nx2 -.-> dec_addnorm3[Add & Norm]
        dec_addnorm3 -.-> dec_ff2[Feed Forward]
        dec_ff2 -.-> dec_addnorm4[Add & Norm]
        dec_addnorm4 -.-> dec_NxN[...]
        dec_NxN -.-> dec_output[Decoder Output]
    end

    enc_output --> dec_input
    dec_output --> lin[Linear]
    lin --> softmax[Softmax]
    softmax --> out(Output Probabilities)

    %% Styling
    classDef addnorm fill:#FFDD6B,stroke:#333,stroke-width:2px;
    class enc_addnorm1,enc_addnorm2,enc_addnorm3,enc_addnorm4,dec_addnorm1,dec_addnorm2,dec_addnorm3,dec_addnorm4 addnorm;
    classDef feedforward fill:#6BCB77,stroke:#333,stroke-width:2px;
    class enc_ff1,enc_ff2,dec_ff1,dec_ff2 feedforward;
    classDef attention fill:#4D96FF,stroke:#333,stroke-width:2px;
    class enc_Nx1,dec_Nx1,dec_Nx2 attention;
    classDef embedding fill:#FFAFCC,stroke:#333,stroke-width:2px;
    class enc_input,dec_input embedding;
    classDef softmaxlinear fill:#DB6E6E,stroke:#333,stroke-width:2px;
    class lin,softmax softmaxlinear;
    classDef output fill:#FFFFFF,stroke:#333,stroke-width:2px;
    class out output;

Self-Attention Mechanism

English

  • Imagine you're reading a sentence, and you want to understand the meaning of each word in relation to the entire sentence. Self-attention allows the model to focus on different parts of the input sequence when processing each word, similar to how you might pay attention to different words as you read.

Français

  • Imaginez que vous lisiez une phrase et que vous vouliez comprendre la signification de chaque mot par rapport Ă  la phrase entière. L'auto-attention permet au modèle de se concentrer sur diffĂ©rentes parties de la sĂ©quence d'entrĂ©e lors du traitement de chaque mot, un peu comme vous pourriez faire attention Ă  diffĂ©rents mots en lisant.

Encoder-Decoder

English

  • Transformers typically consist of two main parts: an encoder and a decoder. The encoder processes the input data, such as a sentence in one language, while the decoder generates the output, such as the translated sentence in another language.

Français

  • Les transformateurs sont gĂ©nĂ©ralement composĂ©s de deux parties principales : un encodeur et un dĂ©codeur. L'encodeur traite les donnĂ©es d'entrĂ©e, comme une phrase dans une langue, tandis que le dĂ©codeur gĂ©nère la sortie, comme la phrase traduite dans une autre langue.

Multi-head Attention

English

  • This component allows the model to jointly attend to information from different representation subspaces at different positions. It's like having multiple experts looking at different aspects of the input data and combining their insights to make a more informed decision.

Français

  • Ce composant permet au modèle de prĂŞter attention conjointement Ă  des informations provenant de diffĂ©rents sous-espaces de reprĂ©sentation Ă  diffĂ©rentes positions. C'est comme si on avait plusieurs experts qui regardent diffĂ©rents aspects des donnĂ©es d'entrĂ©e et combinent leurs aperçus pour prendre une dĂ©cision plus Ă©clairĂ©e.

Positional encoding

English

  • Unlike traditional recurrent neural networks (RNNs), which inherently understand the order of input sequences, transformers don't have this built-in understanding. Positional encoding is a way to inject information about the position of each word into the model, helping it understand the sequential nature of the data.

Français

  • Contrairement aux rĂ©seaux neuronaux rĂ©currents traditionnels (RNNs), qui comprennent intrinsèquement l'ordre des sĂ©quences d'entrĂ©e, les transformateurs n'ont pas cette comprĂ©hension intĂ©grĂ©e. L'encodage positionnel est une façon d'injecter des informations sur la position de chaque mot dans le modèle, l'aidant Ă  comprendre la nature sĂ©quentielle des donnĂ©es.

Feedforward Neural Network

English

  • After processing the input sequence with self-attention mechanisms, transformers typically use feedforward neural networks to further transform the representations of the input data before passing them to the next layer.
  • Pros:

    • Achieves Parallelization
    • Long reaching meanings

Français

  • Après avoir traitĂ© la sĂ©quence d'entrĂ©e avec des mĂ©canismes d'auto-attention, les transformateurs utilisent gĂ©nĂ©ralement des rĂ©seaux neuronaux avance rapide pour transformer davantage les reprĂ©sentations des donnĂ©es d'entrĂ©e avant de les passer Ă  la couche suivante.
  • Avantages :

    • Permet la parallĂ©lisation
    • ComprĂ©hension de sens Ă  longue portĂ©e

Tokenizer

English

  • A tokenizer is a fundamental component in natural language processing (NLP) that breaks down text into smaller units, typically words or subwords, called tokens. These tokens serve as the basic building blocks for further analysis by NLP models.
  • Word Tokenizers: These tokenize text by splitting it into individual words based on spaces or punctuation marks.
  • Subword Tokenizer: Subword tokenization breaks down words into smaller meaningful units, such as prefixes, suffixes, or roots.
  • Character Tokenizers: Character-level tokenization breaks text down into individual characters. This approach is useful when dealing with languages with complex morphology or when handling tasks like text generation, where character-level representations may be more appropriate.

Companies developing foundation models:

  • OpenAI, Google, Meta, Microsoft, Amazon, IBM etc

Models:

Use Cases:

  • Semantic-Analysis
  • Translation
  • Summarization
  • ChatBot

Français

  • Un tokeniseur est un composant fondamental dans le traitement du langage naturel (NLP) qui dĂ©compose le texte en unitĂ©s plus petites, typiquement des mots ou des sous-mots, appelĂ©s tokens. Ces tokens servent de blocs de construction de base pour l'analyse ultĂ©rieure par les modèles de NLP.
  • Tokeniseurs de mots : Ces tokeniseurs dĂ©composent le texte en mots individuels en se basant sur les espaces ou les signes de ponctuation.
  • Tokeniseur de sous-mots : La tokenisation de sous-mots dĂ©compose les mots en unitĂ©s signifiantes plus petites, telles que les prĂ©fixes, les suffixes ou les racines.
  • Tokeniseurs de caractères : La tokenisation au niveau des caractères dĂ©compose le texte en caractères individuels. Cette approche est utile lorsqu'on traite des langues Ă  morphologie complexe ou lorsqu'on gère des tâches comme la gĂ©nĂ©ration de texte, oĂą les reprĂ©sentations au niveau des caractères peuvent ĂŞtre plus appropriĂ©es.

Entreprises développant des modèles de fondation :

  • OpenAI, Google, Meta, Microsoft, Amazon, IBM etc

Modèles :

Cas d'utilisation :

  • Analyse sĂ©mantique
  • Traduction
  • RĂ©sumĂ©
  • ChatBot

Demo

  • NLP - Classification / Translation / Summarization
  • Code (NLP/app.py):
import streamlit as st
from transformers import pipeline
from transformers import AutoTokenizer, T5Tokenizer
from transformers import T5ForConditionalGeneration

## Sentiment-Analysis/Classification
classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli")

## Translation from English to German
model_name = "google/flan-t5-large"
flan_tokenizer = T5Tokenizer.from_pretrained(model_name)
flan_model = T5ForConditionalGeneration.from_pretrained(model_name)

## Summarization
bart_model_name = "facebook/bart-large-cnn"
summarizer = pipeline("summarization", model=bart_model_name)


# Function to classify sequence
def classify_text(sequence_to_classify, candidate_labels):
    results = classifier(sequence_to_classify, candidate_labels)
    max_value, max_index = max(
        (value, index) for index, value in enumerate(results["scores"])
    )
    st.write(((results["labels"])[max_index]).upper())


# Function to Translate text
def generate_text(prompt_text):
    text_embeddings = flan_tokenizer(
        "Translate text from English to German: " + prompt_text, return_tensors="pt"
    ).input_ids
    model_output = flan_model.generate(text_embeddings, max_new_tokens=50)
    # Decode and print response
    del_response = flan_tokenizer.decode(model_output[0], skip_special_tokens=True)
    st.write(del_response)


# Function to summarize text
def summarize_text(prompt_text):
    st.write(
        summarizer(prompt_text, max_length=130, min_length=30, do_sample=False)[0][
            "summary_text"
        ]
    )


## add in casual language modeling include prompt engineering + finetuning


# Function to start chatbot
def start_chatbot(prompt_text):
    pass
    st.write(" ")


if __name__ == "__main__":
    st.title("Generative AI Use Cases")
    prompt_text = st.text_input("Translate English to German:", value=" ")
    if prompt_text != " ":
        generate_text(prompt_text)

    seq2classify = st.text_input("Sequence to classify", value=" ")
    if seq2classify != " ":
        candidate_labels = ["POSITIVE", "NEUTRAL", "NEGATIVE"]
        classify_text(seq2classify, candidate_labels)

    prompt_text_sum = st.text_input("Enter text to summarize:", value=" ")
    if prompt_text_sum != " ":
        summarize_text(prompt_text_sum)

Retrieval Augmented Generation (RAG Development)

English

What is RAG?

Introduction to Retrieval Augmented Generation (RAG)
  • Retrieval Augmented Generation (RAG) is an approach that combines traditional text generation techniques with retrieval-based methods to improve the quality and relevance of generated responses in conversational AI systems.
  • In traditional generative models like GPT, responses are generated solely based on the input query or context. However, in RAG, the model also retrieves relevant documents or passages from a database and incorporates them into the generation process.
Key Concepts
  • Retrieval Models: These models are responsible for retrieving relevant documents or passages from a database based on the input query.
  • Generation Models: These models generate responses by incorporating information from both the input query and the retrieved documents.
  • Semantic Search: RAG relies on semantic search techniques to retrieve documents that are semantically similar to the input query, rather than relying solely on keyword matching.
Benefits
  • RAG improves the relevance and coherence of generated responses by incorporating external knowledge from retrieved documents.
  • It allows the chatbot to provide more informative and contextually relevant responses, enhancing the overall user experience.
Applications
  • RAG is widely used in conversational AI systems, chatbots, question answering systems, and information retrieval applications.
  • It can be applied in various domains such as customer support, healthcare, education, and e-commerce to provide personalized and accurate responses to user queries.

Français

Qu'est-ce que RAG ?

Introduction à la génération augmentée par récupération (RAG)
  • La gĂ©nĂ©ration augmentĂ©e par rĂ©cupĂ©ration (RAG) est une approche qui combine les techniques traditionnelles de gĂ©nĂ©ration de texte avec des mĂ©thodes basĂ©es sur la rĂ©cupĂ©ration pour amĂ©liorer la qualitĂ© et la pertinence des rĂ©ponses gĂ©nĂ©rĂ©es dans les systèmes de conversation AI.
  • Dans les modèles gĂ©nĂ©ratifs traditionnels comme GPT, les rĂ©ponses sont gĂ©nĂ©rĂ©es uniquement sur la base de la requĂŞte d'entrĂ©e ou du contexte. Cependant, dans RAG, le modèle rĂ©cupère Ă©galement des documents ou des passages pertinents d'une base de donnĂ©es et les intègre dans le processus de gĂ©nĂ©ration.
Concepts clés
  • Modèles de rĂ©cupĂ©ration : Ces modèles sont responsables de la rĂ©cupĂ©ration de documents ou passages pertinents d'une base de donnĂ©es sur la base de la requĂŞte d'entrĂ©e.
  • Modèles de gĂ©nĂ©ration : Ces modèles gĂ©nèrent des rĂ©ponses en incorporant des informations provenant Ă  la fois de la requĂŞte d'entrĂ©e et des documents rĂ©cupĂ©rĂ©s.
  • Recherche sĂ©mantique : RAG s'appuie sur des techniques de recherche sĂ©mantique pour rĂ©cupĂ©rer des documents qui sont sĂ©mantiquement similaires Ă  la requĂŞte d'entrĂ©e, plutĂ´t que de se baser uniquement sur une correspondance de mots-clĂ©s.
Avantages
  • RAG amĂ©liore la pertinence et la cohĂ©rence des rĂ©ponses gĂ©nĂ©rĂ©es en incorporant des connaissances externes provenant de documents rĂ©cupĂ©rĂ©s.
  • Cela permet au chatbot de fournir des rĂ©ponses plus informatives et contextuellement pertinentes, amĂ©liorant ainsi l'expĂ©rience utilisateur globale.
Applications
  • RAG est largement utilisĂ© dans les systèmes de conversation AI, les chatbots, les systèmes de rĂ©ponse aux questions et les applications de rĂ©cupĂ©ration d'informations.
  • Il peut ĂŞtre appliquĂ© dans divers domaines tels que le support client, les soins de santĂ©, l'Ă©ducation et le commerce Ă©lectronique pour fournir des rĂ©ponses personnalisĂ©es et prĂ©cises aux requĂŞtes des utilisateurs.

Overview of LangChain and its Components:

English

LangChain
  • LangChain is a framework that facilitates the integration of retrieval models with language models for retrieval augmented generation tasks.
  • It provides a unified interface for building chatbots and conversational AI systems with enhanced response generation capabilities.
Components
  • Natural Language Processing (NLP) Pipeline: LangChain incorporates a comprehensive NLP pipeline for tasks such as tokenization, embedding generation, and semantic similarity calculation.
  • Retrieval Models Integration: LangChain seamlessly integrates retrieval models, allowing the system to retrieve relevant documents or passages based on the input query.

    • Dense Retrieval Retriever-Reader (DRQA): This model retrieves relevant documents from a large corpus using dense vector representations and then uses a reader model to extract relevant information from these documents to generate responses.
    • Neural Generative Conversational Model with Retrieval Mechanism: This model first retrieves relevant context or responses from a large database of previous conversations using information retrieval techniques and then generates responses based on both the retrieved context and the current input.
    • Dual Encoder with Retrieval-Augmented Generation (DIALOGPT): This architecture uses a dual encoder to encode both the input query and the retrieved context, then generates a response based on this combined representation. It can be fine-tuned on conversational data to generate more contextually relevant responses.
    • Sequential Retrieval Model (SeqRM): This model sequentially retrieves relevant passages from a knowledge base and incorporates them into the generation process. At each step of generation, it retrieves the most relevant passage based on the current context and generates the next token accordingly.
    • BERT for Retriever-Reader (BRR): This model employs BERT-based retriever and reader components. The retriever selects relevant passages from a large corpus, and the reader extracts relevant information from these passages to generate responses.
  • Language Models Integration: It also integrates language models for response generation, enabling the system to generate coherent and contextually relevant responses by incorporating information from both the input query and retrieved documents.
  • Vector Database Interface: LangChain provides an interface for interacting with vector databases, allowing users to efficiently store and retrieve document embeddings for semantic search.

    • Milvus: Milvus is an open-source vector database designed for managing and serving vector embeddings at scale. It supports a variety of similarity search algorithms and provides efficient indexing and querying capabilities.
    • Faiss: Developed by Facebook AI Research (FAIR), Faiss is a widely-used library for efficient similarity search and clustering of dense vectors. It is optimized for high-dimensional vectors and offers GPU-accelerated indexing and querying.
    • Annoy: Annoy (Approximate Nearest Neighbors Oh Yeah) is a C++ library with Python bindings for approximate nearest neighbor search. It is designed for large-scale similarity search tasks and supports both CPU and GPU implementations.
    • Pinecone: Pinecone is a managed vector database service that provides real-time similarity search and recommendation capabilities. It offers a serverless architecture, automatic scaling, and integration with popular machine learning frameworks.
    • Elasticsearch with Vector Plugin: Elasticsearch is a distributed search and analytics engine that can be extended with plugins to support vector data. The Elasticsearch Vector Plugin allows indexing and querying of vector embeddings, enabling similarity search within Elasticsearch.
    • HNSW (Hierarchical Navigable Small World): While not a standalone database, HNSW is a data structure and algorithm commonly used for approximate nearest neighbor search. It can be integrated into existing databases or search engines to enable efficient similarity search.
Usage
  • LangChain can be used to build chatbots, question answering systems, and information retrieval applications that leverage both generative and retrieval-based techniques for response generation.
  • It provides flexibility and extensibility, allowing developers to customize and fine-tune the system according to specific use cases and requirements.

Français

LangChain
  • LangChain est un cadre qui facilite l'intĂ©gration de modèles de rĂ©cupĂ©ration avec des modèles de langage pour des tâches de gĂ©nĂ©ration augmentĂ©e par rĂ©cupĂ©ration.
  • Il fournit une interface unifiĂ©e pour la construction de chatbots et de systèmes de conversation AI avec des capacitĂ©s amĂ©liorĂ©es de gĂ©nĂ©ration de rĂ©ponses.
Composants
  • Pipeline de Traitement du Langage Naturel (NLP) : LangChain intègre un pipeline NLP complet pour des tâches telles que la tokenisation, la gĂ©nĂ©ration d'embedding et le calcul de similaritĂ© sĂ©mantique.
  • IntĂ©gration de Modèles de RĂ©cupĂ©ration : LangChain intègre de manière transparente des modèles de rĂ©cupĂ©ration, permettant au système de rĂ©cupĂ©rer des documents ou des passages pertinents en fonction de la requĂŞte d'entrĂ©e.

    • Retriever-Reader de RĂ©cupĂ©ration Dense (DRQA) : Ce modèle rĂ©cupère des documents pertinents d'un large corpus en utilisant des reprĂ©sentations vectorielles denses puis utilise un modèle lecteur pour extraire des informations pertinentes de ces documents afin de gĂ©nĂ©rer des rĂ©ponses.
    • Modèle Conversationnel GĂ©nĂ©ratif Neuronal avec MĂ©canisme de RĂ©cupĂ©ration : Ce modèle rĂ©cupère d'abord le contexte ou les rĂ©ponses pertinents d'une grande base de donnĂ©es de conversations antĂ©rieures en utilisant des techniques de rĂ©cupĂ©ration d'informations puis gĂ©nère des rĂ©ponses basĂ©es Ă  la fois sur le contexte rĂ©cupĂ©rĂ© et l'entrĂ©e actuelle.
    • Encodeur Dual avec GĂ©nĂ©ration AugmentĂ©e par RĂ©cupĂ©ration (DIALOGPT) : Cette architecture utilise un encodeur dual pour encoder Ă  la fois la requĂŞte d'entrĂ©e et le contexte rĂ©cupĂ©rĂ©, puis gĂ©nère une rĂ©ponse basĂ©e sur cette reprĂ©sentation combinĂ©e. Il peut ĂŞtre ajustĂ© sur des donnĂ©es conversationnelles pour gĂ©nĂ©rer des rĂ©ponses plus contextuellement pertinentes.
    • Modèle de RĂ©cupĂ©ration SĂ©quentielle (SeqRM) : Ce modèle rĂ©cupère sĂ©quentiellement des passages pertinents d'une base de connaissances et les intègre dans le processus de gĂ©nĂ©ration. Ă€ chaque Ă©tape de la gĂ©nĂ©ration, il rĂ©cupère le passage le plus pertinent en fonction du contexte actuel et gĂ©nère le jeton suivant en consĂ©quence.
    • BERT pour Retriever-Reader (BRR) : Ce modèle emploie des composants retriever et reader basĂ©s sur BERT. Le retriever sĂ©lectionne des passages pertinents d'un large corpus, et le reader extrait des informations pertinentes de ces passages pour gĂ©nĂ©rer des rĂ©ponses.
  • IntĂ©gration de Modèles de Langage : Il intègre Ă©galement des modèles de langage pour la gĂ©nĂ©ration de rĂ©ponses, permettant au système de gĂ©nĂ©rer des rĂ©ponses cohĂ©rentes et contextuellement pertinentes en incorporant des informations Ă  la fois de la requĂŞte d'entrĂ©e et des documents rĂ©cupĂ©rĂ©s.
  • Interface de Base de DonnĂ©es Vectorielle : LangChain fournit une interface pour interagir avec les bases de donnĂ©es vectorielles, permettant aux utilisateurs de stocker et de rĂ©cupĂ©rer efficacement des embeddings de documents pour la recherche sĂ©mantique.

    • Milvus : Milvus est une base de donnĂ©es vectorielle open-source conçue pour gĂ©rer et servir des embeddings vectoriels Ă  grande Ă©chelle. Elle prend en charge une variĂ©tĂ© d'algorithmes de recherche de similaritĂ© et offre des capacitĂ©s efficaces d'indexation et de requĂŞte.
    • Faiss : DĂ©veloppĂ© par Facebook AI Research (FAIR), Faiss est une bibliothèque largement utilisĂ©e pour la recherche de similaritĂ© et le clustering de vecteurs denses efficaces. Elle est optimisĂ©e pour les vecteurs de haute dimension et offre des capacitĂ©s d'indexation et de requĂŞte accĂ©lĂ©rĂ©es par GPU.
    • Annoy : Annoy (Approximate Nearest Neighbors Oh Yeah) est une bibliothèque C++ avec des liaisons Python pour la recherche approximative des plus proches voisins. Elle est conçue pour les tâches de recherche de similaritĂ© Ă  grande Ă©chelle et prend en charge les implĂ©mentations CPU et GPU.
    • Pinecone : Pinecone est un service de base de donnĂ©es vectorielle gĂ©rĂ© qui fournit des capacitĂ©s de recherche de similaritĂ© et de recommandation en temps rĂ©el. Il offre une architecture sans serveur, une mise Ă  l'Ă©chelle automatique et une intĂ©gration avec des cadres d'apprentissage automatique populaires.
    • Elasticsearch avec Plugin Vectoriel : Elasticsearch est un moteur de recherche et d'analyse distribuĂ© qui peut ĂŞtre Ă©tendu avec des plugins pour supporter les donnĂ©es vectorielles. Le Plugin Vectoriel Elasticsearch permet l'indexation et la requĂŞte d'embeddings vectoriels, activant la recherche de similaritĂ© au sein d'Elasticsearch.
    • HNSW (Hierarchical Navigable Small World) : Bien qu'il ne soit pas une base de donnĂ©es autonome, HNSW est une structure de donnĂ©es et un algorithme couramment utilisĂ© pour la recherche approximative des plus proches voisins. Il peut ĂŞtre intĂ©grĂ© dans des bases de donnĂ©es ou des moteurs de recherche existants pour permettre une recherche de similaritĂ© efficace.
Utilisation
  • LangChain peut ĂŞtre utilisĂ© pour construire des chatbots, des systèmes de rĂ©ponse aux questions et des applications de rĂ©cupĂ©ration d'informations qui tirent parti des techniques gĂ©nĂ©ratives et basĂ©es sur la rĂ©cupĂ©ration pour la gĂ©nĂ©ration de rĂ©ponses.
  • Il offre de la flexibilitĂ© et de l'extensibilitĂ©, permettant aux dĂ©veloppeurs de personnaliser et d'ajuster le système selon des cas d'utilisation et des exigences spĂ©cifiques.

Explanation of the Architecture Document

English

Demo - We are going to explore LLM implementation
  • Demo - We are going to explore LLM implementation
  • Context prompt + LLM
  • Multi-sources Context prompt + LLM

Français

Démo - Nous allons explorer la mise en œuvre de LLM
  • DĂ©mo - Nous allons explorer la mise en Ĺ“uvre de LLM
  • Contexte d'invite + LLM
  • Contexte d'invite multi-sources + LLM

Code (RAG_Development/rag_demo.py) :

# !pip install -q torch transformers accelerate bitsandbytes transformers sentence-transformers faiss-cpu pypdf streamlit langchain==0.1.6 langchain-community==0.0.19 langchain-core==0.1.23
# !pip install -q torch transformers
# !pip install -q transformers sentence-transformers
# !pip install -q faiss-cpu pypdf streamlit
# !pip install -q langchain==0.1.6 langchain-community==0.0.19 langchain-core==0.1.23

import locale  # In Google Colab, use UTF-8 locale to install LangChain
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from transformers import pipeline
from langchain_community.llms import HuggingFacePipeline
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import LLMChain
from langchain.schema.runnable import RunnablePassthrough
import streamlit as st

locale.getpreferredencoding = lambda: "UTF-8"

# Constants
PDF_FILE_PATH = "test_pdf.pdf"  # Update with your file path
CHUNK_SIZE = 500
CHUNK_OVERLAP = 100
OLLAMA_MODEL_NAME = "mistral"

loader = PyPDFLoader(PDF_FILE_PATH)
pages = loader.load_and_split()

print(f"Pages from the loader: {pages[0]} \n\n")

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=CHUNK_SIZE, chunk_overlap=CHUNK_OVERLAP
)
doc_splits = text_splitter.split_documents(pages)

print(f"Pages from the loader: {doc_splits} \n\n")

db = FAISS.from_documents(
    doc_splits, HuggingFaceEmbeddings(model_name="BAAI/bge-base-en-v1.5")
)
retriever = db.as_retriever(search_type="similarity", search_kwargs={"k": 4})

## Summarization
bart_model_name = "facebook/bart-large-cnn"
summarizer = pipeline("summarization", model=bart_model_name)

llm = HuggingFacePipeline(pipeline=summarizer)

prompt = ChatPromptTemplate.from_messages(
    [("system", "Summarize the story about Daisy:\n\n{context}")]
)

llm_chain = LLMChain(llm=llm, prompt=prompt)

"""**Combine the LLM + Retriever to create the RAG**"""
# retriever = db.as_retriever()
rag_chain = {"context": retriever, "question": RunnablePassthrough()} | llm_chain

# question = "Tell a story about a girl in the country side"

# print(llm_chain.invoke({"context": "", "question": question}))
# print('\n\n\n')
# print(rag_chain.invoke(question))

if __name__ == "__main__":
    st.title("Summarization with RAG Development")
    question = st.text_input("Summarize tex:", value=" ")
    if question != " ":
        st.title("Summarization - LLM Chain with no context")
        st.write(llm_chain.invoke({"context": "", "question": question})["text"])

    if question != " ":
        st.title("Summarization with RAG")
        st.write(rag_chain.invoke(question)["text"])

Resources