AWS Langfuse AI使用完全教程
推荐超级课程:
@TOC
Langfuse是什么?
是用于监控和调试LLM应用程序的集成工具。有免费的自部署版和可用的SaaS型Cloud版。
本次动手实践将使用简单的Cloud版。个人使用的话可以免费开始。
准备工作
创建Langfuse账户
从官网右上角的“Sign Up”注册Cloud版。
与Google或GitHub账户关联会更方便。
需要选择区域,但EU/US都可以。
###创建AWS账户
请参考以下步骤注册。需要信用卡。
1.创建LLM应用程序
启用Bedrock模型
- 登录AWS管理控制台( https://console.aws.amazon.com/ ),从首页右上角将区域切换至“俄勒冈”。
- 在搜索框中搜索“Bedrock”,移动到Bedrock控制台。
- 从左侧边栏底部的“模型访问”中选择“启用所有模型”,继续向导。
- 在“用例详情”中大致输入公司名称等。目标用户选择“公司员工”,用例说明填写“动手实践”并继续。
- 发送请求后,几分钟内就能访问生成AI模型。在等待的时候继续下一步。
- 发送请求后,一些旧模型会显示错误,但本次不使用,所以可以忽略。
本次动手实践仅使用AWS的俄勒冈区域。因为Bedrock的模型调用速率限制较宽松。
运行LLM应用程序
在搜索框中搜索“CloudShell”,全屏打开CloudShell。关闭“欢迎”弹出窗口。
在本地电脑上打开文本编辑器(记事本等),复制以下代码并保存为“1_bedrock.py”。
1_bedrock.py
import boto3
# 调用Bedrock推理API的函数
def invoke_bedrock(prompt):
bedrock = boto3.client("bedrock-runtime")
response = bedrock.converse(
modelId="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
messages=[
{
"role": "user",
"content": [{"text": prompt}]
}
]
)
output = response["output"]["message"]["content"][0]["text"]
return output
# 调用上述函数并输出结果的主函数
def main(input):
output = invoke_bedrock(input)
print(output)
return output
# 调用主函数并传入输入
main("Langfuse是什么?")
- 通过CloudShell右上角的「操作 > 文件上传」上传上述文件。
- 在CloudShell的终端中执行
python 1_bedrock.py
命令,确认应用程序的输出结果。
如果上传后需要修改内容,请在CloudShell中执行 rm 1_bedrock.py
删除该文件,然后重新上传修改后的文件。
- 操作记录 =============
设置Langfuse Cloud
- 访问Langfuse的管理界面(https://cloud.langfuse.com )并登录。
- 点击「New Organization」创建一个组织,可以随意命名。(例如:自己的昵称等)
- 「Organization Members」保持默认设置,点击「Next」继续。
- 在「New Project」页面中,为本次动手实践创建一个名为
langfuse-night
的项目。 - 点击「Create API Key」按钮显示认证信息。
- 在本地电脑上打开记事本等文本编辑器,复制以下命令。将每行等号右边的部分替换为自己的Langfuse认证信息,并保持这个记事本打开,以便后续使用。(由于包含机密信息,建议在动手实践结束后删除,不要保存)
export LANGFUSE_SECRET_KEY=sk-XXXXXXXXXXXXXXXXXXXXXX
export LANGFUSE_PUBLIC_KEY=pk-XXXXXXXXXXXXXXXXXXXXXX
export LANGFUSE_HOST=https://XXXXXXX.langfuse.com
- 将上述替换为自己Langfuse认证信息的命令复制粘贴到CloudShell中执行。(会出现「粘贴多行文本」的警告,但没有问题,请继续粘贴并执行。)这样环境变量就设置好了,直到关闭该终端标签,Langfuse的连接设置都会被记住。
为自己的应用程序添加追踪装置
- 在本地电脑上打开记事本等文本编辑器,复制以下代码并保存为
2_trace.py
。
2_trace.py
import boto3
from langfuse.decorators import observe # 添加
@observe() # 添加
def invoke_bedrock(prompt):
bedrock = boto3.client("bedrock-runtime")
response = bedrock.converse(
modelId="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
messages=[
{
"role": "user",
"content": [{"text": prompt}]
}
]
)
output = response["output"]["message"]["content"][0]["text"]
return output
@observe() # 添加
def main(input):
output = invoke_bedrock(input)
print(output)
return output
main("Langfuse是什么?")
与原始代码相比,只是导入了Langfuse的模块并添加了 @observe()
装饰器。很简单!
- 通过CloudShell右上角的「操作 > 文件上传」上传上述文件。
- 在CloudShell中执行
pip install langfuse
安装Python用的Langfuse库。 - 在CloudShell的终端中执行
python 2_trace.py
命令,确认应用程序的输出结果。 - 移动到Langfuse的仪表板,从左侧边栏的「Tracing > Traces」查看执行结果的追踪。
- 管理提示词 ==============
在Langfuse中注册提示词模板
- 点击Langfuse左侧边栏的「Prompts」,执行「Create Prompt」创建以下提示词。
- Name:
what-is
- Prompt:
{{name}} 是什么?
- 其他保持默认设置即可
- Name:
从自己的应用程序中调用Langfuse的提示词
- 在本地电脑上打开文本编辑器(如记事本),复制以下代码并粘贴,保存为「3_prompt.py」。
3_prompt.py
import boto3
from langfuse.decorators import observe
from langfuse import Langfuse # 添加
# 添加:从Langfuse获取提示词的函数
def get_prompt(word):
langfuse = Langfuse()
prompt = langfuse.get_prompt("what-is")
compiled_prompt = prompt.compile(name=word)
return compiled_prompt
@observe()
def invoke_bedrock(prompt):
bedrock = boto3.client("bedrock-runtime")
response = bedrock.converse(
modelId="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
messages=[
{
"role": "user",
"content": [{"text": prompt}]
}
]
)
output = response["output"]["message"]["content"][0]["text"]
return output
@observe()
def main(input):
prompt = get_prompt(input) # 添加
output = invoke_bedrock(prompt)
print(output)
return output
main("Langfuse") # 更改参数
相对于原始代码,添加了「提示词获取函数」。内容只是创建Langfuse实例并执行 get_prompt
方法。
可以理解为,接收到的关键词被代入到提示词模板中的变量里。
- 通过CloudShell右上角的「操作 > 文件上传」上传上述文件。
- 在CloudShell的终端中执行
python 3_prompt.py
,确认应用程序的输出结果。 - 为了确认是否正确使用了提示词模板,可以检查Langfuse追踪中的
invoke_bedrock
函数的输入。
- 评估LLM应用程序的生成结果 ====================
创建IAM用户并获取访问密钥
在AWS管理控制台中搜索“IAM”,访问IAM控制台。
点击左侧边栏的“用户”,然后点击“创建用户”,按照以下设置。(未提及的部分使用默认设置即可)
- 用户名:
langfuse
- 许可选项:直接附加策略
- 许可策略:搜索并勾选“AmazonBedrockFullAccess”
- 用户名:
创建后,点击用户名“langfuse”,然后点击“创建访问密钥”。(未提及的部分使用默认设置即可)
- 用例:第三方服务
- 勾选“我理解上述建议,创建访问密钥”
- 显示的访问密钥和秘密访问密钥将在下一步立即使用。这个页面一旦关闭就无法再次打开,所以请保持打开状态,不要关闭。
在Langfuse中设置评估器
- 在Langfuse左侧边栏中打开“Evaluation > LLM-as-a-Judge”,然后点击“Create Evaluator”。
- 在“Select a template”中选择“Create new template”,按照以下设置。(未提及的部分使用默认设置即可)
- 选择Langfuse管理的模板:Correctness
- 模型 > 点击“+ Add new LLM API key”
- 提供商名称:
Claude 3.5 Sonnet v2
- LLM适配器:bedrock
- AWS区域:
us-west-2
- AWS访问密钥ID:从上述IAM页面复制粘贴
- AWS秘密访问密钥:从上述IAM页面复制粘贴
- 自定义模型:
us.anthropic.claude-3-5-sonnet-20241022-v2:0
(通过“+ Add custom model name”添加)
- 提供商名称:
由于Claude模型的初始配额比较严格,为了不触及速率限制,我们将评估器使用的模型与应用程序本体使用的模型稍微做了改动。
保存上述所有设置后,在“Create evaluator”页面选择“correctness”。
在“Variable mapping”部分右侧按照以下设置,然后保存Evaluator。
- {{query}}
- 对象:Span
- 对象名称:
invoke_bedrock
- 对象变量:Input
- {{generation}}
- 对象:Trace
- 对象变量:Output
- {{ground_truth}}
- 对象:Span
- 对象名称:
get_truth
- 对象变量:Output
- {{query}}
评估自己的应用程序输出
- 在本地电脑上打开文本编辑器(如记事本),复制以下代码并保存为名为「4_eval.py」的文件。
4_eval.py
import boto3
from langfuse.decorators import observe
from langfuse import Langfuse
def get_prompt(word):
langfuse = Langfuse()
prompt = langfuse.get_prompt("what-is")
compiled_prompt = prompt.compile(name=word)
return compiled_prompt
# 添加:定义获取正解数据的函数
@observe()
def get_truth(word):
truth = ""
if word == "小明":
truth = "小明是一个聪明的程序员。"
return truth
@observe()
def invoke_bedrock(prompt):
bedrock = boto3.client("bedrock-runtime")
response = bedrock.converse(
modelId="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
messages=[
{
"role": "user",
"content": [{"text": prompt}]
}
]
)
output = response["output"]["message"]["content"][0]["text"]
return output
@observe()
def main(input):
prompt = get_prompt(input)
get_truth(input) # 添加
output = invoke_bedrock(prompt)
print(output)
return output
main("小明") # 更改输入单词
- 通过CloudShell右上角的「操作 > 文件上传」上传上述文件。
- 在CloudShell的终端中执行
python 4_eval.py
,确认应用程序的输出结果。 - Langfuse侧之前设置的评估器将会在数秒后评估这个生成结果。点击Evaluators的ID,确认评估结果的分数和评论。(评论容易被截断,可以通过工具栏图标扩展行宽来查看)
由于没有使用RAG(Retrieval-Augmented Generation)的LLM很少能够正确解释“小明”,所以Correctness的分数可能是0分。
虽然不明显,但get_truth
函数只是用于评估时获取正解数据,并没有像RAG那样将正确答案告诉应用程序本身。所以这就是为什么会出现幻觉。
- 管理数据集 ===============
在前一项中,我们将正解数据硬编码在函数内,现在让我们将其作为数据集注册到Langfuse中使用。
在Langfuse的左侧边栏「Datasets」中,点击「New Dataset」按照以下设置。(未提及的部分使用默认设置即可)
- Name:
truth
- Name:
通过「New Item」按照以下设置。(未提及的部分使用默认设置即可)
- Input:
{"text": "小明"}
- Expected output:
{"text": "小明是一个聪明的程序员。"}
- Input:
从自己的应用程序中使用数据集
- 在本地电脑上打开文本编辑器(如记事本),复制以下代码并保存为名为「5_dataset.py」的文件。
5_dataset.py
import boto3
from langfuse.decorators import observe
from langfuse import Langfuse
def get_prompt(word):
langfuse = Langfuse()
prompt = langfuse.get_prompt("what-is")
compiled_prompt = prompt.compile(name=word)
return compiled_prompt
# 更新:从Langfuse获取正解数据的函数
@observe()
def get_truth(word):
langfuse = Langfuse()
dataset = langfuse.get_dataset("truth")
truth = ""
for item in dataset.items:
if item.input["text"] == word:
truth = item.expected_output
return truth
@observe()
def invoke_bedrock(prompt):
bedrock = boto3.client("bedrock-runtime")
response = bedrock.converse(
modelId="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
messages=[
{
"role": "user",
"content": [{"text": prompt}]
}
]
)
output = response["output"]["message"]["content"][0]["text"]
return output
@observe()
def main(input):
prompt = get_prompt(input)
get_truth(input)
output = invoke_bedrock(prompt)
print(output)
return output
main("小明")
- 通过CloudShell右上角的「操作 > 文件上传」上传上述文件。
- 在CloudShell的终端中执行
python 5_dataset.py
命令,确认应用程序的输出结果。 - 通过追踪检查是否正确地从Langfuse获取了正解数据。
清理工作
- 如果一段时间内不使用AWS账户,可以考虑注销。届时,由于注册的邮箱地址在AWS中将无法再次使用,建议先将邮箱更改为临时邮箱后再进行注销。