LangChain实战课教授了如何利用 LangChain 进行大语言模型的提示工程。以下是我们需要注意到的要点所在
1. 清晰的提示与结构化输出
- 使用清晰、具体的指示能够帮助模型高效地完成任务。
- LangChain 提供了非常好的框架来确保提示的清晰度和格式的标准化。
- 通过打印最终传递给模型的提示(例如
print语句输出),你能清楚看到模型将如何处理任务,并且可以确保输入的格式正确。 - 例如,利用 JSON 格式可以清楚地指示模型按照特定结构输出。
示例:(json文件)
{
"description": "鲜花的简短文案",
"reason": "清晰的提示帮助模型输出结构化的结果"
}
2. LangChain的提示框架
- 指令(Instruction) : 告诉模型需要做什么,如何做,以及如何输出结果。
- 上下文(Context) : 提供额外的知识来源(如数据库、API调用等)。
- 提示输入(Prompt Input) : 明确指定模型需要做的任务或问题。
- 输出指示器(Output Indicator) : 标识输出的开始,可以是“思考”、“解答”等。
3. 大语言模型的提示工程原则
吴恩达老师在 ChatGPT Prompt Engineering for Developers 公开课中提出了两条关键原则:
- 写出清晰而具体的指示
- 给模型思考的时间
OpenAI官方文档中的6大策略也与这些原则相辅相成:
- 提供清晰的指示
- 给模型参考示例
- 将复杂任务拆解为子任务
- 让GPT有足够的思考时间
- 使用外部工具
- 反复迭代优化提示
4. LangChain中的提示模板类型
- PromptTemplate 和 ChatPromptTemplate 是常用的基本模板类型。
- PromptTemplate 是一种通用模板,用于替换字符串中的占位符。
- ChatPromptTemplate 则专为聊天模型设计,支持角色化(如
system,user,assistant消息)消息格式。
示例:
python
from langchain import PromptTemplate
template = "你是业务咨询顾问,你给一个销售{product}的电商公司,起一个好的名字?"
prompt = PromptTemplate.from_template(template)
print(prompt.format(product="鲜花"))
5. 使用 FewShotPromptTemplate
- Few-Shot学习是提示工程中的重要概念,它通过提供少量的示例来引导模型的输出,帮助模型理解任务要求。
- 通过
FewShotPromptTemplate,可以为大语言模型提供多个示例,帮助它学习任务的结构和风格。 - 这种方法可以大大提高模型输出的质量,尤其是在没有大量数据的情况下。
示例:
python
from langchain.prompts.few_shot import FewShotPromptTemplate
samples = [
{"flower_type": "玫瑰", "occasion": "爱情", "ad_copy": "玫瑰,浪漫的象征..."},
{"flower_type": "康乃馨", "occasion": "母亲节", "ad_copy": "康乃馨代表着母爱的纯洁与伟大..."}
]
prompt_sample = PromptTemplate(input_variables=["flower_type", "occasion", "ad_copy"],
template="鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}")
prompt = FewShotPromptTemplate(examples=samples, example_prompt=prompt_sample, suffix="鲜花类型: {flower_type}\n场合: {occasion}", input_variables=["flower_type", "occasion"])
print(prompt.format(flower_type="野玫瑰", occasion="爱情"))
6. 使用示例选择器
- 当示例量很大时,直接传递所有示例给模型既低效又浪费Token。
- 示例选择器可以根据向量相似度选择最相关的示例,以减少模型的输入负担,提高效率。
- 示例选择器依赖于向量数据库(如 Chroma 或 Qdrant)来存储和检索示例。
示例:
python
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
example_selector = SemanticSimilarityExampleSelector.from_examples(samples, OpenAIEmbeddings(), Chroma, k=1)
7. 总结
- 通过 LangChain 提供的不同类型的提示模板,你可以构建多样化的任务,并根据需要调整任务的结构。
- Few-Shot学习和 示例选择器是优化提示工程和提高模型效果的重要工具。
- 提示工程不仅仅是编写清晰的指令,还包括如何组织和管理输入、示例以及输出格式,确保大模型能够最大限度地发挥其能力。
这些概念和技巧的应用可以帮助我们在实际项目中优化大语言模型的表现,尤其是在面对复杂任务时,如何通过有效的提示设计提高模型的准确性和效率。