【2024最全最细Langchain教程-4 】Langchain模型I/O之提示Prompt(二)-CSDN博客
输出解析器的最简单应用
之前我们提过,我们使用的聊天包装器输出的是一个AIMessage类型的消息体,而我们在组建chain链的时候,往往需要输出str或者其他格式的输出,因此这里会引入输出解析器的概念,它的作用把langchain的输出进行格式转化,我们来看代码,这里StrOutputParser就是我们引入的输出解析器,它把原来的AIMessage输出成为str :
import langchain
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
api_key = os.getenv("OPENAI_API_KEY")
llm = ChatOpenAI(
openai_api_key=api_key,
temperature=0.9,
base_url = "https://apejhvxcd.cloud.sealos.io/v1"
)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个中国历史专家."),
("user", "{input}")
])
output_parser = StrOutputParser()
chain = prompt | llm | output_parser
response = chain.invoke({"input":"简单介绍一下宋朝的历史"})
print(response,type(response))
我们来看这个链调用的输出结果的类型,是一个str:
模型绑定和控制
你可以对llm模型进行函数绑定和控制,这里我们给一个最简单的示例,在上面代码的基础上给llm模型加一个绑定和限制,如下图:
llm2 = ChatOpenAI(
openai_api_key=api_key,
temperature=0.9,
base_url = "https://apejhvxcd.cloud.sealos.io/v1"
)
prompt2 = ChatPromptTemplate.from_messages([
("system", "你是一个中国历史专家."),
("user", "{input}")
])
output_parser = StrOutputParser()
chain2 = prompt2 | llm2.bind(stop=["\n"]) | output_parser
chain2.invoke({"input":"简单介绍一下宋朝的历史"})
这个绑定的意思是说,当模型的输出遇到换行符(“\n”)就停止不再输出了,加上这个之后我们可以看到同样的问题,模型返回的结果被处理截短了:
llm模型还可以绑定函数,以对模型进行更复杂的处理,这个我们后面在更复杂的案例里再介绍。
另外一种链的生成方式
这两节课上,我们已经看到了一种langchain最推荐、也是最简单的组链方式,我们来看另外一种组链的方式,这种方式也可以实现,但是不太推荐,这是因为这种组链方式如果在复杂链和复合链的构造时,修改起来会比较麻烦,但是我们也需要知道有其他的组链方式:
import langchain
import os
from langchain_openai import ChatOpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
api_key = os.getenv("OPENAI_API_KEY")
llm = ChatOpenAI(
openai_api_key=api_key,
temperature=0.9,
base_url = "https://apejhvxcd.cloud.sealos.io/v1"
)
prompt = (
ChatPromptTemplate.from_template("Tell me a joke about {topic}")
+ ", make it funny"
+ "\n\n and in {language}"
# PromptTemplate.from_template("Tell me a joke about {topic}")
# + ", make it funny"
# + "\n\n and in {language}"
)
# print(prompt)
output_parser = StrOutputParser()
#这种chain的组装方式是老的方式,不太推荐,推荐用新的 | 组装chain
chain = LLMChain(llm=llm, prompt=prompt, output_parser=output_parser)
print(chain.invoke({"topic":"历史", "language":"chinese"}))