top of page

Chatbot Development Using Large Language Models



In today's digital landscape, Large Language Models (LLMs) have revolutionized the world of chatbots. They offer a more natural way for users to interact with websites, applications, and customer support. Now, businesses and individuals have the power to create tailored conversational interfaces to meet their specific needs.


Understanding the Objective

Our primary aim is to develop a chatbot capable of engaging in natural conversations. We will utilize ChatGPT as our foundational model and enhance its capabilities with the assistance of LangChain. To follow along with the coding examples, ensure you have a Jupyter Notebook environment set up with both the OpenAI and LangChain libraries installed.


Getting Started with ChatGPT

To kick things off, we need to establish a connection to the ChatGPT API. Below is a Python function that initializes a chat session:

import os
import openai

openai_api_key = os.environ["OPENAI_API_KEY"]

def start_chat(prompt, model="gpt-3.5-turbo"):
  response = openai.ChatCompletion.create(
    model=model, 
    messages=[{"role": "user", "content": prompt}]
  )

  return response.choices[0].message["content"]

We've chosen the "gpt-3.5-turbo" model as it's exceptionally well-suited for chatbot applications. Once the setup is complete, you can simply use the following code snippet to initiate a conversation:

prompt = "Hello, my name is John"
response = start_chat(prompt)
print(response)

The Limitations of Isolated Messages

While this works seamlessly for single interactions, it falls short when handling continuous conversations:

prompt = "What is my name again?"
response = start_chat(prompt)
print(response)

The chatbot doesn't retain information from previous exchanges. To address this issue, we need to introduce context awareness.


Enhancing Conversations with Context History

For truly natural conversations, our chatbot must possess awareness of previous messages. The OpenAI API facilitates this by allowing us to send a conversation history as part of the input. We structure this history by assigning different roles to each message:

history = [
  {"role": "user", "content": first_message},
  {"role": "assistant", "content": response},
  {"role": "user", "content": second_message}
]

The available roles are "user," "assistant," or "system." Here's an example of a conversation history:

history = [
  {"role": "system", "content": "You are a helpful assistant"},
  {"role": "user", "content": "Hello, my name is John"},
  {"role": "assistant", "content": "Nice to meet you, John!"},
  {"role": "user", "content": "What is my name again?"}  
]

This structured approach allows the chatbot to reference prior messages for context.


Automating Contextual History Management

We can refine our chat function to handle conversation history automatically:

def chat_with_history(prompt):
  history.append({"role": "user", "content": prompt})
  
  response = start_chat(history)
  
  history.append({"role": "assistant", "content": response})

  return response

With this enhancement, our chatbot can remember and utilize conversation context effectively!


Optimizing Memory Usage with LangChain

While our chatbot is now functional, processing the entire history during each interaction can be resource-intensive. Enter LangChain, which offers optimized memory management.

To begin, we'll load the LangChain modules:

from langchain.llms import OpenAI
from langchain.memory import ConversationBufferMemory

llm = OpenAI()
memory = ConversationBufferMemory() 

Next, we'll create a ConversationChain utilizing both the LangChain LLMS and memory:

from langchain.chains import ConversationChain

chatbot = ConversationChain(llm=llm, memory=memory)

Now, we can engage in conversations as follows:

chatbot.predict("Hello, what is my name?")

For even more efficient memory usage, we can employ a memory module that summarizes information instead of storing the complete history:

from langchain.memory import ConversationSummaryBufferMemory
memory = ConversationSummaryBufferMemory(llm=llm, max_tokens=100)

This approach reduces the number of tokens processed while retaining essential context. LangChain equips us with an efficient framework for building chatbots!


In Conclusion

In this article, we've unraveled the process of creating a context-aware chatbot using ChatGPT and LangChain. Leveraging the OpenAI API and conversation history, we've empowered our chatbot to maintain meaningful dialogues. Furthermore, LangChain's memory optimization capabilities have elevated the efficiency of our bot. Feel free to customize your own chatbot, as the realm of Conversational AI continues to evolve and expand.

Dreaming of an AI-driven transformation? Engage with Codersarts AI today and let's co-create the future of tech, one prototype at a time.

3 views0 comments

Recent Posts

See All
bottom of page