You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
5.1 KiB
Python
194 lines
5.1 KiB
Python
1 year ago
|
r"""°°°
|
||
|
# Chains
|
||
|
|
||
|
Chaining LLMs with each other or with other experts.
|
||
|
|
||
|
## Getting Started
|
||
|
|
||
|
- Using the simple LLM chain
|
||
|
- Creating sequential chains
|
||
|
- Creating a custom chain
|
||
|
|
||
|
### Why Use Chains ?
|
||
|
|
||
|
- combine multiple components together
|
||
|
- ex: take user input, format with PromptTemplate, pass formatted text to LLM.
|
||
|
|
||
|
## Query an LLM with LLMChain
|
||
|
|
||
|
°°°"""
|
||
|
#|%%--%%| <2XVP2VXIL1|DPRWRo3fl7>
|
||
|
|
||
|
from langchain.prompts import PromptTemplate
|
||
|
from langchain.llms import OpenAI
|
||
|
import pprint as pp
|
||
|
|
||
|
llm = OpenAI(temperature=0.9)
|
||
|
prompt = PromptTemplate(
|
||
|
input_variables=["product"],
|
||
|
template="What is a good name for a company that makes {product}"
|
||
|
)
|
||
|
|
||
|
#|%%--%%| <DPRWRo3fl7|tOpTb9idHh>
|
||
|
r"""°°°
|
||
|
We can now create a simple chain that takes user input format it and pass to LLM
|
||
|
°°°"""
|
||
|
#|%%--%%| <tOpTb9idHh|QXu2N1dEEC>
|
||
|
|
||
|
from langchain.chains import LLMChain
|
||
|
chain = LLMChain(llm=llm, prompt=prompt, output_key='company_name')
|
||
|
|
||
|
# run the chain only specifying input variables
|
||
|
print(chain.run("hand crafted handbags"))
|
||
|
|
||
|
# NOTE: we pass data to the run of the entry chain (see sequence under)
|
||
|
|
||
|
#|%%--%%| <QXu2N1dEEC|Kv6bj1l9I3>
|
||
|
r"""°°°
|
||
|
## Combining chains with SequentialChain
|
||
|
|
||
|
Chains that execute their links in predefined order.
|
||
|
|
||
|
- SimpleSequentialChain: simplest form, each step has a single input/output.
|
||
|
Output of one step is input to next.
|
||
|
- SequentialChain: More advanced, multiple inputs/outputs.
|
||
|
|
||
|
|
||
|
Following tutorial uses SimpleSequentialChain and SequentialChain, each chains output is input to the next one.
|
||
|
This sequential chain will:
|
||
|
1. create company name for a product. We just use LLMChain for that
|
||
|
2. Create a catchphrase for the product. We will use a new LLMChain for the catchphrase, as show below.
|
||
|
°°°"""
|
||
|
#|%%--%%| <Kv6bj1l9I3|BMZLsdY9VP>
|
||
|
|
||
|
second_prompt = PromptTemplate(
|
||
|
input_variables=["company_name"],
|
||
|
template="Write a catchphrase for the following company: {company_name}",
|
||
|
)
|
||
|
chain_two = LLMChain(llm=llm, prompt=second_prompt, output_key='catchphrase')
|
||
|
|
||
|
#|%%--%%| <BMZLsdY9VP|epQHxmeWCP>
|
||
|
r"""°°°
|
||
|
We now combine the two chains to create company name and catch phrase.
|
||
|
°°°"""
|
||
|
#|%%--%%| <epQHxmeWCP|SHwDHjVCxb>
|
||
|
|
||
|
from langchain.chains import SimpleSequentialChain, SequentialChain
|
||
|
|
||
|
#|%%--%%| <SHwDHjVCxb|lKgp9HR0VX>
|
||
|
|
||
|
full_chain = SimpleSequentialChain(
|
||
|
chains=[chain, chain_two], verbose=True,
|
||
|
)
|
||
|
|
||
|
print(full_chain.run("hand crafted handbags"))
|
||
|
|
||
|
#|%%--%%| <lKgp9HR0VX|RiYcYwJhdC>
|
||
|
r"""°°°
|
||
|
---
|
||
|
|
||
|
In the third prompt we create an small advertisement with the title and the product description
|
||
|
°°°"""
|
||
|
#|%%--%%| <RiYcYwJhdC|RhnqOumOtX>
|
||
|
|
||
|
ad_template = """Create a small advertisement destined for reddit.
|
||
|
The advertisement is for a company with the following details:
|
||
|
|
||
|
name: {company_name}
|
||
|
product: {product}
|
||
|
catchphrase: {catchphrase}
|
||
|
|
||
|
advertisement:
|
||
|
"""
|
||
|
ad_prompt = PromptTemplate(
|
||
|
input_variables=["product", "company_name", "catchphrase"],
|
||
|
template=ad_template,
|
||
|
)
|
||
|
|
||
|
#|%%--%%| <RhnqOumOtX|MsQnieyxgL>
|
||
|
|
||
|
#Connet the three chains together
|
||
|
|
||
|
ad_chain = LLMChain(llm=llm, prompt=ad_prompt, output_key='advertisement')
|
||
|
|
||
|
#|%%--%%| <MsQnieyxgL|4PYfwOxTlq>
|
||
|
|
||
|
final_chain = SequentialChain(
|
||
|
chains=[chain, chain_two, ad_chain],
|
||
|
input_variables=['product'],
|
||
|
output_variables=['advertisement'],
|
||
|
verbose=True
|
||
|
)
|
||
|
|
||
|
ad = final_chain.run('Professional Cat Cuddler')
|
||
|
#|%%--%%| <4PYfwOxTlq|2akm8eB1EV>
|
||
|
|
||
|
print(ad)
|
||
|
|
||
|
#|%%--%%| <2akm8eB1EV|1iT7gBMABZ>
|
||
|
r"""°°°
|
||
|
## Creating a custom chain
|
||
|
|
||
|
Example: create a custom chain that concats output of 2 LLMChain
|
||
|
|
||
|
Steps:
|
||
|
1. Subclass Chain class
|
||
|
2. Fill out `input_keys` and `output_keys`
|
||
|
3. add the `_call` method that shows how to execute chain
|
||
|
°°°"""
|
||
|
#|%%--%%| <1iT7gBMABZ|OUXv7kGtDH>
|
||
|
|
||
|
from langchain.chains import LLMChain
|
||
|
from langchain.chains.base import Chain
|
||
|
|
||
|
from typing import Dict, List
|
||
|
|
||
|
class ConcatenateChain(Chain):
|
||
|
chain_1: LLMChain
|
||
|
chain_2: LLMChain
|
||
|
|
||
|
@property
|
||
|
def input_keys(self) -> List[str]:
|
||
|
# Union of the input keys of the two chains
|
||
|
all_inputs_vars = set(self.chain_1.input_keys).union(
|
||
|
set(self.chain_2.input_keys))
|
||
|
return list(all_inputs_vars)
|
||
|
|
||
|
@property
|
||
|
def output_keys(self) -> List[str]:
|
||
|
return ['concat_output']
|
||
|
|
||
|
def _call(self, inputs: Dict[str, str]) -> Dict[str,str]:
|
||
|
output_1 = self.chain_1.run(inputs)
|
||
|
output_2 = self.chain_2.run(inputs)
|
||
|
return {'concat_output': output_1 + output_2}
|
||
|
|
||
|
#|%%--%%| <OUXv7kGtDH|MUOMbKovF6>
|
||
|
r"""°°°
|
||
|
Running the custom chain
|
||
|
°°°"""
|
||
|
#|%%--%%| <MUOMbKovF6|kBfPU3rB6L>
|
||
|
prompt_1 = PromptTemplate(
|
||
|
input_variables=['product'],
|
||
|
template='what is a good name for a company that makes {product}?'
|
||
|
)
|
||
|
chain_1 = LLMChain(llm=llm, prompt=prompt_1)
|
||
|
|
||
|
prompt_2 = PromptTemplate(
|
||
|
input_variables=['product'],
|
||
|
template='what is a good slogan for a company that makes {product} ?'
|
||
|
)
|
||
|
chain_2 = LLMChain(llm=llm, prompt=prompt_2)
|
||
|
|
||
|
concat_chain = ConcatenateChain(chain_1=chain_1, chain_2=chain_2)
|
||
|
|
||
|
concat_output = concat_chain.run('leather handbags')
|
||
|
print(f'Concatenated output:\n{concat_output}')
|
||
|
|
||
|
|
||
|
#|%%--%%| <kBfPU3rB6L|9CdH3GtsmW>
|
||
|
|
||
|
|
||
|
|
||
|
|