一、langChain Prompts
上篇文章对 langChain
进行了简单的介绍与使用,可以知道LangChain
是一个由语言模型LLMs
驱动的应用程序框架,使用 LangChain
可以极大的降低开发成本,本篇文章主要基于 LangChain
中的 Prompts
提示管理实现特定领域的问答场景。
下面是上篇文章的地址:
LangChain 介绍及相关组件使用总结
对于Prompts
提示管理,是通过使用模版文本增加提示的方式,进而微调模型的语义理解给出更加准确的信息。因此通过这一特征可以构建非常多特定领域的问答系统,比如在用户输入的前面固定拼接一个 你是一个非常厉害的导游,根据用户内容回答景点介绍方面的信息
,这样模型就知道了自己的定位,通过语义分析给出更加精准的回答。
下面通过 LangChain
中不同的 Prompts
实现特定领域的应用。
1. 景点推荐应用
通过使用 LangChain
中的 PromptTemplate
,其可以生成文本模版,通过变量参数的形式拼接成完整的语句。
例如:需要实现一个景点推荐应用,用户输入自己的描述,可以分析并推荐一个国内的景点,并给出推荐的理由:
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
from langchain.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, PromptTemplate
from langchain.llms import OpenAI
import os
openai_api_key = os.environ["OPENAI_API_KEY"]
llm = OpenAI(model_name="text-davinci-003", openai_api_key=openai_api_key)
# 定义结构
response_schemas = [
ResponseSchema(name="area", description="推荐景点的地区"),
ResponseSchema(name="reason", description="体检该地区的原因")
]
# 解析输出结构
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()
# 模版内容
template = "根据用户输入内容,推荐一个中国的景点名称,并给出推荐原因 {format_instructions}, 用户输入:{value}"
# 构建提示模版
prompt = PromptTemplate(
input_variables=["value"],
partial_variables={"format_instructions": format_instructions},
template=template
)
# 用户输入内容
value="我想去看大海"
# 生成完整输入
final_prompt = prompt.format(value=value)
print("输入内容::", final_prompt)
print("LLM输出:", llm(final_prompt))
2. 实体提取应用
在 NLP
领域 ner
实体提取是一个非常常用的方向,现在如果采用 Prompts
进行实现就非常简单了,只需给出准确的实体描述即可。
通过上面演示的 PromptTemplate
也可以实现,这里换成 LangChain
提供的 ChatPromptTemplate
进行实现。
例如:根据输入内容提取出公司名和地域名信息:
from langchain.schema import HumanMessage
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
import os
openai_api_key = os.environ["OPENAI_API_KEY"]
chat_model = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo', openai_api_key=openai_api_key)
response_schemas = [
ResponseSchema(name="company", description="提取的公司名"),
ResponseSchema(name="area", description="提取的地域名")
]
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
format_instructions = output_parser.get_format_instructions()
print(format_instructions)
prompt = ChatPromptTemplate(
messages=[
HumanMessagePromptTemplate.from_template("根据用户内容,提取出公司名称和地域名 {format_instructions}, 用户输入: {value}")
],
input_variables=["value"],
partial_variables={"format_instructions": format_instructions}
)
# 输入内容
value="阿里巴巴公司在江苏南京有分公司吗"
fruit_query = prompt.format_prompt(value=value)
print (fruit_query.messages[0].content)
fruit_output = chat_model(fruit_query.to_messages())
output = output_parser.parse(fruit_output.content)
print (output)
3. 中国古诗词问答应用
中国文化博大精深,其中在古诗词上颇有体现,通过LLM
实现古诗词问答应用也是非常简单。
通过上面演示的 PromptTemplate
和 ChatPromptTemplate
也可以实现,这里换成 LangChain
提供的 SemanticSimilarityExampleSelector
选择器示例进行实现,给出一些实例,让模型去理解语义含义进而给出结果。
例如:实现用户输入古诗词的题目,给出其诗词的内容,用户输入诗词的内容,给出其诗词的题目:
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain.llms import OpenAI
openai_api_key = os.environ["OPENAI_API_KEY"]
llm = OpenAI(model_name="gpt-3.5-turbo", openai_api_key=openai_api_key)
# 构建提示模版
example_prompt = PromptTemplate(
input_variables=["input", "output"],
template="示例输入:{input}, 示例输出:{output}"
)
# 示例列表
examples = [
{"input": "春晓", "output": "春眠不觉晓,处处闻啼鸟"},
{"input": "春夜喜雨", "output": "碧玉妆成一树高,万条垂下绿丝绦"},
{"input": "故人西辞黄鹤楼,烟花三月下扬州", "output": "黄鹤楼送孟浩然之广陵"},
{"input": "千山鸟飞绝,万径人踪灭", "output": "江雪"},
]
example_selector = SemanticSimilarityExampleSelector.from_examples(
examples,
OpenAIEmbeddings(openai_api_key=openai_api_key),
FAISS,
k=4
)
# 选择器示例 prompt
similar_prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
prefix="根据下面的示例,写出输出",
suffix="输入:{value}",
input_variables=["value"],
)
# 输入内容
value = "春望"
# 模版生成内容
final_prompt = similar_prompt.format(value=value)
print("输入内容::", final_prompt)
print("LLM输出:", llm(final_prompt))
# 输入内容
value = "举头望明月,低头思故乡"
# 模版生成内容
final_prompt = similar_prompt.format(value=value)
print("输入内容::", final_prompt)
print("LLM输出:", llm(final_prompt))