LangSmith 学习 - 01
1. 介绍
学习 LangSmith 的基础知识 —— 这是一个用于构建大语言模型(LLM)应用的平台,无论你是否使用 LangChain 都可以使用它。借助 LangSmith 提供的 LLM 可观测性、评估和提示词工程工具,你可以持续改进你的应用程序。
-
LangSmith: 是一个平台,专为开发基于大语言模型的应用而设计。
-
不局限于 LangChain: 即使你没有用 LangChain 框架,也能用 LangSmith 来观察和优化你的应用。
-
可观测性(Observability): 可以看到 LLM 应用的运行情况,比如模型调用、输入输出、延迟、错误等。
-
** 评估(Evaluation):** 对模型生成的内容进行评估。
-
提示词工程(Prompt Engineering): 设计和优化输入给 LLM 的提示词,让模型输出更理想的结果。
总结来说,LangSmith 是一个帮助你构建、测试、观察和优化 LLM 应用的强大平台。
2. 注册并登录
https://smith.langchain.com/
导航到 Settings > API Keys, 然后创建API Key
3. 拉取官方的教学项目
git clone https://github.com/langchain-ai/intro-to-langsmith.git
将项目下的 .env.example 复制为 .env, 然后填入自己的OPENAI_API_KEY 和 LANGCHAIN_API_KEY
4. 创建虚拟环境

5. 激活环境并安装依赖
ls-academy\Scripts\activate
pip install -r requirements.txt
6. 启动jupyter
(ls-academy) D:\Code\VS\intro-to-langsmith-main>jupyter notebook
7. 运行测试
7.1 代码
对教程中的代码做了调整,调用本地ollama模型
rag_application_ollama.ipynb
from langsmith import traceable
from typing import List
import nest_asyncio
import requests
from utils_ollama import get_vector_db_retriever
# 基本配置
MODEL_PROVIDER = "ollama"
MODEL_NAME = "qwen3:0.6b"
APP_VERSION = 1.0
OLLAMA_BASE_URL = "http://localhost:11434"
RAG_SYSTEM_PROMPT = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the latest question in the conversation.
If you don't know the answer, just say that you don't know.
Use three sentences maximum and keep the answer concise.
"""
# 初始化
nest_asyncio.apply()
retriever = get_vector_db_retriever()
"""
retrieve_documents
- Returns documents fetched from a vectorstore based on the user's question
"""
@traceable(run_type="chain")
def retrieve_documents(question: str):
return retriever.invoke(question)
"""
call_ollama
- Returns the chat completion output from a local Ollama model
"""
@traceable(run_type="llm")
def call_ollama(
messages: List[dict],
model: str = MODEL_NAME,
temperature: float = 0.0
) -> str:
# 格式化 prompt 为传统风格
prompt = "\n".join(
[f"{m['role'].capitalize()}: {m['content']}" for m in messages]
) + "\nAssistant:"
response = requests.post(
f"{OLLAMA_BASE_URL}/api/generate",
json={
"model": model,
"prompt": prompt,
"temperature": temperature,
"stream": False
}
)
response.raise_for_status()
return response.json()["response"]
"""
generate_response
- Calls `call_ollama` to generate a model response after formatting inputs
"""
@traceable(run_type="chain")
def generate_response(question: str, documents):
formatted_docs = "\n\n".join(doc.page_content for doc in documents)
messages = [
{
"role": "system",
"content": RAG_SYSTEM_PROMPT
},
{
"role": "user",
"content": f"Context: {formatted_docs} \n\n Question: {question}"
}
]
return call_ollama(messages)
"""
langsmith_rag
- Calls `retrieve_documents` to fetch documents
- Calls `generate_response` to generate a response based on the fetched documents
- Returns the model response
"""
@traceable(run_type="chain")
def langsmith_rag(question: str):
documents = retrieve_documents(question)
response_text = generate_response(question, documents)
return response_text
utils_ollama.py
import os
import tempfile
import requests
from typing import List
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders.sitemap import SitemapLoader
from langchain_community.vectorstores import SKLearnVectorStore
class OllamaEmbeddings:
"""
使用 Ollama 本地模型生成文本嵌入,兼容 LangChain Embedding 接口
需要先运行模型:ollama run nomic-embed-text
"""
def __init__(self, model: str = "bge-m3:latest"):
self.model = model
self.base_url = "http://localhost:11434"
def embed_documents(self, texts: List[str]) -> List[List[float]]:
return [self.embed_query(text) for text in texts]
def embed_query(self, text: str) -> List[float]:
response = requests.post(
f"{self.base_url}/api/embeddings",
json={"model": self.model, "prompt": text}
)
response.raise_for_status()
return response.json()["embedding"]
def get_vector_db_retriever():
"""
返回一个文档检索器:
- 若缓存存在,则直接加载本地 Vector Store
- 否则,抓取 LangSmith 文档 sitemap,切分并创建新的向量数据库
"""
persist_path = os.path.join(tempfile.gettempdir(), "union.parquet")
embd = OllamaEmbeddings() # 使用本地 Ollama 嵌入模型
# 如果本地已存在向量库,则加载
if os.path.exists(persist_path):
vectorstore = SKLearnVectorStore(
embedding=embd,
persist_path=persist_path,
serializer="parquet"
)
return vectorstore.as_retriever(lambda_mult=0)
# 否则重新加载 sitemap 文档,切分并构建向量数据库
print("Loading and indexing documents from LangSmith sitemap...")
ls_docs_sitemap_loader = SitemapLoader(
web_path="https://docs.smith.langchain.com/sitemap.xml",
continue_on_failure=True
)
ls_docs = ls_docs_sitemap_loader.load()
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=500, chunk_overlap=0
)
doc_splits = text_splitter.split_documents(ls_docs)
vectorstore = SKLearnVectorStore.from_documents(
documents=doc_splits,
embedding=embd,
persist_path=persist_path,
serializer="parquet"
)
vectorstore.persist()
print("Vector store created and persisted.")
return vectorstore.as_retriever(lambda_mult=0)
7.2 问题
-
问题1
使用 jupyter notebook 调用后,在langSmith界面始终看不到记录;
用 VS Code 打开项目,执行模型调用却可以看到记录。
检查了变量也能正确的获取到,目前不清楚是什么原因了。 -
问题2
.env文件中设置的是
LANGCHAIN_API_KEY="lsv2_**************"
LANGCHAIN_TRACING_V2="true"
LANGCHAIN_PROJECT="langsmith-academy"
但是教程项目代码里设置的是
import os
os.environ["LANGSMITH_API_KEY"] = "lsv2_******************"
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_PROJECT"] = "langsmith-academy"
os.environ["LANGCHAIN_ENDPOINT"] = "https://api.smith.langchain.com"
到底要用那个呢,目前测试情况是要用 .env 中的设置, LANGSMITH开头的变量好像没啥用, 这些有待进一步确认。
另外,每次打开VS Code,自动就会加载.env中的变量(如果修改了.env用重启一下vs code), 直接就可以运行模型调用的代码,但是jupyter中需要去运行加载的代码才行。
- 问题3
运行测试程序时,有可能有如下图的报错, 网络问题,调用的日志信息无法发送到langsmith的api上。
7.3 两个方式
- With LangChain
简单的示例
from langchain_ollama import ChatOllama
llm = ChatOllama(model="qwen3:0.6b", base_url="http://127.0.0.1:11434", stream=True)
llm.invoke("Hello, world!")
- Without LangChain
运行教程里的示例
question = "What is LangSmith used for?"
ai_answer = langsmith_rag(question, langsmith_extra={"metadata": {"website": "www.google.com"}})
print(ai_answer)
7.4 LangSmith界面


8. 附录
官方文档
https://docs.smith.langchain.com/
官方教程
https://academy.langchain.com
通过网盘分享的文件:LangChain_Academy_-_Intro_to_LangSmith_Course_Slides.pdf
链接: https://pan.baidu.com/s/1kqvaZtohdA7Sg1W3REudvQ?pwd=g671 提取码: g671
更多推荐

所有评论(0)