大语言模型 (LLM) 的应用日益广泛,但其内部工作机制往往如同一个黑盒。本文将介绍如何使用 LangSmith,一款强大的 LLM 追踪工具,来深入理解和调试 LLM 应用。我们将通过一个基于动漫《药屋少女的呢喃》的检索增强生成 (RAG) 演示案例,展示 LangSmith 如何帮助我们追踪 LLM 工作流的每一步,从而优化应用性能和提升用户体验。
1. RAG 架构与 LangSmith 的必要性
RAG (Retrieval-Augmented Generation) 是一种将检索模块与生成模块相结合的 LLM 应用架构。它首先从外部知识库中检索相关信息,然后将这些信息作为上下文提供给 LLM,以生成更准确、更丰富的答案。在复杂的 RAG 流程中,问题定位至关重要。想象一下,如果 RAG 应用返回的答案不尽如人意,我们该如何判断问题出在哪里?是检索到的信息不准确?还是 LLM 的生成环节出了问题?这时,LangSmith 就显得尤为重要。LangSmith 允许我们追踪整个 RAG 流程的每一步,包括检索到的文档、LLM 使用的提示语以及生成的最终答案,从而快速定位问题并进行改进。这对于构建高质量、可维护的 LLM 应用至关重要。
2. 案例:基于《药屋少女的呢喃》的 RAG 应用
为了更直观地展示 LangSmith 的功能,我们构建了一个基于动漫《药屋少女的呢喃》的 RAG 应用。该应用的核心功能是回答用户关于动漫剧情、人物设定的问题。例如,用户可以提问:“为什么对猫猫来说,好奇心既是礼物也是诅咒?”
该应用的工作流程如下:
- 用户提问: 用户向应用提出问题。
- 网页抓取: 应用从网络(例如 Wikipedia)抓取与《药屋少女的呢喃》相关的文本信息。
- 文本分割: 将抓取到的文本分割成更小的文本块 (chunk)。
- 向量检索: 使用向量数据库 (FAISS) 检索与用户问题最相关的文本块。
- LLM 生成: 将检索到的文本块和用户问题一起作为提示语 (prompt) 提供给 LLM (GPT-4o),生成最终答案。
- LangSmith 追踪: LangSmith 记录整个流程的每一步,包括输入、输出和中间步骤。
通过这个案例,我们可以看到 LangSmith 如何帮助我们理解 RAG 流程的细节,并发现潜在的问题。
3. LangSmith 的核心功能:追踪、调试与评估
LangSmith 提供了多种强大的功能,帮助我们追踪、调试和评估 LLM 应用:
- 追踪 (Tracing): LangSmith 可以记录 LLM 工作流的每一步,生成可视化的流程图。我们可以清晰地看到数据如何在不同的组件之间流动,以及每个组件的输入和输出。例如,在上面的 RAG 案例中,我们可以看到从 Wikipedia 抓取了哪些文本,文本是如何被分割成块的,哪些文本块被检索到,以及最终传递给 GPT-4o 的提示语是什么。这些信息对于理解 LLM 的行为至关重要。
- 调试 (Debugging): 当 LLM 应用出现问题时,LangSmith 可以帮助我们快速定位问题所在。例如,如果 RAG 应用返回的答案不准确,我们可以通过 LangSmith 查看检索到的文档是否相关。如果检索到的文档是相关的,那么问题可能出在 LLM 的生成环节。通过分析 LangSmith 提供的详细信息,我们可以更容易地找到问题并进行修复。
- 评估 (Evaluation): LangSmith 还可以帮助我们评估 LLM 应用的性能。我们可以使用 LangSmith 记录 LLM 应用的输入和输出,然后使用不同的指标来评估其准确性、流畅性和相关性。例如,我们可以使用 LangSmith 记录 RAG 应用对一组问题的回答,然后使用人工评估或自动评估方法来评估答案的质量。通过评估结果,我们可以了解 LLM 应用的优缺点,并针对性地进行改进。
- 可视化 Playground: LangSmith 提供了一个可视化的 playground, 允许你在一个图形化的界面中调整提示词,重新运行,并观察结果。这对于快速迭代和改进提示词非常有用。
例如,在一个客户服务聊天机器人的开发过程中,我们使用 LangSmith 追踪用户提问到最终回复的整个流程。通过 LangSmith 的追踪功能,我们发现某些用户提问会被错误地分类,导致 LLM 无法提供准确的答案。通过分析 LangSmith 提供的详细信息,我们发现问题出在文本分类模型的训练数据不足。我们通过增加更多的训练数据来改进文本分类模型,最终提高了聊天机器人的准确性和用户满意度。
4. 案例代码分析:集成 LangSmith 的 RAG 应用
以下代码片段展示了如何在 RAG 应用中集成 LangSmith:
from langchain.tools import Tool
from langchain.chains import RetrievalQA
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain_openai import ChatOpenAI
from langsmith import traceable
import requests
from bs4 import BeautifulSoup
from langchain_core.documents import Document
# Fetch and clean live Wikipedia page
def fetch_apothecary_text():
url = "https://en.wikipedia.org/wiki/The_Apothecary_Diaries"
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
paragraphs = soup.select("div.mw-parser-output > p")
text = "\n".join(p.get_text() for p in paragraphs if p.get_text().strip())
return text
# Convert text to LangChain Documents
def get_docs_from_web():
raw_text = fetch_apothecary_text()
splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
docs = splitter.create_documents([raw_text])
return docs
# RAG chain setup
@traceable(name="dynamic-rag-apothecary")
def ask_anime_question(query: str):
docs = get_docs_from_web()
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embeddings)
retriever = vectorstore.as_retriever()
llm = ChatOpenAI(model="gpt-4o", temperature=0.7)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
return_source_documents=True
)
result = qa_chain.invoke({"query": query})
print("Answer:\n", result["result"])
print("\n Sources:\n", result["source_documents"])
# Try it
ask_anime_question("Why is curiosity both a gift and a curse for Maomao?")
@traceable
装饰器: 通过在ask_anime_question
函数上添加@traceable(name="dynamic-rag-apothecary")
装饰器,我们可以告诉 LangSmith 追踪该函数的执行过程。LangSmith 会记录函数的输入、输出以及函数内部的每一步操作。这使得我们可以清晰地了解 LLM 应用是如何处理用户提问的。- 环境变量设置: 在运行代码之前,我们需要设置
OPENAI_API_KEY
和LANGSMITH_API_KEY
环境变量。这些环境变量用于授权访问 OpenAI 和 LangSmith 服务。 - LangSmith UI: 运行代码后,我们可以在 LangSmith 的用户界面 (https://smith.langchain.com/) 中查看追踪结果。LangSmith 会以可视化的方式展示 RAG 流程的每一步,包括检索到的文档、LLM 使用的提示语以及生成的最终答案。
通过这些代码示例,我们可以了解如何在 RAG 应用中集成 LangSmith,并利用 LangSmith 提供的功能来追踪和调试 LLM 应用。
5. 优化 RAG 流程:利用 LangSmith 提升性能
LangSmith 不仅仅是一个追踪工具,更是一个强大的优化工具。通过分析 LangSmith 提供的追踪数据,我们可以发现 RAG 流程中的瓶颈,并采取相应的措施来提升应用性能。
- 优化检索环节: 通过 LangSmith,我们可以分析检索到的文档与用户提问的相关性。如果检索到的文档与用户提问的相关性较低,我们可以尝试改进检索算法,例如使用更高级的向量数据库或调整检索参数。
- 优化 LLM 生成环节: 通过 LangSmith,我们可以查看 LLM 使用的提示语以及生成的答案。如果生成的答案不准确或不流畅,我们可以尝试优化提示语,例如增加更多的上下文信息或调整 LLM 的生成参数。
- 调整文本分割策略: 文本分割策略直接影响检索效果。LangSmith 可以帮助我们评估不同文本分割策略的效果,选择最适合我们应用的策略。例如,我们可以尝试不同的文本块大小和重叠比例,并使用 LangSmith 评估这些策略对检索结果的影响。
- 评估不同 LLM 模型: LangSmith 允许我们比较不同 LLM 模型在同一任务上的表现。我们可以使用 LangSmith 记录不同 LLM 模型对同一组问题的回答,然后使用人工评估或自动评估方法来评估答案的质量。通过比较结果,我们可以选择最适合我们应用的 LLM 模型。
例如,在构建一个电商产品搜索应用时,我们发现 RAG 应用返回的结果经常包含不相关的产品信息。通过 LangSmith 的追踪功能,我们发现问题出在文本分割环节。原始的文本分割策略将产品描述分割成过小的文本块,导致检索算法无法准确地识别产品之间的关系。我们通过调整文本分割策略,将产品描述分割成更大的文本块,从而提高了检索算法的准确性,最终改善了产品搜索结果的质量。
6. LangSmith 的未来展望:持续进化的 LLM 追踪平台
作为一款新兴的 LLM 追踪工具,LangSmith 仍在不断进化和完善。未来,我们可以期待 LangSmith 提供的更多功能:
- 更强大的评估功能: LangSmith 将提供更丰富的评估指标和更灵活的评估方法,帮助我们更全面地评估 LLM 应用的性能。
- 更智能的调试功能: LangSmith 将提供更智能的调试工具,例如自动识别问题所在和提供修复建议。
- 更深入的集成: LangSmith 将与更多的 LLM 框架和工具集成,提供更 seamless 的开发体验。
- 更完善的社区支持: LangSmith 将建立更完善的社区,方便开发者交流经验和分享最佳实践。
随着 LLM 技术的不断发展,LangSmith 作为 LLM 追踪平台的作用将越来越重要。它将帮助开发者构建更高质量、更可维护的 LLM 应用,并推动 LLM 技术在各个领域的应用。
7. 总结:拥抱 LangSmith,掌控 LLM 的力量
本文介绍了 LangSmith 的核心功能和应用案例,展示了 LangSmith 如何帮助我们追踪、调试和优化 LLM 应用。通过基于动漫《药屋少女的呢喃》的 RAG 演示案例,我们深入了解了 LangSmith 的使用方法和价值。
总而言之,LangSmith 是 LLM 开发者不可或缺的工具。它能够显著提升 LLM 开发效率,并帮助构建更强大的 LLM 应用。尤其是在 RAG 架构中,LangSmith 对于理解数据流动、排查问题和优化性能至关重要。拥抱 LangSmith,让我们一起掌控 LLM 的力量,创造更多价值!