langsmith使用


前言

由于用默认的langchain agent碰到各种action识别错误,action input解析错误的问题,听说这个langsmith可以让我调试、测试、评估和监控基于任何 LLM 框架构建的链和智能代理的全流程。
特地来学习了解一下。

注册langsmith

官网地址:https://smith.langchain.com/
看到可以直接用Discord、GitHub、Google账号登录(也可以用自己邮箱注册),于是直接用github账号注册登录。

获取API

登录进去后在Personal页的右上角有一个Create API Key,点击后可创建一个API Key
API Key分两种:
Personal Access Key
Service Key
我各创建了一个:
Personal Access Key: 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
ServiceKey: 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

设置环境变量

Linux:
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_ENDPOINT=”https://api.smith.langchain.com
export LANGCHAIN_API_KEY=”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”
export LANGCHAIN_PROJECT=”langchain_for_llm_application_development”

Windows:
setx LANGCHAIN_TRACING_V2 true
setx LANGCHAIN_ENDPOINT “https://api.smith.langchain.com
setx LANGCHAIN_API_KEY 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
setx LANGCHAIN_PROJECT langchain_for_llm_application_development

其中:
LANGCHAIN_TRACING_V2: 设置LangChain是否开启日志跟踪模式。
LANGCHAIN_PROJECT: 跟踪项目的名称。如果LangSmith上还没有这个项目,会自动创建。如果不设置这个环境变量,会把相关信息写到default项目。
LANGCHAIN_API_KEY: 你在前面申请生成的LangSmith的API key。

设置好环境变量就可以了,代码无需任何变动!完全没有侵入性的感觉真好。当然,如果要较真的话,引入LangChain的时候代码就已经侵入了,但是我们本来就要用LangChain,那就不用管这个了。

使用

初始化smith

”’python
def initSmith(self):
try:
from dotenv import load_dotenv
load_dotenv(find_dotenv())

        LANGCHAIN_API_KEY = str(os.getenv("LANGCHAIN_API_KEY"))
        if LANGCHAIN_API_KEY == "":
            LANGCHAIN_API_KEY = "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"

        PROJECT_NAME = os.environ["LANGCHAIN_PROJECT"]
        if PROJECT_NAME == "":
            # Create id
            uid = uuid.uuid4()
            # Create a unique name
            PROJECT_NAME = "xiaoluo-test-" + str(uid)
            os.environ["LANGCHAIN_PROJECT"] = PROJECT_NAME

        os.environ["LANGCHAIN_API_KEY"] = LANGCHAIN_API_KEY
        os.environ["LANGCHAIN_TRACING_V2"] = "true"
        os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com" 

        # Initialize a langsmith client
        self._client = Client()

        # Create the project
        session = self._client.create_project(
            project_name=PROJECT_NAME,
            description="xiaoluo-3d agent tools background work flow",
        )
        logger.info(f"smith session created: {session}")
    except Exception as e:
        logger.exception(f"init lang smith failed: {str(e)}")

”’

一个正常的chain实现(无侵入),直接使用黄佳老师的例子

”’python
”’作者 黄佳”’
import warnings
warnings.filterwarnings(‘ignore’)

设置OpenAI API密钥

import os

os.environ[“OPENAI_API_KEY”] = ‘Your Key’

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
from langchain.chat_models import AzureChatOpenAI

构建两个场景的模板

flower_care_template = “””
你是一个经验丰富的园丁,擅长解答关于养花育花的问题。
下面是需要你来回答的问题:
{input}
“””

flower_deco_template = “””
你是一位网红插花大师,擅长解答关于鲜花装饰的问题。
下面是需要你来回答的问题:
{input}
“””

构建提示信息

prompt_infos = [
{
“key”: “flower_care”,
“description”: “适合回答关于鲜花护理的问题”,
“template”: flower_care_template,
},
{
“key”: “flower_decoration”,
“description”: “适合回答关于鲜花装饰的问题”,
“template”: flower_deco_template,
}
]

初始化语言模型

from langchain.llms import OpenAI

llm = OpenAI()

llm = AzureChatOpenAI(deployment_name=”GPT-4″, temperature=0)

构建目标链

from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate

chain_map = {}

for info in prompt_infos:
prompt = PromptTemplate(
template=info[‘template’],
input_variables=[“input”]
)
print(“目标提示:\n”, prompt)

chain = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True
)
chain_map[info["key"]] = chain

构建路由链

from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE as RounterTemplate

destinations = [f”{p[‘key’]}: {p[‘description’]}” for p in prompt_infos]
router_template = RounterTemplate.format(destinations=”\n”.join(destinations))
print(“路由模板:\n”, router_template)

router_prompt = PromptTemplate(
template=router_template,
input_variables=[“input”],
output_parser=RouterOutputParser(),
)
print(“路由提示:\n”, router_prompt)

router_chain = LLMRouterChain.from_llm(
llm,
router_prompt,
verbose=True
)

构建默认链

from langchain.chains import ConversationChain
default_chain = ConversationChain(
llm=llm,
output_key=”text”,
verbose=True
)

构建多提示链

from langchain.chains.router import MultiPromptChain

chain = MultiPromptChain(
router_chain=router_chain,
destination_chains=chain_map,
default_chain=default_chain,
verbose=True
)

测试1

print(chain.run(“如何为玫瑰浇水?”))
”’

查看运行情况

运行完一个LLM chain后,返回到LangSmith网页,在网页中你可以看到这个运行的整个过程,在这里可以直接看到输入给LLM的Prompt,以及LLM返回的结果。
包括:
1。LangChain组件的调用顺序
2。耗费的时间
3。消耗的Token数。

建立数据集

在查看运行情况的界面,有一个“Add to Dataset”的功能,可以把你的LangSmith项目里的那些历史记录添加到数据集,如果你使用的LLM更换了,或者是你的Prompt调整了,可以用你自己建立的这个数据集来测试、评估。

使用Playground

LangSmith网页上还有一个Playground的功能,利用Playground功能,可以直接对你的Prompt进行迭代,可以直接修改Prompt来看输出的结果。
进入Playground可以看到你历史调用记录里的各种参数、Prompt都帮你设置好了,你可以直接在这里修改调整你的Prompt,来测试和观察结果变化。

使用Langchain Hub

除了Playground功能外,还有一个Hub的功能:Explore and contribute prompts to the community hub。如同github一样,你可以在这里对Prompt进行版本控制。
同时这里也有许多别人分享出来的Prompt,你可以收藏,也可以Fork、试运行。
最妙的是,这里的prompt都做好了分类,分类细致到:
1。不同的use case:agent, chatbot等
2。不同的LLM model:openai:gpt-3.5-turbo, meta:llama-2-13b-chat, openai:gpt-4o等
3。不同的语言:中文,英文等
4。不同的类型:StringPromptTemplate,ChatPromptTemplate,StructuredPrompt

参考

LangSmith文档:https://docs.smith.langchain.com

Leave a comment

Your email address will not be published. Required fields are marked *