【Langchain大语言模型开发教程】链

🔗 LangChain for LLM Application Development - DeepLearning.AI

学习目标

1、LLMChain

2、Sequential Chains

3、Router Chain

LLMChain

python 复制代码
import warnings
warnings.filterwarnings('ignore')
import os
import pandas as pd

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
python 复制代码
df = pd.read_csv('Data.csv')

df.head()

引入一些langchain的package

python 复制代码
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import LLMChain

初始化一个语言模型

python 复制代码
llm = ChatOpenAI(api_key=os.environ.get('ZHIPUAI_API_KEY'),
                         base_url=os.environ.get('ZHIPUAI_API_URL'),
                         model="glm-4",
                         temperature=0.98)

定义一个prompt template

python 复制代码
prompt = ChatPromptTemplate.from_template(
    "What is the best name to describe \
    a company that makes {product}?"
)

我们组合成一个chain。然后执行(新版本的方法)

python 复制代码
chain = prompt | llm

chain.invoke(input="Queen Size Sheet Set")

这里我们的GLM4的输出和GPT就不太一样了,这里给出了很多的选择

python 复制代码
'''
Naming a company that specializes in manufacturing Queen Size Sheet Sets can be creative and reflective of the products' quality, comfort, or the brand's identity. Here are a few suggestions that might resonate well with customers:

1. Queen's Retreat Textiles
2. Linen Luxe Haven
3. Pillowtop Elegance Co.
4. Comfort Queendom
5. Sheet Splendor Studios
6. Royal Slumber Collections
7. Dreamy Queen Sheets
8. Luxe Linen Queens
9. Cozy Castle Sheets
10. Queen Quilted Comforts

When choosing the best name, consider factors such as the target market, brand positioning, and the image you want to convey. It's also essential to ensure that the name is unique, memorable, and not already trademarked by another company in the same industry.
'''

Sequential Chains

python 复制代码
from langchain.chains import SimpleSequentialChain

llm = ChatOpenAI(api_key=os.environ.get('ZHIPUAI_API_KEY'),
                         base_url=os.environ.get('ZHIPUAI_API_URL'),
                         model="glm-4",
                         temperature=0.9)

这里我们定义两条链,他们是一个顺序执行的关系

python 复制代码
# prompt template 1
first_prompt = ChatPromptTemplate.from_template(
    "What is the best name to describe \
    a company that makes {product}?"
)

# Chain 1
chain_one = LLMChain(llm=llm, prompt=first_prompt)

# prompt template 2
second_prompt = ChatPromptTemplate.from_template(
    "Write a 20 words description for the following \
    company:{company_name}"
)
# chain 2
chain_two = LLMChain(llm=llm, prompt=second_prompt)

我们实例这个单一顺序链 ,执行以下,这里的效果和gpt差的还是有一些

python 复制代码
overall_simple_chain = SimpleSequentialChain(chains=[chain_one, chain_two],verbose=True)

overall_simple_chain.run("Queen Size Sheet Set")

'''
The best name for a company that specializes in making Queen Size Sheet Sets could be something that reflects the quality, comfort, and size of the product. Here are a few suggestions:
1. Queen's Linen Luxe
2. Regal Sheet Haven
3. Comfort Queen Sheets
4. Royal Slumber Company
5. Queenly Quilted Sheets
6. Opulent Bedding Emporium
7. Serene Sleep Solutions
8. Queen Comfort Collection
9. Luxe Linens for Her Majesty
10. Dreamy Queen Sheets & More

When choosing a name, consider factors such as the target market, the brand image you want to convey, and the uniqueness of the name for branding purposes. It's also important to ensure that the name isn't already trademarked or heavily associated with another brand in the bedding industry.
"Crafting regal comfort: Queen-sized sheets from Royal Slumber Company."

> Finished chain.
'''

如果要是有多个输入,我们可以使用LangChain的这个SequentialChain

模型初始化不变,我们定义了如下的四个链:

python 复制代码
# prompt template 1: translate to english
first_prompt = ChatPromptTemplate.from_template(
    "Translate the following review to english:"
    "\n\n{Review}"
)
# chain 1: input= Review and output= English_Review
chain_one = LLMChain(llm=llm, prompt=first_prompt, 
                     output_key="English_Review"
                    )
#prompt template 2:summarize the review
second_prompt = ChatPromptTemplate.from_template(
    "Can you summarize the following review in 1 sentence:"
    "\n\n{English_Review}"
)
# chain 2: input= English_Review and output= summary
chain_two = LLMChain(llm=llm, prompt=second_prompt, 
                     output_key="summary"
                    )

# prompt template 3: translate to english
third_prompt = ChatPromptTemplate.from_template(
    "What language is the following review:\n\n{Review}"
)
# chain 3: input= Review and output= language
chain_three = LLMChain(llm=llm, prompt=third_prompt,
                       output_key="language"
                      )
# prompt template 4: follow up message
fourth_prompt = ChatPromptTemplate.from_template(
    "Write a follow up response to the following "
    "summary in the specified language:"
    "\n\nSummary: {summary}\n\nLanguage: {language}"
)
# chain 4: input= summary, language and output= followup_message
chain_four = LLMChain(llm=llm, prompt=fourth_prompt,
                      output_key="message"
                     )

我们初始化我们的这个顺序链

python 复制代码
# overall_chain: input= Review 
# and output= English_Review,summary, followup_message
overall_chain = SequentialChain(
    chains=[chain_one, chain_two, chain_three, chain_four],
    input_variables=["Review"],
    output_variables=["English_Review", "summary","language","message"],
    verbose=True
)

这是我们使用GLM4的一个输出

python 复制代码
review = df.Review[5]
overall_chain(review)

'''
{'Review': "Je trouve le goût médiocre. La mousse ne tient pas, c'est bizarre. J'achète les mêmes dans le commerce et le goût est bien meilleur...\nVieux lot ou contrefaçon !?",
 'English_Review': "I find the taste mediocre. The foam does not hold, it's strange. I buy the same ones in stores and the taste is much better...\nOld batch or counterfeit!?",
 'summary': "The reviewer finds the product's taste mediocre, the foam disappointing, and suspects it might be an old batch or counterfeit compared to the better-tasting ones from stores. \n\n(Note: This summary is a combination of the reviewer's comments and does not reflect my own opinion.)",
 'language': 'The review is in French. The translation is:\n\n"I find the taste mediocre. The foam does not hold, it\'s strange. I buy the same ones in stores and the taste is much better... Old batch or counterfeit!?"',
 'message': 'Suite à votre résumé en français\xa0: "Je trouve que le goût est médiocre. La mousse ne tient pas, c\'est étrange. J\'achète les mêmes produits dans les magasins et le goût est bien meilleur... Peut-être une vieille loterie ou un produit contrefait!?"\n\nFollow-up response en français :\n\n"Cher client, nous vous remercions pour votre feedback honnête. Votre satisfaction est très importante pour nous. Nous sommes désolés d\'entendre que la qualité du produit que vous avez reçu ne corresponds pas à ce que vous attendiez. Nous prenons vos commentaires très au sérieux et allons enquêter sur les batchs en question pour déterminer si cela pourrait être dû à un lot vieux ou à un problème de contrefaçon. Votre expérience avec notre marque est une priorité et nous ferons de notre mieux pour résoudre cela. Si vous le souhaitez, nous vous proposons également de vous remplacer le produit gratuitement ou de vous offrir un remboursement. Veuillez nous contacter pour discuter de ces options."'}
'''

Router Chain

当我们的任务可能更加复杂的时候,我们可能就需要一个路由链,来帮我们路由到一个特定的子链上。

这里,我们定义了物理,数学,历史,计算机科学的prompt template。

python 复制代码
from langchain.chains.router import MultiPromptChain
from langchain.chains.router.llm_router import LLMRouterChain,RouterOutputParser
from langchain.prompts import PromptTemplate


llm = ChatOpenAI(api_key=os.environ.get('ZHIPUAI_API_KEY'),
                         base_url=os.environ.get('ZHIPUAI_API_URL'),
                         model="glm-4",
                         temperature=0)
python 复制代码
physics_template = """You are a very smart physics professor. \
You are great at answering questions about physics in a concise\
and easy to understand manner. \
When you don't know the answer to a question you admit\
that you don't know.

Here is a question:
{input}"""


math_template = """You are a very good mathematician. \
You are great at answering math questions. \
You are so good because you are able to break down \
hard problems into their component parts, 
answer the component parts, and then put them together\
to answer the broader question.

Here is a question:
{input}"""

history_template = """You are a very good historian. \
You have an excellent knowledge of and understanding of people,\
events and contexts from a range of historical periods. \
You have the ability to think, reflect, debate, discuss and \
evaluate the past. You have a respect for historical evidence\
and the ability to make use of it to support your explanations \
and judgements.

Here is a question:
{input}"""


computerscience_template = """ You are a successful computer scientist.\
You have a passion for creativity, collaboration,\
forward-thinking, confidence, strong problem-solving capabilities,\
understanding of theories and algorithms, and excellent communication \
skills. You are great at answering coding questions. \
You are so good because you know how to solve a problem by \
describing the solution in imperative steps \
that a machine can easily interpret and you know how to \
choose a solution that has a good balance between \
time complexity and space complexity. 

Here is a question:
{input}"""

我们为每个模板定义一个名称和描述来方便路由

python 复制代码
prompt_infos = [
    {
        "name": "physics", 
        "description": "Good for answering questions about physics", 
        "prompt_template": physics_template
    },
    {
        "name": "math", 
        "description": "Good for answering math questions", 
        "prompt_template": math_template
    },
    {
        "name": "History", 
        "description": "Good for answering history questions", 
        "prompt_template": history_template
    },
    {
        "name": "computer science", 
        "description": "Good for answering computer science questions", 
        "prompt_template": computerscience_template
    }
]

接下来我们定义一个目标链 和默认链

python 复制代码
destination_chains = {}
for p_info in prompt_infos:
    name = p_info["name"]
    prompt_template = p_info["prompt_template"]
    prompt = ChatPromptTemplate.from_template(template=prompt_template)
    chain = LLMChain(llm=llm, prompt=prompt)
    destination_chains[name] = chain  
    
destinations = [f"{p['name']}: {p['description']}" for p in prompt_infos]
destinations_str = "\n".join(destinations)


default_prompt = ChatPromptTemplate.from_template("{input}")
default_chain = LLMChain(llm=llm, prompt=default_prompt)

定义一个路由的prompt remplate

python 复制代码
MULTI_PROMPT_ROUTER_TEMPLATE = """Given a raw text input to a \
language model select the model prompt best suited for the input. \
You will be given the names of the available prompts and a \
description of what the prompt is best suited for. \
You may also revise the original input if you think that revising\
it will ultimately lead to a better response from the language model.

<< FORMATTING >>
Return a markdown code snippet with a JSON object formatted to look like:
```json
{{{{
    "destination": string \ name of the prompt to use or "DEFAULT"
    "next_inputs": string \ a potentially modified version of the original input
}}}}
```

REMEMBER: "destination" MUST be one of the candidate prompt \
names specified below OR it can be "DEFAULT" if the input is not\
well suited for any of the candidate prompts.
REMEMBER: "next_inputs" can just be the original input \
if you don't think any modifications are needed.

<< CANDIDATE PROMPTS >>
{destinations}

<< INPUT >>
{{input}}

<< OUTPUT (remember to include the ```json)>>"""

实例化出这个模板,然后将其装配到LLM 路由链上。

python 复制代码
router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(
    destinations=destinations_str
)
router_prompt = PromptTemplate(
    template=router_template,
    input_variables=["input"],
    output_parser=RouterOutputParser(),
)

router_chain = LLMRouterChain.from_llm(llm, router_prompt)

我们将其组合到一起

python 复制代码
chain = MultiPromptChain(router_chain=router_chain, 
                         destination_chains=destination_chains, 
                         default_chain=default_chain, verbose=True
                        )

我们可以输入不同的question,然后追踪一下我们选择了那个prompt。

python 复制代码
chain.run("What is black body radiation?")

chain.run("what is 2 + 2")

chain.run("Why does every cell in our body contain DNA?")
相关推荐
张人玉1 小时前
人工智能——猴子摘香蕉问题
人工智能
草莓屁屁我不吃1 小时前
Siri因ChatGPT-4o升级:我们的个人信息还安全吗?
人工智能·安全·chatgpt·chatgpt-4o
小言从不摸鱼1 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
AI科研视界1 小时前
ChatGPT+2:修订初始AI安全性和超级智能假设
人工智能·chatgpt
霍格沃兹测试开发学社测试人社区1 小时前
人工智能 | 基于ChatGPT开发人工智能服务平台
软件测试·人工智能·测试开发·chatgpt
小R资源2 小时前
3款免费的GPT类工具
人工智能·gpt·chatgpt·ai作画·ai模型·国内免费
artificiali5 小时前
Anaconda配置pytorch的基本操作
人工智能·pytorch·python
酱香编程,风雨兼程5 小时前
深度学习——基础知识
人工智能·深度学习
Lossya5 小时前
【机器学习】参数学习的基本概念以及贝叶斯网络的参数学习和马尔可夫随机场的参数学习
人工智能·学习·机器学习·贝叶斯网络·马尔科夫随机场·参数学习
#include<菜鸡>6 小时前
动手学深度学习(pytorch土堆)-04torchvision中数据集的使用
人工智能·pytorch·深度学习