赞
踩
在LangChain for LLM应用程序开发中课程中,学习了LangChain框架扩展应用程序开发中语言模型的用例和功能的基本技能,遂做整理为后面的应用做准备。视频地址:基于LangChain的大语言模型应用开发+构建和评估。
本实验基于jupyternotebook进行。
import warnings
warnings.filterwarnings('ignore')
from langchain.chat_models import ChatOpenAI from langchain.prompts import ChatPromptTemplate from langchain.chains import LLMChain llm = ChatOpenAI( api_key = "XXXX", base_url = "XXXX", temperature=0.9 ) prompt = ChatPromptTemplate.from_template( "What is the best name to describe \ a company that makes {product}?" ) chain = LLMChain(llm= llm, prompt= prompt) product = "Queen Size Sheet Set" chain.run(product)
输出如下:
'"Royal Linens"'
最简单的顺序链形式,每个步骤都有一个单一的输入/输出,一个步骤的输出是下一个步骤的输入。
from langchain.chains import SimpleSequentialChain # 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) overall_simple_chain = SimpleSequentialChain(chains=[chain_one, chain_two], verbose=True) product = "Queen Size Sheet Set" overall_simple_chain.run(product)
输出如下:
> Entering new SimpleSequentialChain chain...
Royal Comfort Linens
Royal Comfort Linens provides luxury bedding and bath products that are designed to bring elegance and comfort to your home.
> Finished chain.
'Royal Comfort Linens provides luxury bedding and bath products that are designed to bring elegance and comfort to your home.'
可以看到,先执行了chain_one,输出得到了company_name,接着将其作为参数,送入chain_two执行,得到了最终的描述。
更一般的顺序链形式,允许多个输入/输出,特别重要的是如何命名输入/输出变量名。
from langchain.chains import SequentialChain # 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 english 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="followup_message") # 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","followup_message"], verbose=True ) 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... Vieux lot ou contrefaçon !?" overall_chain(review)
输出如下:
> Entering new SequentialChain chain...
> Finished chain.
{'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 doesn't hold, it's strange. I buy the same ones in stores and the taste is much better... Old batch or counterfeit!?",
'summary': 'The reviewer is disappointed with the mediocre taste and lack of foam in the product, suggesting that it may be an old batch or counterfeit.',
'followup_message': "Bonjour,\n\nNous sommes désolés d'apprendre que vous n'avez pas eu une expérience satisfaisante avec notre produit. Nous vous assurons que nous prenons la qualité de nos produits très au sérieux et nous aimerions en savoir plus sur votre expérience. Avez-vous vérifié la date de péremption du produit ? Il est possible qu'il s'agisse d'un lot ancien. De plus, pourriez-vous nous fournir plus de détails sur le produit que vous avez acheté afin que nous puissions enquêter sur la possibilité d'une contrefaçon ?\n\nMerci de nous avoir fait part de vos préoccupations. Nous espérons avoir l'occasion de rectifier cette situation et de vous offrir une meilleure expérience avec nos produits à l'avenir.\n\nCordialement, [Votre nom]"}
本案例定义了几个模板类,分别是擅长物理、数学、历史、计算机的模型助手。首先定义prompt模板,并构造提示词信息的数组。
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}""" 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 } ]
先构造基本prompt
from langchain.chains.router import MultiPromptChain from langchain.chains.router.llm_router import LLMRouterChain,RouterOutputParser from langchain.prompts import PromptTemplate 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,定义可自由路由的方式或条件。
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)>>"""
接着定义路由,尝试运行代码
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) chain = MultiPromptChain(router_chain=router_chain, destination_chains=destination_chains, default_chain=default_chain, verbose=True ) chain.run("What is black body radiation?")
输出如下:
> Entering new MultiPromptChain chain...
physics: {'input': 'What is black body radiation?'}
> Finished chain.
"Black body radiation refers to the electromagnetic radiation emitted by a perfect black body, which is an idealized physical body that absorbs all incident electromagnetic radiation and re-emits it in a characteristic manner. The radiation is emitted at all wavelengths and its intensity and distribution depend only on the body's temperature. This concept is important in understanding the behavior of objects at high temperatures and for developing theories of quantum mechanics and thermodynamics."
再次尝试
chain.run("what is 2 + 2")
输出如下:
> Entering new MultiPromptChain chain...
math: {'input': 'what is 2 + 2'}
> Finished chain.
'The answer to the question "what is 2 + 2" is 4.'
再次尝试
chain.run("Why does every cell in our body contain DNA?")
输出如下:
> Entering new MultiPromptChain chain...
None: {'input': 'Why does every cell in our body contain DNA?'}
> Finished chain.
'Every cell in our body contains DNA because DNA carries the genetic information that determines the characteristics and functions of the cell. This genetic information is crucial for the cell to carry out its specific functions and to replicate and divide to produce new cells. DNA also serves as a blueprint for the production of proteins, which are essential for the structure and function of cells. Therefore, DNA is essential for the survival and functioning of every cell in our body.'
chain这个例子还有些模糊,需要自己动手实践,特别是RouterChain,看的还有些头大,再接再厉。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。