AWS Langfuse AI使用完全教程

2025-04-04T14:55:34+08:00 | 8分钟阅读 | 更新于 2025-04-04T14:55:34+08:00

Macro Zhao

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 删除该文件,然后重新上传修改后的文件。

  1. 操作记录 =============

设置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」查看执行结果的追踪。

  1. 管理提示词 ==============

在Langfuse中注册提示词模板

  • 点击Langfuse左侧边栏的「Prompts」,执行「Create Prompt」创建以下提示词。
    • Name: what-is
    • Prompt: {{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 函数的输入。
  1. 评估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

评估自己的应用程序输出

  • 在本地电脑上打开文本编辑器(如记事本),复制以下代码并保存为名为「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那样将正确答案告诉应用程序本身。所以这就是为什么会出现幻觉。

  1. 管理数据集 ===============

在前一项中,我们将正解数据硬编码在函数内,现在让我们将其作为数据集注册到Langfuse中使用。

  • 在Langfuse的左侧边栏「Datasets」中,点击「New Dataset」按照以下设置。(未提及的部分使用默认设置即可)

    • Name: truth

  • 通过「New Item」按照以下设置。(未提及的部分使用默认设置即可)

    • Input: {"text": "小明"}
    • Expected output: {"text": "小明是一个聪明的程序员。"}

从自己的应用程序中使用数据集

  • 在本地电脑上打开文本编辑器(如记事本),复制以下代码并保存为名为「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中将无法再次使用,建议先将邮箱更改为临时邮箱后再进行注销。

© 2011 - 2025 Macro Zhao的分享站

关于我

如遇到加载502错误,请尝试刷新😄

Hi,欢迎访问 Macro Zhao 的博客。Macro Zhao(或 Macro)是我在互联网上经常使用的名字。

我是一个热衷于技术探索和分享的IT工程师,在这里我会记录分享一些关于技术、工作和生活上的事情。

我的CSDN博客:
https://macro-zhao.blog.csdn.net/

欢迎你通过评论或者邮件与我交流。
Mail Me

推荐好玩(You'll Like)
  • AI 动·画
    • 这是一款有趣·免费的能让您画的画中的角色动起来的AI工具。
    • 支持几十种动作生成。
我的项目(My Projects)
  • 爱学习网

  • 小乙日语App

    • 这是一个帮助日语学习者学习日语的App。
      (当然初衷也是为了自用😄)
    • 界面干净,简洁,漂亮!
    • 其中包含 N1 + N2 的全部单词和语法。
    • 不需注册,更不需要订阅!完全免费!
  • 小乙日文阅读器

    • 词汇不够?照样能读日语名著!
    • 越读积累越多,积跬步致千里!
    • 哪里不会点哪里!妈妈再也不担心我读不了原版读物了!
赞助我(Sponsor Me)

如果你喜欢我的作品或者发现它们对你有所帮助,可以考虑给我买一杯咖啡 ☕️。这将激励我在未来创作和分享更多的项目和技术。🦾

👉 请我喝一杯咖啡

If you like my works or find them helpful, please consider buying me a cup of coffee ☕️. It inspires me to create and share more projects in the future. 🦾

👉 Buy me a coffee