Building A Model From Scratch to Generate Text From Prompts

Soumyadarshani Dash Last Updated : 29 Jul, 2024
14 min read

Introduction

In the swiftly evolving Generative AI landscape, a new era has arrived. This transformative shift brings unprecedented advancements to AI applications, with Chatbots at the forefront. These AI-powered conversational agents simulate human-like interactions, reshaping communication for businesses and individuals. The term “Gen AI Era” emphasizes advanced AI’s role in shaping the future. “Unlocked potential” signifies a transformative phase where Chatbots drive personalized experiences, efficient problem-solving, and creativity. The title hints at discovering how Chatbots, fueled by Generation AI, build a model from scratch to generate text from prompts to usher in a new era of conversations.

This article delves into the intersection of Chatbots and Gen AI to generate text from prompts, unveiling their profound implications. It explores how Chatbots enhance communication, streamline processes, and elevate user experiences. The journey unlocks Chatbots’ potential in the Gen AI era, exploring their evolution, applications, and transformative power for diverse industries. Through cutting-edge AI innovation, we uncover how Chatbots redefine interaction, work, and connection in this dynamic age of artificial intelligence.

Learning Objectives

  1. Introduction to the Gen AI Era: Set the stage by explaining the concept of Generation AI (Gen AI) and its significance in the evolving landscape of artificial intelligence.
  2. Highlight the Role of Chatbots: Emphasize the pivotal role that Chatbots play within the Gen AI paradigm, showcasing their transformative impact on communication and interaction.
  3. Explore LangChain’s Insights: Dive into the LangChain blog post, “LangChain DemoGPT: Ushering in a New Era for Generation AI Applications,” to extract key insights and revelations about integrating Chatbots and Gen AI.
  4. Predict Future Trends: Forecast the future trajectory of Chatbot technology within the Gen AI era, outlining potential trends, innovations, and possibilities that could shape the AI landscape.
  5. Provide Practical Insights: Offer practical advice and recommendations for readers interested in leveraging Chatbots in their own contexts, providing guidance on effectively navigating this technology’s integration.

This article was published as a part of the Data Science Blogathon.

A Journey from Scripted Responses to Human-Like Interactions

The landscape of conversational bots, known as chatbots, has undergone a remarkable evolution since their inception in 1966. The first chatbot, Eliza, created by Joseph Weizenbaum at MIT’s Artificial Intelligence Laboratory, marked a significant step towards seamless customer interaction. Early rule-based chatbots like Parry and A.L.I.C.E. furthered this progress by enabling organizations to respond to predefined commands in real-time, transforming customer experiences.

Texts from prompts | Generative AI

However, these early iterations faced critical limitations:

  • They lacked effective utilization of artificial intelligence, cognitive perception, and machine learning.
  • Inability to handle complex queries, plausible customer inquiries, and meaningful human conversations.
  • Reliance on rigid rule-based decision trees with no room for pre-training.
  • Inability to understand emotions and address personalized issues.

Advancements in Natural Language Processing (NLP) and Machine Learning (ML) have driven a transformative shift in the chatbot landscape, enhancing their ability to understand and respond to user inputs more effectively. Intelligent chatbots such as Microsoft Cortona, Google Assistant, Amazon Alexa, and Apple Siri have acted as catalysts, using patterns in extensive datasets to provide accurate and contextually relevant responses.

Taking this evolution further, breakthroughs like deep learning, neural networks, and Generative AI (ChatGPT) have ushered in significant improvements in chatbot capabilities. Notably, Generative AI models like ChatGPT have played a pivotal role in transforming traditional chatbots, enabling more engaging and personalized conversations by better understanding user intent, context, and language nuances.

Empowering Chatbots with Contextual Intelligence Through Generative AI

Chatbots with contextual intelligence | Generative AI | texts from prompts

Generative AI represents a revolutionary breakthrough, empowering machines to craft content that rivals human-generated material. Unlike conventional AI models governed by predefined rules, generative AI learns from extensive datasets to produce remarkably creative and understandable content. This innovation resides at the crossroads of machine learning, neural networks, and linguistic databases, allowing machines to generate text, images, music, and more that could easily be mistaken for human-created work.

In customer engagement, generative AI has emerged as a transformative force. It is pivotal in driving conversations, addressing inquiries, and tailoring personalized suggestions. Beyond scripted exchanges, generative AI-equipped chatbots can adapt to diverse scenarios and user inputs. This advantage stems from their capacity to generate contextually relevant and finely nuanced responses on the spot.

Prominently exemplified by models like the Generative Pre-trained Transformer (GPT), generative AI technology has opened up new horizons for chatbots. GPT models ingest a wide array of text data, enabling them to produce coherent and contextually fitting answers. Consequently, when users interact with a GPT-powered chatbot, they engage with a system that not only grasps words but also comprehends the underlying significance and context.

Incorporating generative AI into chatbots offers businesses a monumental transformation in customer engagement. This synergy goes beyond mere transactional interactions to cultivate meaningful conversations. These exchanges’ dynamic and adaptive nature enriches the user experience, fostering genuine connections and building loyalty.

Generative AI Chatbots: Revolutionizing Customer Engagement

Generative AI chatbots are a transformative innovation in the ever-evolving customer engagement landscape. These chatbots represent a departure from traditional rule-based systems by leveraging the power of machine learning, predictive models, and vast language databases. Their primary objective is to foster dynamic interactions that simulate human-like conversations, enabling businesses to automate tasks, enhance efficiency, and elevate customer satisfaction.

The Essence of Generative AI Chatbots

Generative AI chatbots rely on advanced algorithms to generate responses beyond static templates. Unlike rule-based chatbots, which provide predetermined answers, generative AI chatbots draw from extensive datasets to produce contextually relevant and coherent responses. This intelligence enables them to understand nuances, tones, and contexts, creating a more natural and human-like conversational flow.

Empowering Chatbots with Contextual Intelligence

Generative AI chatbots, powered by models like GPT-4, have revolutionized the chatbot landscape by bringing contextual intelligence to the forefront. These models learn patterns from diverse sources, allowing them to understand user intent and generate structured, coherent, and convincing answers to natural language queries. This shift from scripted interactions to adaptable and dynamic conversations has profound implications for customer interactions and insights.

Key Advantages of Generative AI Chatbots

  1. Adaptability: Generative AI chatbots can adapt to various conversation tones and directions, providing more engaging and personalized interactions.
  2. Creativity: They go beyond mere information retrieval, adding a creative dimension to interactions by generating unique responses.
  3. Real-time Learning: With each interaction, these chatbots refine their responses, continuously learning and improving their understanding of user needs.
  4. Enhanced User Experience: The natural conversational flow creates a seamless user experience that resonates with customers.
  5. Insights for Decision-Making: Generative AI chatbots offer valuable user preferences and behavior insights, informing strategic business decisions.

In summation, the fusion of generative AI and chatbots ushers in an evolutionary stride in customer engagement. This fusion marries cutting-edge technology with natural language understanding, ushering in efficient, empathetic interactions that resonate as genuine conversations. It harmoniously bridges the gap between human-like communication and machine-driven efficiency, presenting businesses with a novel approach to engaging and captivating their audience.

Unleashing Synergy with LangChain and DemoGPT in Action

Unleashing Synergy with LangChain and DemoGPT in Action conveys the concept of harnessing the combined strengths of LangChain and DemoGPT to create a more powerful and effective outcome. This phrase signifies a collaborative effort that capitalizes on the unique attributes of both technologies to achieve results that exceed what either could achieve individually.

Explaining the Concept

  • Synergy: Synergy refers to the idea that the combined effect of two elements is greater than the sum of their individual effects. In this context, LangChain and DemoGPT are being brought together to create a harmonious blend of their capabilities, resulting in enhanced performance and outcomes.

LangChain

  • Collaboration Platform: LangChain will likely facilitate collaboration and interaction between AI technologies.
  • Specialized Expertise: LangChain could specialize in a certain aspect of AI technology or offer unique features.
  • Contributing Factors: LangChain contributes expertise or resources to enhance the AI solution.

DemoGPT

  • Advanced AI Model: DemoGPT is an advanced AI model developed by OpenAI that generates human-like text and content based on patterns and prompts.
  • Creative Outputs: DemoGPT’s ability to generate text, images, and music adds a creative dimension to its applications.
  • Enhanced Intelligence: DemoGPT’s capabilities are leveraged to provide more intelligent and contextually relevant responses.

Achieving Greater Impact

  • By combining LangChain’s specialized expertise and DemoGPT’s advanced capabilities, the collaboration aims to achieve outcomes that surpass what either technology could achieve individually.
  • The synergy between the two technologies results in enhanced efficiency, creativity, and effectiveness in various applications.

In summary, “Unleashing Synergy with LangChain and DemoGPT in Action” signifies the strategic collaboration between LangChain and DemoGPT to harness their combined strengths and capabilities, resulting in a more impactful and innovative approach to AI-driven solutions.

Enhancing Industries with Chatbots

Chatbots are vital in transforming various industries, revolutionizing how businesses operate, and improving customer experiences. Let’s explore how chatbots are making a difference in different fields:

  • Customer Support and Engagement: Chatbots are changing the game in customer support. They’re always available to help with common questions, troubleshoot problems, and guide customers through different tasks. This means people can get help quickly and consistently.
  • Personalized E-Commerce: In online shopping, chatbots make things personal. They look at what you like, what you’ve bought before, and what you’re looking at now. Then, they suggest things you might really like. It’s like having your shopping assistant!
  • Healthcare Help: Chatbots are becoming really useful in healthcare. They can give you basic medical advice, help you book appointments, and remind you to take your medicine. They’re like a first step to getting medical help when needed.
  • Automated Finance Assistance: Banks are using chatbots to check your account balance, see what you’ve bought, and move your money around. It’s a quick and easy way to do simple banking without waiting in line or making a call.

As industries keep using chatbots, these smart helpers are making things smoother, more personal, and more efficient in all kinds of jobs.

Building an Interactive Chatbot

Creating a complete language model from scratch, including the underlying neural network architecture, training, and text generation, is complex and resource-intensive. However, I can provide a high-level overview of the steps involved if you create a basic language model from scratch without using external libraries or APIs like PyTorch or TensorFlow.

The realm of chatbots and Generative AI has witnessed remarkable success stories where businesses have seamlessly integrated these technologies to solve specific challenges and achieve substantial outcomes.

Real-world Case Studies

These real-world case studies underscore the transformative impact of AI-powered solutions across diverse industries:

  1. Elevating Customer Service with Personalization: Company A, a global e-commerce platform, implemented an AI-powered chatbot to enhance customer service. By leveraging Generative AI, the chatbot answered routine inquiries and personalized recommendations based on customer browsing history and preferences. This led to increased customer engagement, higher conversion rates, and improved overall customer satisfaction.
  2. Streamlining Financial Support: Financial Institution B adopted a chatbot integrated with Generative AI to provide complex financial assistance. The AI-powered chatbot analyzed intricate financial data, regulations, and trends to offer accurate responses. Customers received immediate assistance and insightful financial advice, resulting in faster problem resolution and enhanced trust in the institution.
  3. Revolutionizing Entertainment Interactions: Entertainment company C embraced Generative AI-powered chatbots to engage users in innovative ways. Using tools like ChatGPT and Dall-E, they generated conceptual art and backgrounds for scenarios and environments in video games. Additionally, these tools produced background music, enriching the gaming experience. This successful integration marked a significant leap in interactive entertainment and creative content generation.
  4. Enhancing Manufacturing Efficiency: Manufacturing firm D leveraged Generative AI to optimize product design and manufacturing processes. Using tools like Autodesk and Creo, they designed physical objects with minimized waste, simplicity in parts, and efficient production. Generative AI-driven designs resulted in increased materials efficiency, accelerated production, and improved overall manufacturing operations.
  5. Round-the-Clock Support for Global Customers: International e-commerce platform E introduced a chatbot powered by Generative AI to provide real-time support across different time zones. Customers received immediate assistance, driving higher customer satisfaction and enabling the business to cater to a global customer base without additional staffing costs.

Outline of the Process

Building a fully functional language model from scratch requires a deep understanding of neural networks, natural language processing, and extensive programming skills. Here’s a simplified outline of the process:

  1. Data Collection: Collect a substantial amount of text data from various sources. This can include books, articles, websites, and more.
  2. Tokenization: Preprocess the text data by tokenizing it into words or subwords. This involves splitting the text into smaller units with which the model can work.
  3. Vocabulary Creation: Build a vocabulary by creating a unique identifier (integer) for each token in the tokenized data. This vocabulary will map tokens to their corresponding integer IDs.
  4. Model Architecture: Choose a neural network architecture for your language model. A common choice is a recurrent neural network (RNN), long short-term memory (LSTM), or transformer architecture.
  5. Embedding Layer: Create an embedding layer that maps the integer IDs of tokens to dense vector representations. This helps the model learn meaningful word representations.
  6. Model Training: Initialize your chosen neural network architecture and train it using the tokenized data. This involves presenting sequences of tokens to the model and adjusting its weights through backpropagation and optimization techniques like stochastic gradient descent.
  7. Loss Function: Define a loss function that measures the difference between the model’s predictions and the actual target tokens. Common loss functions for language models include cross-entropy.
  8. Backpropagation: Compute gradients using backpropagation and update the model’s weights to minimize the loss function.
  9. Text Generation: To generate text, input a seed sequence of tokens into the trained model and use the model’s output as the basis for generating the next token. Repeat this process to generate longer sequences.
  10. Temperature and Sampling: Introduce randomness during text generation using a temperature parameter. Higher values make the output more diverse, while lower values make it more deterministic.

Build Language Model From Scratch

Building a language model from scratch is a complex endeavor that requires a deep understanding of machine learning concepts, neural networks, and natural language processing. It’s recommended to start with existing frameworks and libraries to build foundational knowledge before attempting to create a complete model from scratch.

import torch
import torch.nn as nn
import torch.nn.functional as F
from transformers import GPT2Tokenizer

class GPT2Simple(nn.Module):
    def __init__(self, vocab_size, d_model, nhead, num_layers):
        super(GPT2Simple, self).__init__()
        self.embedding = nn.Embedding(vocab_size, d_model)
        self.transformer = nn.Transformer(
            d_model=d_model, nhead=nhead, num_encoder_layers=num_layers
        )
        self.fc = nn.Linear(d_model, vocab_size)

    def forward(self, x):
        x = self.embedding(x)
        output = self.transformer(x, x)
        output = self.fc(output)
        return output

# Parameters
vocab_size = 10000  # Example vocabulary size
d_model = 256      # Model's hidden dimension
nhead = 8          # Number of attention heads
num_layers = 6     # Number of transformer layers

# Create the model
model = GPT2Simple(vocab_size, d_model, nhead, num_layers)

# Load the tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")

# Set the model in evaluation mode
model.eval()

# Check if GPU is available
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

# Define a function to generate text based on a prompt
def generate_text(prompt, max_length=50, temperature=1.0):
    with torch.no_grad():
        tokenized_prompt = torch.tensor([tokenizer.encode(prompt)])
        tokenized_prompt = tokenized_prompt.to(device)
        output = tokenized_prompt

        for _ in range(max_length):
            logits = model(output)  # Get logits for the next token
            logits = logits[:, -1, :] / temperature  # Apply temperature
            next_token = torch.multinomial(F.softmax(logits, dim=-1), num_samples=1)
            output = torch.cat((output, next_token), dim=1)

        generated_text = tokenizer.decode(output[0].tolist(), skip_special_tokens=True)
        return generated_text

# Provide a prototype or prompt
prototype = "In a land far away"

# Generate text using the prototype
generated_output = generate_text(prototype, max_length=100, temperature=0.7)

# Print the generated output
print("Generated Output:", generated_output)

# Print model summary
print("\nModel Summary:")
print("{:<20}{}".format("Layer", "Description"))
print("="*40)
for name, module in model.named_children():
    print("{:<20}{}".format(name, module))

# Print device information
if device.type == "cuda":
    gpu_name = torch.cuda.get_device_name(0)
    gpu_ram = torch.cuda.get_device_properties(0).total_memory // (1024 ** 3)
    print("\nUsing GPU:", gpu_name)
    print("Total GPU RAM:", gpu_ram, "GB")
else:
    print("\nUsing CPU")

ram_gb = torch.cuda.memory_allocated(0) / (1024 ** 3)
print("Current GPU RAM Usage:", ram_gb, "Generated Output: In a land far away continuing Donchensung updates Bill involve payment balance intos links"] presenceual Hillary Come chairman Neberadelphia minds expensive up voice� employandalF took Lew lies storage Kong Gal something suspect bare bath colors account arguments spread understand91 eat companv 2016yth transferivelyickuce processesIVesy Series yield sendingPlease frequ mur ship approxentle Roaut prov tit severe stayazz ground struck 38 stageicking maintained guaranteeclaimMr see pot godcean Bry HandTH Ab pitchhost%) danceinct typical coverediys
Generated Output: In a land far away continuing Donchensung updates Bill involve payment balance intos links"] presenceual Hillary Come chairman Neberadelphia minds expensive up voice� employandalF took Lew lies storage Kong Gal something suspect bare bath colors account arguments spread understand91 eat companv 2016yth transferivelyickuce processesIVesy Series yield sendingPlease frequ mur ship approxentle Roaut prov tit severe stayazz ground struck 38 stageicking maintained guaranteeclaimMr see pot godcean Bry HandTH Ab pitchhost%) danceinct typical coverediys
```
Generated Output: 
In a land far away continuing Donchensung updates Bill involve payment balance intos links"] presenceual Hillary Come chairman Neberadelphia minds expensive up voice� employandalF took Lew lies storage Kong Gal something suspect bare bath colors account arguments spread understand91 eat companv 2016yth transferivelyickuce processesIVesy Series yield sendingPlease frequ mur ship approxentle Roaut prov tit severe stayazz ground struck 38 stageicking maintained guaranteeclaimMr see pot godcean Bry HandTH Ab pitchhost%) danceinct typical coverediys
"

During this duration, I’ve created a simple GPT-inspired model from scratch to showcase the foundational principles of language generation. While not an exact replica of complex GPT models, this implementation provides a hands-on introduction to the essential components of generating text. This model generates coherent text based on input prompts by constructing a basic neural network architecture and incorporating elements of tokenization, embeddings, and sequence generation. It’s important to note that this demonstration emphasizes the core concepts and is not intended to replicate the sophistication of state-of-the-art language models. Through this exercise, learners can gain insight into the inner workings of language generation systems and lay a solid foundation for further exploration in natural language processing.

In the fast-evolving landscape of the 21st century, innovation remains the driving force, and technology continues to redefine our world. From AI to renewable energy, each trend holds the power to reshape industries and transform our daily lives. Let’s embark on a journey through these technological frontiers and glimpse the trends that are shaping the future:

AI: Merging Human and Machine Intelligence

  • Replicating human cognitive functions across diverse fields.
  • From self-driving cars to medical diagnoses, AI enhances efficiency and experiences.

Blockchain: Decentralizing Trust for Security

  • Beyond cryptocurrencies, blockchain ensures transparency and security.
  • Impacts sectors like supply chain management and governance.

XR: Merging Realities for Immersive Experiences

  • XR creates immersive digital environments, bridging real and virtual worlds.
  • Reshapes education, training, and interactive experiences.

Renewable Energy: Paving the Path to Sustainability

  • Solar, wind, and hydro technologies mitigate reliance on fossil fuels.
  • Promises a cleaner, greener future amid growing environmental concerns.

5G: Unveiling Seamless Connectivity

  • Lightning-fast internet speeds and minimal latency transform connectivity.
  • Enables IoT and advanced communication systems for hyperconnected lifestyles.

Biotech: Revolutionizing Health and Longevity

  • Advances in biotechnology transform healthcare and extend human life.
  • Personalized medicine, gene editing, and regenerative therapies lead the way.

Quantum Computing: Supercharging Data Processing

  • Leverages quantum mechanics for exponentially faster calculations.
  • Reshapes cryptography, drug discovery, and complex problem-solving.

IoT: Network of Connected Devices

  • IoT interconnects devices, simplifying routines and amplifying possibilities.
  • Encompasses wearable tech, smart homes, and industrial automation.

Cybersecurity: Safeguarding the Digital Realm

  • Heightened reliance on technology necessitates robust cybersecurity.
  • Protecting data and digital identities in the face of evolving threats.

Space Exploration: Beyond Earth’s Boundaries

  • Tech trends extend to space exploration, unraveling celestial mysteries.
  • Private companies and collaborations reshape humanity’s cosmic journey.

Conclusion

In conclusion, the synergy of Chatbots and Generation AI represents a transformative leap in artificial intelligence. This era combines advanced technologies to reshape communication, interaction, and business dynamics. As Chatbots evolve into sophisticated agents, they offer efficient engagement and streamlined processes. The Gen AI Era merges human-like interactions with AI efficiency, driven by rapid advancements.

Chatbots empower businesses with personalized experiences, improved problem-solving, and creative aid. This landscape positions Chatbots as transformative enablers, revolutionizing communication, decision-making, and collaboration. They weave Gen AI’s potential with practicality, ushering in innovation, connectivity, and progress. Chatbots emerge as a vital link in this AI evolution, illuminating the path forward through human-AI synergy.

Ready to embrace the future of AI? Enroll in our “Chatbots and Generative AI” course today. Learn to create sophisticated chatbots that enhance engagement and streamline processes—join us now!

Key Takeaways

  1. Generation AI (Gen AI) Era: The rise of Gen AI marks a transformative era where advanced AI technologies, including Chatbots, are shaping the future of communication and interaction.
  2. Chatbot Evolution: Chatbots have evolved beyond simple customer engagement tools to become powerful enablers of personalized experiences, efficient problem-solving, and creativity.
  3. Human-AI Synergy: Integrating human-like interactions with AI efficiency highlights the potential for AI technologies like Chatbots to bridge the gap between human intelligence and AI capabilities.
  4. Enhanced Communication: Chatbots facilitate enhanced communication by simulating natural conversations, enabling more meaningful interactions between businesses and individuals.
  5. Streamlined Processes: The Gen AI era empowers businesses with streamlined processes through Chatbot assistance, increasing efficiency in various domains.
  6. Innovation Catalyst: Chatbots are at the forefront of AI innovation, redefining how industries across the spectrum interact, work, and connect.
  7. Interconnected Future: The combined force of human and AI potential, exemplified by Chatbots, propels us into a future marked by innovation, connectivity, and limitless possibilities.

Frequently Asked Questions

Q1. What is Generation AI? How does it impact the future of technology and communication?

A. Generation AI, or Gen AI, refers to the new era of advanced AI technologies that have evolved to mimic human intelligence and behaviors. This paradigm shift is driving innovations in technology and communication, allowing AI systems to understand context, respond naturally, and learn from interactions. Gen AI’s impact is profound, enhancing personalized experiences, automating tasks, and fostering more efficient problem-solving.

Q2. How do Chatbots leverage the capabilities of Generation AI to enhance user experiences and streamline processes?

A. Chatbots leverage Gen AI by integrating sophisticated natural language processing and machine learning algorithms. This enables them to understand user intent, engage in contextually relevant conversations, and offer prompt solutions. Gen AI-powered Chatbots bring improved accuracy, quicker responses, and adaptive learning, ultimately elevating user experiences and streamlining various tasks.

Q3. What industries benefit most from integrating Chatbots and Gen AI, and what real-world applications are emerging?

A. Industries such as customer service, e-commerce, healthcare, finance, and education benefit from Chatbots powered by Gen AI. Real-world applications include personalized customer support, virtual shopping assistants, medical diagnosis, financial advice, and interactive learning tools.

Q4. How do Chatbots differentiate from traditional AI solutions, and what unique advantages do they bring to businesses and individuals?

A. Unlike traditional AI, Chatbots powered by Gen AI can engage in natural conversations, adapt to varying contexts, and learn from user interactions. This enables more human-like interactions, personalized assistance, and improved efficiency in tasks like answering queries, automating processes, and providing recommendations.

The media shown in this article is not owned by Analytics Vidhya and is used at the Author’s discretion.

I'm Soumyadarshani Dash, and I'm embarking on an exhilarating journey of exploration within the captivating realm of Data Science. As a dedicated graduate student with a Bachelor's degree in Commerce (B.Com), I have discovered my passion for the enthralling world of data-driven insights.

My dedication to continuous improvement has garnered me a 5⭐ rating on HackerRank, along with accolades from Microsoft. I've also completed courses on esteemed platforms like Great Learning and Simplilearn. As a proud recipient of a virtual internship with TATA through Forage, I'm committed to the pursuit of technical excellence.

Frequently immersed in the intricacies of complex datasets, I take pleasure in crafting algorithms and pioneering inventive solutions. I invite you to connect with me on LinkedIn as we navigate the data-driven universe together!

Responses From Readers

We use cookies essential for this site to function well. Please click to help us improve its usefulness with additional cookies. Learn about our use of cookies in our Privacy Policy & Cookies Policy.

Show details