LangChain 基于 Prompts 提示管理 构建特定领域模型

一、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))

  

猜你喜欢

转载自blog.csdn.net/sinat_37574187/article/details/131776111