為某網(wǎng)站做網(wǎng)站推廣策劃方案制作網(wǎng)站的工具
文章目錄
- 前提回顧
- FewShotPromptTemplate
- foramt格式化
前提回顧
前面已經(jīng)實(shí)現(xiàn)了一個(gè)翻譯助手了[prompt第三講-PromptTemplate],prompt模板設(shè)計(jì)中,有說(shuō)明、案例、和實(shí)際的問(wèn)題
# -*- coding: utf-8 -*-
"""
@Time : 2024/7/8 9:44
@Auth : leon
"""
from langchain_core.prompts import PromptTemplate
# 4. 定義部分變量
prompt_template = PromptTemplate.from_template("""
你是一個(gè)翻譯助手,你擅長(zhǎng)將{source_language}翻譯為{dst_language},請(qǐng)將我發(fā)送給你的question的內(nèi)容翻譯為{dst_language},不要返回?zé)o關(guān)的內(nèi)容,只需返回最終翻譯結(jié)果,下面的history examples中提供了一些具體的案例,為你提供一些參考:## history examples:
question:美麗->answer:beautiful;
question:男孩->answer:boy;
question:男人->answer:man;
question:456->answer:four hundred and fifty-six;
question:1->answer:one;
question:34->answer:thirty-four;## user true task:
question:{user_input_words}->answer:
""")
lag2lag = input("你想我成為什么翻譯助手(格式如:中文-英文):")
source_language,dst_language = lag2lag.split('-')
new_prompt_template = prompt_template.partial(source_language=source_language,dst_language=dst_language)
print("助手初始化完畢,您的翻譯助手上線!!!")
# 2. llm定義
from langchain_community.llms import Tongyi
from pydantic_settings import BaseSettings,SettingsConfigDict"""
2,1 獲取千問(wèn)的key
我這么寫的原因是因?yàn)榉奖阄疑蟼黜?xiàng)目到github的同時(shí),不暴露我的key,所以我把可以key保存到了最外部的一個(gè).env文件中
這樣我每一次同步到github的時(shí)候就不會(huì)把key也推出去,你們測(cè)試的時(shí)候,可以直接寫成
qwen_key="sk-cc2209cec48c4bc966fb4acda169e",這樣省事。
"""
class ModelConfig(BaseSettings):model_config = SettingsConfigDict(env_file="../../../.env",env_file_encoding="utf-8")qwen_key:strdeepseek_key:strdeepseek_base_url:strmodel_config = ModelConfig()
qwen_key = model_config.qwen_key
# 1. 讀取配置信息,獲取模型key
llm = Tongyi(dashscope_api_key=qwen_key)while(True):user_input_word = input(f"請(qǐng)輸入需要翻譯的{source_language}:")if user_input_word.lower() =="quit":breakelse:prompt = new_prompt_template.invoke({"user_input_words":user_input_word})print(llm.invoke(prompt))
FewShotPromptTemplate
下面我們換一種更加優(yōu)雅的方式來(lái)實(shí)現(xiàn)上面的prompt模板
# -*- coding: utf-8 -*-
"""
@Time : 2024/7/9 9:44
@Auth : leon
"""
from langchain_core.prompts import PromptTemplate,FewShotPromptTemplate
example_prompt = PromptTemplate.from_template("question: {question}->answer:{answer}")
examples = [{'question':'美麗',"answer":'beautiful'},{'question':'男孩',"answer":'boy'},{'question':'男人',"answer":'man'},{'question':'456',"answer":'four'},{'question':'456',"answer":'four hundred and fifty-six'},{'question':'1',"answer":'one'},{'question':'34',"answer":'thirty-four'}
]
prefix = """
你是一個(gè)翻譯助手,你擅長(zhǎng)將{source_language}翻譯為{dst_language},請(qǐng)將我發(fā)送給你的question的內(nèi)容翻譯為{dst_language},不要返回?zé)o關(guān)的內(nèi)容,只需返回最終翻譯結(jié)果,下面的history examples中提供了一些具體的案例,為你提供一些參考:
## history examples:
"""
suffix = """
## user true task:
question:{user_input_words}->answer:
"""
prompt_template = FewShotPromptTemplate(examples=examples,example_prompt=example_prompt,prefix=prefix,suffix=suffix,input_variables=['user_input_words','source_language','dst_language']
)lag2lag = input("你想我成為什么翻譯助手(格式如:中文-英文):")
source_language,dst_language = lag2lag.split('-')
new_prompt_template = prompt_template.partial(source_language=source_language,dst_language=dst_language)from langchain_community.llms import Tongyi
from pydantic_settings import BaseSettings,SettingsConfigDict"""
2,1 獲取千問(wèn)的key
我這么寫的原因是因?yàn)榉奖阄疑蟼黜?xiàng)目到github的同時(shí),不暴露我的key,所以我把可以key保存到了最外部的一個(gè).env文件中
這樣我每一次同步到github的時(shí)候就不會(huì)把key也推出去,你們測(cè)試的時(shí)候,可以直接寫成
qwen_key="sk-cc2209cec48c4bc966fb4acda169e",這樣省事。
"""
class ModelConfig(BaseSettings):model_config = SettingsConfigDict(env_file="../../../.env",env_file_encoding="utf-8")qwen_key:strdeepseek_key:strdeepseek_base_url:strmodel_config = ModelConfig()
qwen_key = model_config.qwen_key
# 1. 讀取配置信息,獲取模型key
llm = Tongyi(dashscope_api_key=qwen_key)while(True):user_input_word = input(f"請(qǐng)輸入需要翻譯的{source_language}:")if user_input_word.lower() =="quit":breakelse:prompt = new_prompt_template.invoke({"user_input_words":user_input_word})print(llm.invoke(prompt))
著重看一下FewShotPromptTemplate定義模板部分,他沒(méi)有什么方法可以實(shí)例化對(duì)象,只支持直接實(shí)例化,而實(shí)例化
要傳入的參數(shù)也不用咋說(shuō),格式一目了然
參數(shù)講解
- example_prompt:你想要案例遵守的prompt模板格式
- examples一個(gè)案例列表,里面是多個(gè)字典,字典的key必須和example_prompt中定義的變量是統(tǒng)一的
- prefix:你想要在案例前面插入的內(nèi)容,如果是接著前面的翻譯助手,那這里通常就是這個(gè)助手的能力說(shuō)明
- suffix:通常就是你想要最后插入的實(shí)際的問(wèn)題的prompt模板
- input_variables:變量說(shuō)明,這個(gè)變量來(lái)自prefix和suffix
foramt格式化
因?yàn)镕ewShotPromptTemplate也是繼承自runnable的,所以他有的方法和變量基本和前面講的PromptTemplate差不多,
變量可能會(huì)有些變化,但是方法基本是統(tǒng)一的,也是遵從(invoke,batch,stream那一套的),而invoke最底層是
調(diào)用了format,所以我只需要講解一下format,其他的都懂了
format的原理如下:
- 遍歷examples列表,根據(jù)example_prompt模板格式,實(shí)例化出一個(gè)prompt列表,并且以空格的形式進(jìn)行拼接成一個(gè)字符串
- 將prefix添加到第一步得到prompt字符串前面,將suffix添加到prompt字符串后面
- 將輸入的變量填入新的模板中,得到格式化后的prompt
其他支持的方法,和前面的PromptTemplate是一樣的invoke,batch,stream等,需要注意的是,它也提供了save功能,但是
沒(méi)有提供加載功能,這很奇怪。
附上筋斗云,會(huì)有完整教程和代碼:https://github.com/traveler-leon/langchain-learning.git