Claudeception:使用LangChain教导Claude进行自动提示工程
Published on
简介
Anthropic的强大AI助手Claude展示了出色的语言理解和生成能力。最近发布的Claude 3模型,尤其是Opus变体,在提示工程方面表现出色 - 这是设计有效提示以从语言模型产生高质量输出的艺术。
这个开辟了一个令人兴奋的可能性:如果我们可以利用Claude的提示工程能力来迭代改进自身的提示呢?通过让Claude 3分析从初始提示生成的输出质量并提出改进意见,我们可以创建一个自动化的反馈循环来优化给定任务的提示。
在本文中,我们将介绍如何使用Claude 3 Opus和LangChain实现这种自我改进的提示策略。我们将应用它来总结AI研究员Elvis Saravia(Twitter上的@omarsar0)的学术论文,以引人入胜的方式。
提示工程工作流程
Alex Albert(Twitter上的@alexalbert__)最近分享了使用Claude 3 Opus进行提示工程的有效工作流程:
- 为任务编写初始提示
- 生成一组用于评估提示的测试输入
- 在测试用例上运行提示
- 手动审查和评分输出
- 将分级示例反馈到Claude 3 Opus,并要求其修改提示
- 重复进行
Will Hinthorn(Twitter上的@WHinthorn)和Ross Lance Martin(Twitter上的@rlancemartin)演示了如何使用LangSmith简化这个流程:
- 创建一组测试用例数据集
- 用反馈注释生成的输出
- 将反馈传递给Claude 3 Opus以重写提示
- 将其作为迭代改进循环运行
让我们看看如何为总结Elvis Saravia的学术论文以他的Twitter线索风格实现这个方法。
步骤1:将论文加载到数据集中
首先,我们选择一些Elvis发推文提到的论文,并使用LangChain的ArxivLoader加载它们:
from langchain_community.document_loaders import ArxivLoader
ids = ["2403.05313", "2403.04121", "2402.15809"]
docs = []
for paper_id in ids:
doc = ArxivLoader(query=paper_id, load_max_docs=1).load()
docs.extend(doc)
然后将论文文本添加到LangSmith数据集中:
from langsmith import Client
client = Client()
ds_name = "Tweet生成器"
ds = client.create_dataset(dataset_name=ds_name)
client.create_examples(
inputs=[{"paper": doc.page_content} for doc in docs], dataset_id=ds.id
)
步骤2:用初始提示进行测试
接下来,我们为Claude 3 Opus编写一个合理的初始提示,以生成论文摘要推文:
from langchain_anthropic import ChatAnthropic
from langchain_core.prompts import ChatPromptTemplate
chat = ChatAnthropic(temperature=0, model_name="claude-3-opus-20240229")
system = (
"<role> 你是一个助手,负责生成用于概括/总结学术论文或开源项目的推文。它应该"
"经过精心设计,但避免使用噱头或过度依赖流行词。 </role>"
)
human = "这是一篇要转化为推文的论文:<paper> {paper} </paper>"
current_prompt_str = system + human
prompt = ChatPromptTemplate.from_messages([("system", system), ("human", human)])
tweet_generator = prompt | chat
我们可以在一个示例论文上进行测试:
tweet_example = tweet_generator.invoke({"paper": docs[0].page_content})
print(tweet_example)
这将生成一篇不错的论文摘要推文。
步骤3:在数据集上运行
为了更全面地评估提示,我们将其在完整的论文数据集上运行:
res = client.run_on_dataset(
dataset_name=ds_name,
llm_or_chain_factory=tweet_generator,
)
步骤4:手动评估输出
我们可以使用LangSmith的注释队列功能手动审查和提供对生成推文的反馈:
q = client.create_annotation_queue(name="Tweet生成器")
client.add_runs_to_annotation_queue(
q.id,
run_ids=[
r.id
for r in client.list_runs(project_name=res["project_name"], execution_order=1)
],
)
为了进行评估,我们可以参考一些Elvis实际的论文摘要推文,作为目标风格和内容的示例。
步骤5:改进提示
在对输出进行注释之后,我们获取结构化的反馈:
formatted_feedback = get_formatted_feedback(res["project_name"])
然后,我们使用LangChain Hub提供的提示优化模板将其反馈到Claude 3 Opus:
from langchain import hub
from langchain_core.output_parsers import StrOutputParser
optimizer_prompt = hub.pull("rlm/prompt-optimizer-tweet-drafts")
optimizer = optimizer_prompt | chat | StrOutputParser() | extract_new_prompt
new_prompt_str = optimizer.invoke(
{
"current_prompt": current_prompt_str,
"annotated_predictions": "\n\n".join(formatted_feedback).strip(),
}
)
这将生成一个改进的提示,其中融入了反馈以更好地匹配Elvis的写作风格和线索结构。
第6步:评估新提示
最后,我们可以再次在数据集上运行更新后的提示,以检查改进效果:
new_prompt = ChatPromptTemplate.from_messages([("user", new_prompt_str)])
tweet_generator_v2 = new_prompt | chat
updated_results = client.run_on_dataset(
dataset_name=ds_name,
llm_or_chain_factory=tweet_generator_v2,
)
对比原始提示和修订后提示的输出结果表明,与Claude 3 Opus的反馈循环在调整提示以产生更具吸引力和Elvis风格的论文摘要方面非常有效。
例如,下面是一个新的测试论文的初始和改进提示生成的推文:
初始提示:
关于使用大型语言模型(LLM)进行表格数据任务(如预测、生成和问答)的新调查。涵盖了序列化、提示工程和基准等关键技术。识别了机会和挑战。
改进提示:
揭开表格数据的LLM潜力 🔑
这次全面的调查探索了如何将大型语言模型应用于表格数据的预测、生成和理解等任务。
涵盖的关键技术:
- 将表格序列化为LLM可读格式
- 调整表格以适应上下文长度
- 提示工程技巧
- 构建端到端系统
该论文为每个应用领域提供了数据集、指标和方法的分类体系。它还讨论了当前的局限性和未来的研究方向。
LLM在与适当的预处理步骤和提示策略相结合时,对处理结构化数据显示出巨大的潜力。这为智能和自动化的系统分析表格数据打开了令人兴奋的可能性。
你对LLM在处理结构化数据的其他创新应用有什么预见?🤔
修订后的推文更好地分解了关键要点,添加了可视化兴趣的表情符号,并以引人思考的问题结束,以吸引观众的注意力,这些都是Elvis风格的典型元素。
结论
结合Claude 3 Opus的提示工程能力和LangChain和LangSmith框架,我们能够创建一个自动化的反馈循环,逐步优化某种特定写作风格下的论文摘要提示。
这证明了一种强大的通用方法,可以根据特定规范来调整语言模型的性能,或者模仿目标风格。同样的技术也可以应用于自动改进各种其他文本生成任务的提示。
随着语言模型的不断进步,我们可以预期会出现更复杂的提示工程工具和工作流程,以最大限度地发挥它们的潜力。像LangChain这样的框架将在扩大开发者范围和开启令人兴奋的新应用方面发挥关键作用。