Spaces:
Runtime error
Runtime error
# Quickstart Guide | |
This tutorial gives you a quick walkthrough about building an end-to-end language model application with LangChain. | |
## Installation | |
To get started, install LangChain with the following command: | |
```bash | |
pip install langchain | |
``` | |
## Environment Setup | |
Using LangChain will usually require integrations with one or more model providers, data stores, apis, etc. | |
For this example, we will be using OpenAI's APIs, so we will first need to install their SDK: | |
```bash | |
pip install openai | |
``` | |
We will then need to set the environment variable in the terminal. | |
```bash | |
export OPENAI_API_KEY="..." | |
``` | |
Alternatively, you could do this from inside the Jupyter notebook (or Python script): | |
```python | |
import os | |
os.environ["OPENAI_API_KEY"] = "..." | |
``` | |
## Building a Language Model Application | |
Now that we have installed LangChain and set up our environment, we can start building our language model application. | |
LangChain provides many modules that can be used to build language model applications. Modules can be combined to create more complex applications, or be used individually for simple applications. | |
`````{dropdown} LLMs: Get predictions from a language model | |
The most basic building block of LangChain is calling an LLM on some input. | |
Let's walk through a simple example of how to do this. | |
For this purpose, let's pretend we are building a service that generates a company name based on what the company makes. | |
In order to do this, we first need to import the LLM wrapper. | |
```python | |
from langchain.llms import OpenAI | |
``` | |
We can then initialize the wrapper with any arguments. | |
In this example, we probably want the outputs to be MORE random, so we'll initialize it with a HIGH temperature. | |
```python | |
llm = OpenAI(temperature=0.9) | |
``` | |
We can now call it on some input! | |
```python | |
text = "What would be a good company name a company that makes colorful socks?" | |
print(llm(text)) | |
``` | |
```pycon | |
Feetful of Fun | |
``` | |
For more details on how to use LLMs within LangChain, see the [LLM getting started guide](../modules/llms/getting_started.ipynb). | |
````` | |
`````{dropdown} Prompt Templates: Manage prompts for LLMs | |
Calling an LLM is a great first step, but it's just the beginning. | |
Normally when you use an LLM in an application, you are not sending user input directly to the LLM. | |
Instead, you are probably taking user input and constructing a prompt, and then sending that to the LLM. | |
For example, in the previous example, the text we passed in was hardcoded to ask for a name for a company that made colorful socks. | |
In this imaginary service, what we would want to do is take only the user input describing what the company does, and then format the prompt with that information. | |
This is easy to do with LangChain! | |
First lets define the prompt template: | |
```python | |
from langchain.prompts import PromptTemplate | |
prompt = PromptTemplate( | |
input_variables=["product"], | |
template="What is a good name for a company that makes {product}?", | |
) | |
``` | |
Let's now see how this works! We can call the `.format` method to format it. | |
```python | |
print(prompt.format(product="colorful socks")) | |
``` | |
```pycon | |
What is a good name for a company that makes colorful socks? | |
``` | |
[For more details, check out the getting started guide for prompts.](../modules/prompts/getting_started.ipynb) | |
````` | |
`````{dropdown} Chains: Combine LLMs and prompts in multi-step workflows | |
Up until now, we've worked with the PromptTemplate and LLM primitives by themselves. But of course, a real application is not just one primitive, but rather a combination of them. | |
A chain in LangChain is made up of links, which can be either primitives like LLMs or other chains. | |
The most core type of chain is an LLMChain, which consists of a PromptTemplate and an LLM. | |
Extending the previous example, we can construct an LLMChain which takes user input, formats it with a PromptTemplate, and then passes the formatted response to an LLM. | |
```python | |
from langchain.prompts import PromptTemplate | |
from langchain.llms import OpenAI | |
llm = OpenAI(temperature=0.9) | |
prompt = PromptTemplate( | |
input_variables=["product"], | |
template="What is a good name for a company that makes {product}?", | |
) | |
``` | |
We can now create a very simple chain that will take user input, format the prompt with it, and then send it to the LLM: | |
```python | |
from langchain.chains import LLMChain | |
chain = LLMChain(llm=llm, prompt=prompt) | |
``` | |
Now we can run that chain only specifying the product! | |
```python | |
chain.run("colorful socks") | |
# -> '\n\nSocktastic!' | |
``` | |
There we go! There's the first chain - an LLM Chain. | |
This is one of the simpler types of chains, but understanding how it works will set you up well for working with more complex chains. | |
[For more details, check out the getting started guide for chains.](../modules/chains/getting_started.ipynb) | |
````` | |
`````{dropdown} Agents: Dynamically call chains based on user input | |
So far the chains we've looked at run in a predetermined order. | |
Agents no longer do: they use an LLM to determine which actions to take and in what order. An action can either be using a tool and observing its output, or returning to the user. | |
When used correctly agents can be extremely powerful. In this tutorial, we show you how to easily use agents through the simplest, highest level API. | |
In order to load agents, you should understand the following concepts: | |
- Tool: A function that performs a specific duty. This can be things like: Google Search, Database lookup, Python REPL, other chains. The interface for a tool is currently a function that is expected to have a string as an input, with a string as an output. | |
- LLM: The language model powering the agent. | |
- Agent: The agent to use. This should be a string that references a support agent class. Because this notebook focuses on the simplest, highest level API, this only covers using the standard supported agents. If you want to implement a custom agent, see the documentation for custom agents (coming soon). | |
**Agents**: For a list of supported agents and their specifications, see [here](../modules/agents/agents.md). | |
**Tools**: For a list of predefined tools and their specifications, see [here](../modules/agents/tools.md). | |
For this example, you will also need to install the SerpAPI Python package. | |
```bash | |
pip install google-search-results | |
``` | |
And set the appropriate environment variables. | |
```python | |
import os | |
os.environ["SERPAPI_API_KEY"] = "..." | |
``` | |
Now we can get started! | |
```python | |
from langchain.agents import load_tools | |
from langchain.agents import initialize_agent | |
from langchain.llms import OpenAI | |
# First, let's load the language model we're going to use to control the agent. | |
llm = OpenAI(temperature=0) | |
# Next, let's load some tools to use. Note that the `llm-math` tool uses an LLM, so we need to pass that in. | |
tools = load_tools(["serpapi", "llm-math"], llm=llm) | |
# Finally, let's initialize an agent with the tools, the language model, and the type of agent we want to use. | |
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True) | |
# Now let's test it out! | |
agent.run("Who is Olivia Wilde's boyfriend? What is his current age raised to the 0.23 power?") | |
``` | |
```pycon | |
Entering new AgentExecutor chain... | |
I need to find out who Olivia Wilde's boyfriend is and then calculate his age raised to the 0.23 power. | |
Action: Search | |
Action Input: "Olivia Wilde boyfriend" | |
Observation: Jason Sudeikis | |
Thought: I need to find out Jason Sudeikis' age | |
Action: Search | |
Action Input: "Jason Sudeikis age" | |
Observation: 47 years | |
Thought: I need to calculate 47 raised to the 0.23 power | |
Action: Calculator | |
Action Input: 47^0.23 | |
Observation: Answer: 2.4242784855673896 | |
Thought: I now know the final answer | |
Final Answer: Jason Sudeikis, Olivia Wilde's boyfriend, is 47 years old and his age raised to the 0.23 power is 2.4242784855673896. | |
> Finished AgentExecutor chain. | |
"Jason Sudeikis, Olivia Wilde's boyfriend, is 47 years old and his age raised to the 0.23 power is 2.4242784855673896." | |
``` | |
````` | |
`````{dropdown} Memory: Add state to chains and agents | |
So far, all the chains and agents we've gone through have been stateless. But often, you may want a chain or agent to have some concept of "memory" so that it may remember information about its previous interactions. The clearest and simple example of this is when designing a chatbot - you want it to remember previous messages so it can use context from that to have a better conversation. This would be a type of "short-term memory". On the more complex side, you could imagine a chain/agent remembering key pieces of information over time - this would be a form of "long-term memory". For more concrete ideas on the latter, see this [awesome paper](https://memprompt.com/). | |
LangChain provides several specially created chains just for this purpose. This notebook walks through using one of those chains (the `ConversationChain`) with two different types of memory. | |
By default, the `ConversationChain` has a simple type of memory that remembers all previous inputs/outputs and adds them to the context that is passed. Let's take a look at using this chain (setting `verbose=True` so we can see the prompt). | |
```python | |
from langchain import OpenAI, ConversationChain | |
llm = OpenAI(temperature=0) | |
conversation = ConversationChain(llm=llm, verbose=True) | |
conversation.predict(input="Hi there!") | |
``` | |
```pycon | |
> Entering new chain... | |
Prompt after formatting: | |
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. | |
Current conversation: | |
Human: Hi there! | |
AI: | |
> Finished chain. | |
' Hello! How are you today?' | |
``` | |
```python | |
conversation.predict(input="I'm doing well! Just having a conversation with an AI.") | |
``` | |
```pycon | |
> Entering new chain... | |
Prompt after formatting: | |
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. | |
Current conversation: | |
Human: Hi there! | |
AI: Hello! How are you today? | |
Human: I'm doing well! Just having a conversation with an AI. | |
AI: | |
> Finished chain. | |
" That's great! What would you like to talk about?" | |
``` |