前言
由于用默认的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