LangChain - Chain
类别: Chain 标签: LangChain LLM目录
Chain
链允许我们将多个组件组合在一起以创建一个单一的、连续的应用程序。我们可以通过将多个链组合在一起,或者通过将链与其他组件组合来构建更复杂的链。
LLMChain
LLMChain 是一个简单的链,它接受一个提示模板,用用户输入格式化它并返回来自 LLM 的响应。
语言模型(text-davinci-003)
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
llm = OpenAI(temperature=0.9)
prompt = PromptTemplate(input_variables=["product"],
template="What is a good name for a company that makes {product}?")
chain = LLMChain(llm=llm, prompt=prompt)
print(chain("colorful socks"))
{'product': 'colorful socks', 'text': '\n\nJazzy Socks.'}
聊天模型(gpt-3.5-turbo)
from langchain.chains import LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.prompts.chat import (
ChatPromptTemplate,
HumanMessagePromptTemplate
)
chat = ChatOpenAI(temperature=0.9)
human_message_prompt = HumanMessagePromptTemplate(
prompt=PromptTemplate(
input_variables=["product"],
template="What is a good name for a company that makes {product}?"
)
)
chat_prompt = ChatPromptTemplate.from_messages(messages=[human_message_prompt])
chain = LLMChain(llm=chat, prompt=chat_prompt)
print(chain("colorful socks"))
{'product': 'colorful socks', 'text': 'Rainbow Socks Co.'}
使用中文提问效果不好,出现的是一个名字列表。
# 中文 Prompt
为生产{product}的公司取个好名字。
为生产{product}的公司取一个好名字。
调用链的不同方式
使用 PromptTemplate.from_template
方法,会自动检测输入变量 input_variables
。
prompt = PromptTemplate(input_variables=["product"], template="What is a good name for a company that makes {product}?")
prompt = PromptTemplate.from_template(template="What is a good name for a company that makes {product}?")
from langchain.chains import LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
prompt_template = "What is a good name for a company that makes {product}?"
chat = ChatOpenAI(temperature=0.9)
chain = LLMChain(llm=chat, prompt=PromptTemplate.from_template(prompt_template))
chain("colorful socks")
{'product': 'colorful socks', 'text': 'Rainbow Sock Co.'}
如果有多个变量时,可以使用 Dict
chain({"product": "colorful socks"})
{'product': 'colorful socks', 'text': 'Rainbow Sox Co.'}
只显示输出结果
chain("colorful socks", return_only_outputs=True)
{'text': 'Rainbow Threads Sock Co.'}
如果 Chain 只输出一个输出键(即只有一个元素在它的 output_keys),你可以使用 run 方法。请注意,run 输出的是字符串而不是字典。
chain.run("colorful socks")
'Rainbow Socks Co.'
调试链(verbose=True)
创建链时,设置参数 verbose=True
将在运行时打印出对象的一些内部状态。
from langchain.chains import LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
prompt_template = "What is a good name for a company that makes {product}?"
chat = ChatOpenAI(temperature=0.9)
chain = LLMChain(llm=chat, prompt=PromptTemplate.from_template(prompt_template), verbose=True)
chain.run("colorful socks")
> Entering new LLMChain chain...
Prompt after formatting:
What is a good name for a company that makes colorful socks?
> Finished chain.
'Happy Feet Socks.'
组合链(SimpleSequentialChain)
顺序链是按预定义顺序执行的链。我们将使用 SimpleSequentialChain,这是最简单的顺序链类型,其中每个步骤都有一个输入/输出,一个步骤的输出是下一个步骤的输入。
下面的例子中,我们的顺序链将: 首先,为产品创建公司名称。 然后,为公司创建一个标语。
from langchain.chains import LLMChain
from langchain.chains import SimpleSequentialChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
first_prompt_template = "What is a good name for a company that makes {product}?"
second_prompt_template = "Write a catchphrase for the following company: {company_name}"
chat = ChatOpenAI(temperature=0.9)
first_chain = LLMChain(llm=chat, prompt=PromptTemplate.from_template(first_prompt_template))
second_chain = LLMChain(llm=chat, prompt=PromptTemplate.from_template(second_prompt_template))
chain = SimpleSequentialChain(chains=[first_chain, second_chain], verbose=True)
chain.run("colorful socks")
> Entering new SimpleSequentialChain chain...
Rainbow Socks Co.
"Step into a colorful world with Rainbow Socks Co."
> Finished chain.
'"Step into a colorful world with Rainbow Socks Co."'
- Rainbow Socks Co.
- 彩虹袜业公司
- Step into a colorful world with Rainbow Socks Co.
- 与彩虹袜业公司一起走进多彩的世界。
增强 ChatGPT 的数学能力
ChatGPT 计算
from langchain.chains import LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
llm = ChatOpenAI(temperature=0)
prompt = PromptTemplate.from_template("计算一下{expression}等于多少?")
chain = LLMChain(llm=llm, prompt=prompt)
print(chain.run("358*103")) # 36874
36974
使用 PythonREPL
有时,对于复杂的计算,与其让 LLM 直接生成答案,不如让 LLM 生成代码来计算答案,然后运行该代码来获得答案会更好。
from langchain.utilities import PythonREPL
repl = PythonREPL()
print(repl.run("print(358*103)"))
语言模型(text-davinci-003)
from langchain.chains import LLMChain
from langchain.utilities import PythonREPL
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
llm = OpenAI()
repl = PythonREPL()
chain = LLMChain(llm=llm, prompt=PromptTemplate.from_template("使用Python生成计算 '{expression}' 的代码。"))
python_code = chain.run("358*103")
result = repl.run(python_code)
print(f"Python code: {python_code}\nResult: {result}")
Python code:
print(358 * 103)
Result: 36874
聊天模型(gpt-3.5-turbo)
这个问题不太适合用 gpt-3.5-turbo
模型。
from langchain.chains import LLMChain
from langchain.utilities import PythonREPL
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
llm = ChatOpenAI()
repl = PythonREPL()
chain = LLMChain(llm=llm, prompt=PromptTemplate.from_template("使用Python生成计算 '{expression}' 的代码,只要代码不要输出结果,也不需要'```python'等标签,需要使用print打印出结果。"), verbose=True)
python_code = chain.run("358*103")
result = repl.run(python_code)
print(f"Python code: {python_code}\nResult: {result}")
Python code: code = "print(358*103)"
exec(code)
Result: 36874
LLMMathChain
LangChain 将上面的能力封装到了 LLMMathChain。
from langchain.chains import LLMMathChain
from langchain.llms import OpenAI
chain = LLMMathChain.from_llm(llm=OpenAI(), verbose=True)
print(chain.run("358*103"))
> Entering new LLMMathChain chain...
358*103
...numexpr.evaluate("358*103")...
Answer: 36874
> Finished chain.
Answer: 36874
Other Chains
LLMRequestsChain
这种使用 Google 搜索的方式不稳定。
from langchain.llms import OpenAI
from langchain.chains import LLMRequestsChain, LLMChain
from langchain.prompts import PromptTemplate
template = """Between >>> and <<< are the raw search result text from google.
Extract the answer to the question '{query}' or say "not found" if the information is not contained.
Use the format
Extracted:<answer or "not found">
>>> {requests_result} <<<
Extracted:"""
PROMPT = PromptTemplate(
input_variables=["query", "requests_result"],
template=template,
)
chain = LLMRequestsChain(llm_chain = LLMChain(llm=OpenAI(temperature=0), prompt=PROMPT))
question = "What are the Three (3) biggest countries, and their respective sizes?"
inputs = {
"query": question,
"url": "https://www.google.com/search?q=" + question.replace(" ", "+")
}
chain(inputs)
{'query': 'What are the Three (3) biggest countries, and their respective sizes?',
'url': 'https://www.google.com/search?q=What+are+the+Three+(3)+biggest+countries,+and+their+respective+sizes?',
'output': ' Russia (17,098,242 km²), Canada (9,984,670 km²), United States (9,826,675 km²)'}