Playback speed
×
Share post
Share post at current time
0:00
/
0:00

Today we start something new! We start a series of videos on Langchain. I wanted to create more actionable content with more continuity in the long term to make sure people can learn and utilize that learning in their job. My goal is that this content on Langchain will help people apply those concepts to build great Large Language Model applications. This is the first video of many, and we cover some of the LangChain basics. Let me know if you like it!


What is LangChain

When you have a typical large language model, the way to interact with it is to ask a question and you get an answer. But it's pretty isolated from the rest of the world. You cannot really do much more than that.

So, if you want to build applications, you may want to connect your large language model to data. You may want to give it access to tools. You may want to give it memory access. And you may want to automate the process of prompt engineering. LangChain allows you to connect all those different aspects to build software applications.

LangChain basics

So let's demonstrate some capabilities of LangChain. Let's pip install it along the OpenAI python package:

! pip install langchain openai

We set up the OpenAI API key as part of the environment variables

import os

os.environ['OPENAI_API_KEY'] = ...

LLMs

We can import the OpenAI’s GPT-3 model and ask it questions

from langchain.llms import OpenAI

llm = OpenAI()

llm.predict('How are you?')

> "\n\nI'm doing well, thank you. How about you?"

We can also import the underlying model behind ChatGPT

from langchain.chat_models import ChatOpenAI

chat_model = ChatOpenAI()

chat_model.predict('How are you?')

> "As an AI, I don't have feelings, but I'm here to help you with any questions or tasks you have. How can I assist you today?"

The problem with raw LLMs is that they don’t remember the history of the conversations

chat_model.predict('What was my previous question?')

> "I'm sorry, but I am an AI language model and I don't have access to your previous questions."

Chains

We can create a chain that is going to help us augment the LLM

from langchain.chains import ConversationChain

chain = ConversationChain(
    llm=chat_model,
    verbose=True
)

chain.run('How are you today?')

As part of the prompt, we see now that there is a bit more to my simple prompt. We have a system prompt, the history of the conversation, and the human’s question. The system prompt allows us to give the LLM more context on what needs to be done. Let’s see if it remembers:

chain.run('What was my previous question?')

Prompt templates

With LangChain, we can automate a lot of the prompt engineering and for that, we can use prompt templates. Let’s create a prompt template

from langchain.prompts import PromptTemplate

template = """
Return all the subcategories of the following category

{category}
"""

prompt = PromptTemplate(
    input_variables=['category'],
    template=template
)

‘Category’ is an input variable that will be used once we run the chain. Let’s input it into a chain. We use LLMChain, which is the simplest chain we can use

from langchain.chains import LLMChain

chain = LLMChain(
    llm=chat_model,
    prompt=prompt,
    verbose=True
)

chain.run('Machine Learning')

We can also break down the prompts into the system and human prompts. This is helpful when we build chatbots

from langchain.prompts import (
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
    ChatPromptTemplate
)

system_template = """
You are a helpful assistant who generate comma separated lists.
A user will only pass a category and you should generate subcategories of that category in a comma separated list.
ONLY return comma separated and nothing more!
"""

human_template = '{category}'

system_message = SystemMessagePromptTemplate.from_template(
    system_template
)

human_message = HumanMessagePromptTemplate.from_template(
    human_template
)

Ans we can combine the 2 prompts into one:

prompt = ChatPromptTemplate.from_messages([
    sytem_message, human_message   
])

chain = LLMChain(
    llm=chat_model,
    prompt=prompt,
    verbose=True
)


chain.run('Machine Learning')

This gives us more control of the LLM’s output, but we can go further by using an output parser.

Output parser

Let’s overwrite the base output parser and generate Python lists from the LLM’s response:

from langchain.schema import BaseOutputParser

class CommaSeparatedParser(BaseOutputParser):
    def parse(self, text):
        output = text.strip().split(',')
        output = [o.strip() for o in output]
        return output
    
chain = LLMChain(
    llm=chat_model,
    prompt=prompt,
    output_parser=CommaSeparatedParser(),
    verbose=True
)

chain.run('Machine Learning')

We can also feed the chain with multiple inputs:

input_list = [
    {'category': 'food'},
    {'category': 'country'},
    {'category': 'colors'}
]

response = chain.apply(input_list)
response[2]['text']

Simple Sequence

We can also compose chains. Here we are creating a pipeline of chains, where the output of one chain is used as input in the next one. We create 2 chains: a title chain and a synopsis to automate the process of writing a play. First, we have a title chain:

title_template = """
You are a writer. Given a subject, 
your job is to return a fun title for a play.

Subject: {subject}
Title:"""

title_chain = LLMChain.from_string(
    llm=chat_model,
    template=title_template
)

title_chain.run('Machine Learning')

> '"The Algorithmic Adventure: A Machine Learning Marvel"'

And a synopsis chain:

synopsis_template = """
You are a writer. 
Given a title, write a synopsis for a play.

Title: {title}
Synopsis:"""

synopsis_chain = LLMChain.from_string(
    llm=chat_model,
    template=synopsis_template
)

title = "The Algorithmic Adventure: A Machine Learning Marvel"

synopsis_chain.run(title)

Let’s now combine those 2 chains by passing them as a list to the simple sequential chain:

from langchain.chains import SimpleSequentialChain

chain = SimpleSequentialChain(
    chains=[title_chain, synopsis_chain],
    verbose=True
)

chain.run('Machine Learning')

Potentially an interesting play!

This concludes our introduction to LangChain basics. I hope you had some fun. We will continue our introduction to Langchain in the next video. See you there!

The AiEdge Newsletter
The AiEdge Newsletter
Authors
Damien Benveniste