主要模型
- LLM:对话模型, 输入和输出都是文本
- Chat Model: 输入输出都是数据结构
模型IO设计
- Format: 将提示词模版格式化
- Predict: langchain就是通过predict的方式调用不同的模型, 两个模型的区别不大, Chat Model 是以LLM为基础的.
- Parese: langchain还可以对结果进行干预, 得到的文本可以用parse进行格式化, 根据格式化的文本再去对外部系统的操作, 可以做输出的自定义
两种主要的提示模版
PromptTemplate
#字符模板
from langchain.prompts import PromptTemplate
prompt = PromptTemplate.from_template("你是一个{name},帮我起1个具有{county}特色的{sex}名字")
prompt.format(name="算命大师",county="法国",sex="女孩")
ChatPromptTemplate
# 对话模板具有结构,chatmodels
from langchain.prompts import ChatPromptTemplate
chat_template = ChatPromptTemplate.from_messages(
[
("system", "你是一个起名大师. 你的名字叫{name}."),
("human", "你好{name},你感觉如何?"),
("ai", "你好!我状态非常好!"),
("human", "你叫什么名字呢?"),
("ai", "你好!我叫{name}"),
("human", "{user_input}"),
]
)
chat_template.format_messages(name="陈大师", user_input="你的爸爸是谁呢?")
from langchain.schema import SystemMessage
from langchain.schema import HumanMessage
from langchain.schema import AIMessage
# 直接创建消息
sy = SystemMessage(
content="你是一个起名大师",
additional_kwargs={"大师姓名": "陈瞎子"}
)
hu = HumanMessage(
content="请问大师叫什么?"
)
ai = AIMessage(
content="我叫陈瞎子"
)
[sy,hu,ai]
SystemMessage, HumanMessage, AIMessage 是LangChain内置的三种消息体模版, 分别代表系统内置设置、人类角色消息、Ai回答消息
prompts自定义模版实战
##函数大师:根据函数名称,查找函数代码,并给出中文的代码说明
from langchain.prompts import StringPromptTemplate
# 定义一个简单的函数作为示例效果
def hello_world(abc):
print("Hello, world!")
return abc
PROMPT = """\
你是一个非常有经验和天赋的程序员,现在给你如下函数名称,你会按照如下格式,输出这段代码的名称、源代码、中文解释。
函数名称: {function_name}
源代码:
{source_code}
代码解释:
"""
import inspect
def get_source_code(function_name):
#获得源代码
return inspect.getsource(function_name)
#自定义的模板class
class CustmPrompt(StringPromptTemplate):
def format(self, **kwargs) -> str:
# 获得源代码
source_code = get_source_code(kwargs["function_name"])
# 生成提示词模板
prompt = PROMPT.format(
function_name=kwargs["function_name"].__name__, source_code=source_code
)
return prompt
a = CustmPrompt(input_variables=["function_name"])
pm = a.format(function_name=hello_world)
print(pm)
#和LLM连接起来
from langchain.llms import OpenAI
import os
api_base = os.getenv("OPENAI_PROXY")
api_key = os.getenv("OPENAI_API_KEY")
llm = OpenAI(
model="gpt-3.5-turbo-instruct",
temperature=0,
openai_api_key=api_key,
openai_api_base=api_base
)
msg = llm.predict(pm)
print(msg)
序列化模版使用
序列化: 使用文件管理提示词
- 便于共享
- 便于版本管理
- 便于存储
- 支持常见格式(json/yaml/txt)
json:
{
"_type":"prompt",
"input_variables":["name","what"],
"template":"给我讲一个关于{name}的{what}故事"
}
yaml:
_type: prompt
input_variables:
["name","what"]
template:
给我讲一个关于{name}的{what}故事
使用
from langchain.prompts import load_prompt
#加载yaml格式的prompt模版
prompt = load_prompt("simple_prompt.yaml")
print(prompt.format(name="小黑",what="恐怖的"))
#加载json格式的prompt模版
prompt = load_prompt("simple_prompt.json")
print(prompt.format(name="小红",what="搞笑的"))
自定义json解析:
{
"input_variables": [
"question",
"student_answer"
],
"output_parser": {
"regex": "(.*?)\\nScore: (.*)",
"output_keys": [
"answer",
"score"
],
"default_output_key": null,
"_type": "regex_parser"
},
"partial_variables": {},
"template": "Given the following question and student answer, provide a correct answer and score the student answer.\nQuestion: {question}\nStudent Answer: {student_answer}\nCorrect Answer:",
"template_format": "f-string",
"validate_template": true,
"_type": "prompt"
}
#支持加载文件格式的模版,并且对prompt的最终解析结果进行自定义格式化
prompt = load_prompt("prompt_with_output_parser.json")
prompt.output_parser.parse(
"George Washington was born in 1732 and died in 1799.\nScore: 1/2"
)
示例选择器(prompts组件)根据长度动态选择提示词示例组
根据长度要求智能选择示例
示例模版可以根据输入的长度来动态调整示例的长度
#根据输入的提示词长度综合计算最终长度,智能截取或者添加提示词的示例
from langchain.prompts import PromptTemplate
from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.example_selector import LengthBasedExampleSelector
#假设已经有这么多的提示词示例组:
examples = [
{"input":"happy","output":"sad"},
{"input":"tall","output":"short"},
{"input":"sunny","output":"gloomy"},
{"input":"windy","output":"calm"},
{"input":"高兴","output":"悲伤"}
]
#构造提示词模板
example_prompt = PromptTemplate(
input_variables=["input","output"],
template="原词:{input}\n反义:{output}"
)
#调用长度示例选择器
example_selector = LengthBasedExampleSelector(
#传入提示词示例组
examples=examples,
#传入提示词模板
example_prompt=example_prompt,
#设置格式化后的提示词最大长度
max_length=25,
#内置的get_text_length,如果默认分词计算方式不满足,可以自己扩展
#get_text_length:Callable[[str],int] = lambda x:len(re.split(&