【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

07-16 1073阅读

  • 大家好,我是同学小张,日常分享AI知识和实战案例
  • 欢迎 点赞 + 关注 👏,持续学习,持续干货输出。
  • +v: jasper_8017 一起交流💬,一起进步💪。
  • 微信公众号也可搜【同学小张】 🙏

    本站文章一览:

    【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)


    前面我们介绍了LangChain无缝衔接的LangSmith平台,可以跟踪程序运行步骤,提供详细调试信息,同时支持数据集收集和自动化测试评估等功能,极大方便了AI大模型应用程序的开发过程。

    本文来介绍另一款生产级AI应用维护平台:LangFuse,它是开源的,是LangSmith 的平替,并且它可集成 LangChain,同时也可直接对接 OpenAI API。

    官方网站:https://langfuse.com/

    项目地址:https://github.com/langfuse

    0. 环境准备

    (1)先注册,登录,官网地址在上面

    (2)创建Project

    【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

    (3)生成私钥和公钥

    【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

    【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

    一定要复制并记录下这个私钥和公钥,关闭这个窗口后,私钥就再也看不到了。

    (4)本地安装 langfuse

    pip install --upgrade langfuse
    

    1. 开始使用

    LangFuse有两种集成方式:

    • OpenAI API集成
    • LangChain集成

      在运行之前,先将你的公钥和私钥放到环境变量中。例如.env文件中加入:

      LANGFUSE_SECRET_KEY = "sk-lf-xxxxx"
      LANGFUSE_PUBLIC_KEY = "pk-lf-xxxxx"
      

      这样才能使你的程序与你在LangFuse官网上建立的跟踪项目链接起来。

      不了解怎么写.env文件的可以看下我前面的文章:【AI大模型应用开发】0. 开篇,用OpenAI API写个Hello World !

      1.1 OpenAI API集成方式

      集成步骤:

      (1)引入langfuse中的openai:from langfuse.openai import openai,用这个才能集成langfuse

      (2)使用Langfuse实例的trace函数,传入一些个人和项目信息

      (3)openai接口调用,多了一个trace_id参数

      from datetime import datetime
      from langfuse.openai import openai ## 1. 引入langfuse中的openai
      from langfuse import Langfuse  
      import os
      ## 2. 使用Langfuse实例的trace函数,传入一些个人和项目信息
      trace = Langfuse().trace( 
          name = "hello-world",
          user_id = "同学小张",
          release = "v0.0.1"
      )
      completion = openai.chat.completions.create(
        name="hello-world",
        model="gpt-3.5-turbo",
        messages=[
            {"role": "user", "content": "对我说'Hello, World!'"}
        ],
        temperature=0,
        trace_id=trace.id, ## 3. openai接口调用,多了一个trace_id参数
      )
      print(completion.choices[0].message.content)
      ## 输出:Hello, World!
      

      运行之后看下LangFuse平台,应该能看到你的项目和调用了。

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      1.2 LangChain集成方式

      通过 LangChain 的回调集成。

      集成步骤:

      (1)从langfuse中引入CallbackHandler:from langfuse.callback import CallbackHandler

      (2)在CallbackHandler中设置个人和项目信息

      (3)正常创建LangChain应用和流程

      (4)invoke时,将CallbackHandler填入config参数中:config={"callbacks":[handler]}

      from langfuse.callback import CallbackHandler
      handler = CallbackHandler(
          trace_name="SayHello",
          user_id="同学小张",
      )
      from langchain_openai import ChatOpenAI
      from langchain.prompts import PromptTemplate
      from langchain.schema.output_parser import StrOutputParser
      from langchain.schema.runnable import RunnablePassthrough
      from langchain.schema import HumanMessage
      from langchain.prompts.chat import HumanMessagePromptTemplate
      from langchain.prompts import ChatPromptTemplate
      model = ChatOpenAI(model="gpt-3.5-turbo-0613")
      prompt_template = """
      我的名字叫【{name}】,我的个人介绍是【{description}】。
      请根据我的名字和介绍,帮我想一段有吸引力的自我介绍的句子,以此来吸引读者关注和点赞我的账号。
      """
      prompt = ChatPromptTemplate.from_messages([
          HumanMessagePromptTemplate.from_template(prompt_template)
      ])
      # 定义输出解析器
      parser = StrOutputParser()
      chain = (
          {"name":RunnablePassthrough(), "description":RunnablePassthrough() } ## 这里是给prompt的输入,两个参数
          | prompt
          | model
          | parser
      )
      ## invoke的第一个参数,传入json格式的参数,key与prompt中的参数名一致
      response = chain.invoke({'name': '同学小张', 'description': '热爱AI,持续学习,持续干货输出'}, config={"callbacks":[handler]})
      print(response)
      

      运行之后看下LangFuse平台,应该能看到你的项目和调用了。

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      2. 详细信息查看 - Traces页面

      使用Traces页面,可以看到你每次程序运行的详细过程,包括每一步的输入、输出、耗时、token数等。

      (1)进入Traces,可以看到你所有的运行目录。

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      (2)点击上方的任一ID,可以进入到本次运行的详细跟踪页面。该页面包含了本次运行的过程:详细执行步骤(右侧)。点击任一步骤,可以在左侧看到本步骤的输入和输出,以及耗时和token数(图中的148->241表示输入148token,输出241token)。

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      有了这个页面,你可以轻易的跟踪输入输出是否有问题,哪一步有问题,从而更好的调优你的程序。这个比自己打日志的信息更详细和更好用多了。

      3. 在线数据标注和收集

      Langfuse与LangSmith一样,也可以在线进行数据标注和收集。

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      (1)首先你需要先创建一个数据集的名称。

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      (2)如果没有事先创建数据集名称,在下面这一步无法选择dataset… 这是操作不如LangSmith的地方

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      (3)创建了数据集名称之后,下面这一步就可以正常添加了

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      (4)然后你就可以看到你添加的数据集了

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      4. 本地数据集的导入

      Langfuse除了支持在线的数据标注和收集,也支持从本地导入数据集。

      以AGI课堂中的数据集例子给大家做演示。

      数据集格式如下( .jsonl文件 ):outlines、user_input 以及 label字段,其中label为标注,也就是输出结果。

      {"outlines": "Assistants API\n✅1. OpenAI 给了我们更大空间\n✅2. 原生 API、GPTs、Assistants API、国产/开源大模型选型参考\n✅3. Assistants API 的主要能力\n✅4. 做一个自己的 GPT\n  1. 创建 assistant\n  2. 管理 thread\n  3. 添加 message\n  4. 开始 run\n  5. 中控调度\n  6. Function Calling\n  7. Code Interpreter\n  8. RAG", "user_input": "别进reddit的中文话题,那是最没营养的区域", "label": "N"}
      {"outlines": "【神秘嘉宾】大模型时代的AI产品新挑战\n1. AI 能力演进路线\n✅2. LLMs 带来的变化\n✅3. 如何将大模型落地到实际场景中\n✅4. LLMs 存在哪些问题\n✅5. LLMs 落地三要素\n✅6. LLMs 短期、中期和长期落地方向", "user_input": "对话式交互也不是所有场景都合适", "label": "N"}
      

      接口:create_dataset_item

      实现代码:

      import json
      data = []
      with open('D:\GitHub\LEARN_LLM\langsmith\my_annotations.jsonl','r',encoding='utf-8') as fp:
          for line in fp:
              example = json.loads(line.strip())
              item = {
                  "input": {
                      "outlines": example["outlines"],
                      "user_input": example["user_input"]
                  },
                  "expected_output": example["label"]
              }
              data.append(item)
              
      from langfuse import Langfuse
      from langfuse.model import CreateDatasetRequest, CreateDatasetItemRequest
      from tqdm import tqdm
      # init
      langfuse = Langfuse()
      # 考虑演示运行速度,只上传前5条数据
      for item in tqdm(data[:5]):
          langfuse.create_dataset_item(
              dataset_name="assistant-data", ## 注意:这个dataset_name需要提前在Langfuse后台创建
              input=item["input"],
              expected_output=item["expected_output"]
          )
      

      注意:dataset_name的名称需要首先在langfuse平台中手动创建。否则报错:

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      运行成功后,langfuse中可以看到上传的数据:

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      5. 数据集的测试与评估

      5.1 定义评估标准

      这里定义一个简单的标准,就是比较输出和期望的结果是否一样。

      def simple_evaluation(output, expected_output):
        return output == expected_output
      

      5.2 定义Chain

      在这里定义你的待评估的主要数据处理流程程序,也就是你的大模型应用。

      from langchain.prompts import PromptTemplate
      need_answer=PromptTemplate.from_template("""
      *********
      你是AIGC课程的助教,你的工作是从学员的课堂交流中选择出需要老师回答的问题,加以整理以交给老师回答。
       
      课程内容:
      {outlines}
      *********
      学员输入:
      {user_input}
      *********
      如果这是一个需要老师答疑的问题,回复Y,否则回复N。
      只回复Y或N,不要回复其他内容。""")
      model = ChatOpenAI(temperature=0,model_kwargs={"seed":42})
      parser = StrOutputParser()
      chain_v1 = (
          need_answer
          | model
          | parser
      )
      

      5.3 运行测试

      下面的代码中几个关键点:

      (1)ThreadPoolExecutor用来开启线程池,并行测试数据集内的测试数据,可不用,串行测试即可,只是需要花更多时间。

      (2)获取数据集的接口: dataset = langfuse.get_dataset(dataset_name)

      (3)通过callback与LangChain集成:handler = item.get_langchain_handler(run_name=run_name)

      (4)评分:handler.root_span.score,其中value为上面咱们自定义的评估标准函数

      (5)本次测试的名称:run_name,也就是“v1-xxxxx”。

      from concurrent.futures import ThreadPoolExecutor
      from functools import partial
      from langfuse import Langfuse
      langfuse = Langfuse()
      def run_evaluation(chain, dataset_name, run_name):
          dataset = langfuse.get_dataset(dataset_name)
          def process_item(item):
              handler = item.get_langchain_handler(run_name=run_name)
              
              # Assuming chain.invoke is a synchronous function
              output = chain.invoke(item.input, config={"callbacks": [handler]})
              
              # Assuming handler.root_span.score is a synchronous function
              handler.root_span.score(
                  name="accuracy",
                  value=simple_evaluation(output, item.expected_output)
              )
              print('.', end='',flush=True)
          # Using ThreadPoolExecutor with a maximum of 10 workers
          with ThreadPoolExecutor(max_workers=4) as executor:
              # Map the process_item function to each item in the dataset
              executor.map(process_item, dataset.items)
              
      run_evaluation(chain_v1, "assistant-data", "v1-"+str(uuid.uuid4())[:8])
      

      5.4 运行结果

      测试结果:

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      每个数据的测试结果及详情:

      【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

      本文到这里就结束了,在本文中,我们全面介绍了Langfuse平台的基本功能:从程序运行监控、跟踪,到数据集的创建、建立自己的评估标准,再到实际运行一个测试,得到测试结果。简单的使用,相信大家能对langfuse平台有一个全面的认识。

      如果觉得本文对你有帮助,麻烦点个赞和关注呗 ~~~


      • 大家好,我是同学小张,日常分享AI知识和实战案例
      • 欢迎 点赞 + 关注 👏,持续学习,持续干货输出。
      • +v: jasper_8017 一起交流💬,一起进步💪。
      • 微信公众号也可搜【同学小张】 🙏

        本站文章一览:

        【AI大模型应用开发】【LangFuse: LangSmith平替,生产级AI应用维护平台】0. 快速上手 - 基本功能全面介绍与实践(附代码)

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]