1. Prompts开发基础概念与重要性
在AI应用开发中,Prompts(提示词)是与大语言模型交互的核心桥梁,其质量直接决定了模型输出的准确性和实用性。一个精心设计的Prompt能够引导模型生成符合预期的内容,而模糊的Prompt则可能导致无关或低质量的输出。对于开发者而言,掌握Prompts开发技术是实现高效AI应用的关键第一步。
Prompts不仅仅是简单的问题或指令,它包含了角色定义、任务描述、上下文信息、输出格式等多个维度。在LangChain等框架中,Prompts通过模板化的方式实现了可复用性和可维护性,这使得开发者能够构建更加健壮、高效的LLM应用。
2. 基础PromptTemplate示例
2.1 PromptTemplate实现
让我们从最基础的PromptTemplate开始,这是LangChain中最常用的提示构建工具。以下代码展示了如何创建一个可参数化的提示模板:
from langchain.prompts import PromptTemplate # 创建基础提示模板 prompt = PromptTemplate( input_variables=["topic", "word_count"], template="请用{word_count}字介绍{topic}的历史背景。" ) # 填充变量生成实际提示 formatted_prompt = prompt.format(topic="量子计算", word_count="300") print(formatted_prompt) # 输出:"请用300字介绍量子计算的历史背景。"这个简单的例子展示了PromptTemplate的核心功能:通过定义占位符(如{topic}、{word_count})创建可复用的模板,然后在运行时用具体值填充这些占位符。这种方式避免了硬编码提示文本,提高了代码的可维护性。
2.2 包含角色定义实现
在实际应用中,我们通常需要为AI模型设定明确的角色,这有助于模型更好地理解任务背景和期望的输出风格:
from langchain.prompts import PromptTemplate # 创建包含角色定义的模板 template = """你是业务咨询顾问。你给一个销售{product}的电商公司,起一个好的名字。""" prompt = PromptTemplate.from_template(template) print(prompt.format(product="手机")) # 或者使用另一种创建方式 prompt2 = PromptTemplate( template="""你是业务咨询顾问。你给一个销售{product}的电商公司,起一个好的名字。""", input_variables=['product'] ) print(prompt2.format(product="电脑"))在这个示例中,我们通过"你是业务咨询顾问"这句话为模型设定了明确的角色,这会使模型以专业顾问的身份来思考问题。研究表明,明确的角色定义能够显著提升模型输出的专业性和针对性。
3. 聊天模型ChatPromptTemplate
3.1 多角色消息模板
对于聊天模型(如GPT-3.5-turbo、GPT-4),我们需要使用ChatPromptTemplate来处理多角色的消息序列。以下是一个完整的示例:
from langchain_core.prompts import ChatPromptTemplate from langchain_core.messages import SystemMessage, HumanMessage, AIMessage # 创建聊天提示模板 chat_template = ChatPromptTemplate.from_messages([ ("system", "你是一个乐于助人的图书馆管理员,总是用友好、专业的语气回答问题。"), ("human", "请为我推荐一些适合{age_group}阅读的{genre}类书籍,并简要说明推荐理由。") ]) # 填充模板并生成消息列表 messages = chat_template.format_messages( age_group="青少年", genre="科幻" ) # 打印完整的消息结构 for msg in messages: print(f"{msg.type}: {msg.content}")这个示例展示了聊天模板的核心特点:支持多种消息类型,包括系统消息(设定AI角色和行为准则)、人类用户消息(用户输入)等。系统消息对于塑造AI的"人设"至关重要,它决定了AI将以什么样的风格和态度回应用户。
3.2 实际调用聊天模型
将ChatPromptTemplate与实际的聊天模型结合使用:
from langchain.chat_models import ChatOpenAI from langchain.prompts import ChatPromptTemplate # 初始化聊天模型 chat = ChatOpenAI(model_name="gpt-3.5-turbo") # 创建模板 template = ChatPromptTemplate.from_messages([ ("system", "你是一个乐于助人的图书馆管理员,总是用友好、专业的语气回答问题。"), ("human", "请为我推荐一些适合{age_group}阅读的{genre}类书籍,并简要说明推荐理由。") ]) # 生成消息并调用模型 messages = template.format_messages(age_group="青少年", genre="科幻") response = chat(messages) print("AI的回答:") print(response.content)4. Few-Shot示例模板
4.1 基础FewShotPromptTemplate
Few-Shot学习是通过提供示例来"教"模型如何完成特定任务的有效方法。以下是一个完整的示例:
from langchain.prompts import FewShotPromptTemplate, PromptTemplate # 定义示例 examples = [ {"question": "中国的首都是哪里?", "answer": "北京"}, {"question": "法国的首都是哪里?", "answer": "巴黎"} ] # 创建示例格式模板 example_template = """ Question: {question} Answer: {answer} """ example_prompt = PromptTemplate( input_variables=["question", "answer"], template=example_template ) # 创建Few-Shot提示模板 few_shot_prompt = FewShotPromptTemplate( examples=examples, example_prompt=example_prompt, prefix="请回答以下问题:", suffix="Question: {input}\nAnswer:", input_variables=["input"] ) # 生成提示 formatted_prompt = few_shot_prompt.format(input="美国的首都是哪里?") print(formatted_prompt)这个模板会生成包含示例的完整提示,帮助模型理解我们期望的问答格式。Few-Shot学习特别适用于需要特定输出格式或风格的任务。
4.2 更复杂的Few-Shot示例
对于更复杂的任务,更详细的示例:
from langchain.prompts import FewShotPromptTemplate, PromptTemplate examples = [ { "input": "蓝色的天空", "output": "天空是蓝色的,像一块巨大的蓝宝石。" }, { "input": "秋天的枫叶", "output": "枫叶在秋天变成了红色,像一团团燃烧的火焰。" } ] example_template = """ 输入:{input} 输出:{output} """ example_prompt = PromptTemplate( input_variables=["input", "output"], template=example_template ) few_shot_prompt = FewShotPromptTemplate( examples=examples, example_prompt=example_prompt, prefix="请将以下简短的描述扩展成生动的句子:", suffix="输入:{test_input}\n输出:", input_variables=["test_input"], example_separator="\n---\n" ) result = few_shot_prompt.format(test_input="宁静的夜晚") print(result)5. 结构化输出与链式调用
5.1 结构化输出解析器
在实际应用中,我们经常需要模型输出特定格式的内容,这时可以使用结构化输出解析器:
from langchain.output_parsers import StructuredOutputParser, ResponseSchema from langchain_core.prompts import PromptTemplate from langchain_openai import ChatOpenAI # 初始化模型 llm = ChatOpenAI( model_name="gpt-3.5-turbo", temperature=0.5, max_tokens=200 ) # 定义输出模式 response_schemas = [ ResponseSchema(name="content", description="The original content"), ResponseSchema(name="summary", description="The summary of the content"), ] output_parser = StructuredOutputParser.from_response_schemas(response_schemas) format_instructions = output_parser.get_format_instructions() # 创建提示模板 summarizing_prompt_template = """ {format_instructions} 总结以下文本为一个20字以内的句子: --- {content} """ prompt = PromptTemplate.from_template( summarizing_prompt_template, partial_variables={'format_instructions': format_instructions} ) # 创建链 summarizing_chain = prompt | llm | output_parser result = summarizing_chain.invoke({"content": "这是一个测试。"}) print(result)5.2 链式工作流
对于复杂任务,我们可以将多个Prompt链式组合:
from langchain.chains import LLMChain from langchain.llms import OpenAI from langchain.prompts import PromptTemplate # 第一个链:生成主题概述 overview_prompt = PromptTemplate( input_variables=["topic"], template="简要介绍{topic}的核心概念:" ) overview_chain = LLMChain(llm=OpenAI(), prompt=overview_prompt) # 第二个链:基于概述生成详细提示 detail_prompt = PromptTemplate( input_variables=["topic", "overview"], template="基于以下概述,详细解释{topic}的应用场景:\n{overview}" ) detail_chain = LLMChain(llm=OpenAI(), prompt=detail_prompt) # 执行链 topic = "区块链" overview = overview_chain.run(topic) result = detail_chain.run(topic=topic, overview=overview) print("概述:", overview) print("详细应用:", result)6. 最佳实践与优化技巧
6.1 Prompt设计原则
根据吴恩达和OpenAI的建议,有效的Prompt设计应遵循以下原则:
- 写出清晰而具体的指示:避免模糊表述,明确任务要求
- 给模型思考的时间:对于复杂任务,提供分步指导
- 使用外部工具:结合检索、计算等工具增强模型能力
- 反复迭代优化:根据输出结果不断调整Prompt
6.2 Prompt框架应用
阿里云百炼推荐的Prompt框架包含以下要素:
- 背景:介绍任务相关背景信息
- 目的:明确指出期望完成的具体任务
- 风格:指定输出内容的写作风格
- 语气:定义应有的语气(正式、诙谐等)
- 受众:明确面向的读者群体
- 输出:规定输出的具体形式
6.3 调试与优化
在实际开发中,Prompt调试是一个迭代过程:
- 持续优化:多次尝试和调整,不断改进Prompt
- 分析反馈:观察模型响应,分析优点和不足
- 寻求帮助:参考社区经验和最佳实践