【本期目标】
- 掌握使用 LangSmith 进行 LangChain 应用的可视化调试与追踪。
- 了解如何利用 LangSmith 评估 RAG 系统的性能(准确性、忠实度等)。
- 熟悉 LangChain 应用的部署方式,包括使用 LangServe 快速构建API接口。
- 学习在生产环境中对 LangChain 应用进行**监控**和日志管理。
- 通过实际操作,体验从开发到部署的全生命周期管理。
引言:从开发到生产
开发一个LLM应用可能很快,但将其部署到生产环境,并保证其稳定、高效、准确地运行,则是一个更具挑战性的过程。你可能会遇到:
- 调试困难: 链条太长,不知道在哪一步出了问题。
- 性能瓶颈: 响应速度慢,Token消耗过高。
- 质量下降: 模型回答不准确,出现幻觉。
- 部署复杂: 如何将Python代码转化为可访问的API服务。
- 缺乏监控: 无法实时了解应用的运行状态。
本期将提供一套“组合拳”,帮助你解决这些问题,确保你的RAG系统能够成功上线并持续优化。
第一部分:LangSmith——LLM应用的评估利器
LangSmith 是 LangChain 官方推出的一款平台,专门用于 LLM 应用的调试、测试、评估和监控。它是 LangChain 生态中最重要的工具之一,强烈推荐在开发和生产中使用。
- 调试与追踪 (Tracing):
- LangSmith 能可视化你的 LangChain 链条的每一步执行,包括每个 Runnable 的输入、输出、耗时、Token使用量以及中间的错误信息。
【实践:配置并使用 LangSmith 进行追踪】
首先,你需要注册一个 LangSmith 账号 (opens in https://smith.langchain.com/).如下:
然后,获取你的 API Key 和 Project Name,并设置为环境变量。
from dotenv import load_dotenv import os from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain_chroma import Chroma from langchain.chains import create_retrieval_chain, create_history_aware_retriever from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables.history import RunnableWithMessageHistory from langchain.memory import ConversationBufferWindowMemory from langchain_core.chat_history import BaseChatMessageHistory load_dotenv() # 加载 LangSmith 相关的环境变量 # --- 1. RAG 链的构建 (复用第八期优化后的链) --- llm = ChatOpenAI( model=os.environ.get("OPENAI_MODEL"), temperature=0.9, base_url=os.environ.get("OPENAI_BASE_URL"), openai_api_key=os.environ.get("OPENAI_API_KEY"), ) embeddings_model = OpenAIEmbeddings( model=os.environ.get("EMBEDDING_MODEL"), base_url=os.environ.get("EMBEDDING_BASE_URL"), openai_api_key=os.environ.get("EMBEDDING_API_KEY"), ) # 加载或创建向量数据库 persist_directory_langsmith_rag = "./chroma_db_rag_basic" # 使用第八期的数据库 vectorstore_langsmith_rag = Chroma( persist_directory=persist_directory_langsmith_rag, embedding_function=embeddings_model ) base_retriever_for_ls = vectorstore_langsmith_rag.as_retriever(search_kwargs={"k": 3}) # 历史感知检索器 (简化,不包含MultiQuery和Rerank,以聚焦LangSmith追踪) history_aware_prompt_ls = ChatPromptTemplate.from_messages([ MessagesPlaceholder(variable_name="chat_history"), ("user", "{input}"), ("system", "根据上面的对话历史和用户最新问题,生成一个独立的、用于检索相关文档的问题。只返回新的查询。") ]) history_aware_retriever_ls = create_history_aware_retriever(llm, base_retriever_for_ls, history_aware_prompt_ls) # RAG 提示模板 rag_prompt_ls = ChatPromptTemplate.from_messages([ ("system", "请根据提供的上下文回答以下问题。\n如果上下文没有足够信息,请说明你不知道。\n\n上下文:\n{context}"), MessagesPlaceholder(variable_name="chat_history"), ("user", "{input}") ]) document_chain_ls = create_stuff_documents_chain(llm, rag_prompt_ls) conversational_rag_chain_ls = create_retrieval_chain(history_aware_retriever_ls, document_chain_ls) # 记忆管理 store_ls = {} def get_session_history_ls(session_id: str) -> BaseChatMessageHistory: if session_id not in store_ls: store_ls[session_id] = ConversationBufferWindowMemory( k=5, return_messages=True, input_key="input", output_key="answer" ).chat_memory return store_ls[session_id] final_rag_chain_for_ls = RunnableWithMessageHistory( conversational_rag_chain_ls, get_session_history_ls, input_messages_key="input", history_messages_key="chat_history", output_messages_key="answer" ) # --- 2. 运行链条,观察 LangSmith 追踪 --- print("\n--- 运行RAG链,数据将追踪到LangSmith ---") session_id_ls = "langsmith_test_user_001" response_ls_1 = final_rag_chain_for_ls.invoke( {"input": "你好,我想了解LangChain。"}, config={"configurable": {"session_id": session_id_ls}} ) print(f"用户: 你好,我想了解LangChain。") print(f"AI: {response_ls_1['answer']}") response_ls_2 = final_rag_chain_for_ls.invoke( {"input": "它的调试工具叫什么?"}, config={"configurable": {"session_id": session_id_ls}} ) print(f"用户: 它的调试工具叫什么?") print(f"AI: {response_ls_2['answer']}") print("\n请访问 LangSmith 平台 (smith.langchain.com) 查看本次运行的详细追踪信息。") print("在 'Projects' 页面找到你的项目名称,点击进入即可看到每次 'invoke' 对应的 Trace。")操作步骤: 运行上述代码后,登录 smith.langchain.com,进入你设置的项目。你会看到每次 invoke 对应的一条 Trace (追踪记录)。点击进入,你就能看到一个可视化的链条图,展示了数据如何流经 create_history_aware_retriever (其中包含LLM调用)、create_retrieval_chain、create_stuff_documents_chain 等各个组件,每个组件的输入、输出、耗时、Token使用量都会清晰展示。这对于调试复杂链条是革命性的。效果如下:
这里需要说明的是LangSmith 实际上是收费的平台,当然也可以免费使用,但是在真实场景下可能牵扯到数据安全问题,如果想本地部署LLM监控可以使用Langfuse,效果都是差不多的
- 评估 (Evaluation):
LangSmith 提供了强大的评估功能,你可以创建数据集(Dataset),然后运行你的链条,并自动或手动评估其输出。
指标:
自动评估: LangSmith 可以调用LLM(Evaluator LLM)来评估答案的忠实度(Faithfulness)、相关性(Relevance)、流畅性(Fluency)等。
人工评估: 你可以定义自己的评分标准,手动给每个回答打分。
这对于衡量RAG系统的迭代优化效果至关重要。
简要说明 LangSmith 评估流程:
- 创建数据集 (Dataset): 在 LangSmith 中创建输入-输出对(如问题-期望答案)。
- 绑定测试: 将你的 LangChain 链与数据集绑定,运行测试。
- 运行评估器: 选择内置的LLM评估器(如 FaithfulnessEvaluator)或自定义评估器,对测试结果进行自动评分。
- 分析结果: 查看评估报告,找出低分案例,分析问题根源,指导优化。
这里也只是简单的说明下LangSmith的评估怎么使用,我在真实场景习惯用Ragas和Evalscope做评测。
第二部分:部署——让RAG应用可访问
一旦LangChain应用开发和测试完毕,下一步就是将其部署为可供其他服务或用户调用的API。
- LangServe (推荐):快速构建REST API
- LangServe 是 LangChain 官方提供的一种快速部署 LCEL Runnable 作为 REST API 的工具。
- 它构建在 FastAPI 之上,提供开箱即用的 /invoke, /stream, /batch, /feedback, /playground 等端点。
- 部署非常简单,适合快速原型开发和生产环境部署。
- 安装:pip install “langserve[all]” (会安装 uvicorn, fastapi, pydantic)
【实践:使用 LangServe 部署 RAG 应用】
步骤 A: 创建 server.py 文件
import os from fastapi import FastAPI from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_openai import ChatOpenAI, OpenAIEmbeddings from langchain_chroma import Chroma from langchain.chains import create_retrieval_chain, create_history_aware_retriever from langchain.chains.combine_documents import create_stuff_documents_chain from langchain_core.runnables.history import RunnableWithMessageHistory from langchain.memory import ConversationBufferWindowMemory from langchain_core.chat_history import BaseChatMessageHistory from langchain_core.output_parsers import StrOutputParser from langserve import add_routes from dotenv import load_dotenv load_dotenv() app = FastAPI( title="RAG Chatbot API", version="1.0", description="A RAG chatbot API powered by LangChain and LangServe.", ) # --- 1. 初始化模型和向量数据库 --- llm = ChatOpenAI( model=os.environ.get("OPENAI_MODEL"), temperature=0.9, base_url=os.environ.get("OPENAI_BASE_URL"), openai_api_key=os.environ.get("OPENAI_API_KEY"), ) embeddings_model = OpenAIEmbeddings( model=os.environ.get("EMBEDDING_MODEL"), base_url=os.environ.get("EMBEDDING_BASE_URL"), openai_api_key=os.environ.get("EMBEDDING_API_KEY"), ) # 加载向量数据库 persist_directory_for_serve = "./chroma_db_rag_basic" vectorstore_for_serve = Chroma( persist_directory=persist_directory_for_serve, embedding_function=embeddings_model ) retriever_for_serve = vectorstore_for_serve.as_retriever(search_kwargs={"k": 3}) # --- 2. 构建 RAG 链条 --- # 历史感知提示模板 history_aware_prompt_serve = ChatPromptTemplate.from_messages([ MessagesPlaceholder(variable_name="chat_history"), ("user", "{input}"), ("system", "根据上面的对话历史和用户最新问题,生成一个独立的、用于检索相关文档的问题。") ]) # RAG 提示模板 rag_prompt_serve = ChatPromptTemplate.from_messages([ ("system", "请根据提供的上下文回答问题。\n上下文:\n{context}"), MessagesPlaceholder(variable_name="chat_history"), ("user", "{input}") ]) # 文档处理链 document_chain_serve = create_stuff_documents_chain(llm, rag_prompt_serve) # --- 核心改动:重构对话式 RAG 链 --- retriever_chain_with_parser = history_aware_prompt_serve | llm | StrOutputParser() # 创建检索链 # 第一个参数是一个新的链条:它接收输入,通过带解析器的模型生成查询字符串,然后用该字符串进行检索 # create_retrieval_chain 会智能地将检索到的文档(作为 'context')和原始输入一起传递给 document_chain_serve conversational_rag_chain_serve = create_retrieval_chain( retriever_chain_with_parser | retriever_for_serve, document_chain_serve ) # --- 3. 添加记忆功能 --- store_serve = {} def get_session_history_serve(session_id: str) -> BaseChatMessageHistory: if session_id not in store_serve: store_serve[session_id] = ConversationBufferWindowMemory( k=5, return_messages=True, input_key="input", output_key="answer" ).chat_memory return store_serve[session_id] # 最终的带记忆 RAG 链 final_rag_chain_serve = RunnableWithMessageHistory( conversational_rag_chain_serve, get_session_history_serve, input_messages_key="input", history_messages_key="chat_history", output_messages_key="answer" ) # --- 4. 使用 add_routes 将链条注册为 API 端点 --- add_routes( app, final_rag_chain_serve, path="/rag-chatbot", # API 的根路径 playground_type="default" # 提供一个默认的 playground UI ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=5432)步骤 B: 运行服务器
在终端中,进入 app 文件夹的父目录,然后执行:
python -m uvicorn app.server:app --reload --host 0.0.0.0 --port 8000
–reload:代码修改后自动重启服务器。
–host 0.0.0.0:允许从任何IP地址访问。
–port 5432:在5432端口运行。
步骤 C: 测试 API
打开浏览器访问 http://localhost:5432/rag-chatbot/playground。你会看到一个简单的UI,可以直接与你的RAG机器人交互。
也可以使用 Postman 或 curl 调用 API:
Invoke (单次调用):POST http://localhost:5432/rag-chatbot/invoke
{ "input": {"input": "LangChain是什么?"}, "config": {"configurable": {"session_id": "test_user_007"}} }Stream (流式调用):POST http://localhost:5432/rag-chatbot/stream (请求体同invoke)流式调用会逐块返回内容,适合前端实时显示。
- 传统部署方式 (Docker, 云函数等):
- Docker:Python 应用容器化是最常见的部署方式。创建一个 Dockerfile,包含所有依赖,然后构建镜像,在任何支持Docker的环境中运行。
- Kubernetes: 对于大规模、高可用性的部署,可以将 Docker 容器部署到 Kubernetes 集群。
小结:LangServe 是部署 LangChain LCEL 链最方便快捷的方式,它提供了开箱即用的API端点。对于更复杂的部署场景,Docker 和云函数是常见的选择。
第三部分:监控日志——掌握RAG应用的痕迹
部署到生产环境的应用,需要持续的监控来确保其稳定运行、性能达标,并及时发现问题。
- 日志 (Logging):
- 使用 Python 的 logging 模块记录关键信息,如:用户请求、LLM调用、工具执行、错误信息、警告等。
- 配置日志级别 (INFO, WARNING, ERROR),将日志输出到文件或中央日志系统(如 ELK Stack, Splunk)。
- 在 LangChain 中,你可以在 Callbacks 中集成自定义日志。
- 指标 (Metrics):
收集关键性能指标:
响应时间: 平均响应时间、P99 延迟。
Token使用量: 每次请求的输入/输出Token数,总Token消耗。
LLM调用成功率/失败率: 监控LLM API的健康状况。
检索成功率: 检索器是否返回了足够的文档。
RAG 相关性/忠实度: 可以通过自动化评估或抽样人工评估来定期衡量。
使用 Prometheus, Grafana 等工具进行指标收集、可视化和告警。
LangSmith 也会自动收集和展示一些关键指标。
- 错误告警:
- 配置错误告警机制(如通过 Sentry, DingTalk, Slack 等),在发生严重错误时及时通知开发团队。
- 结合 LangSmith,当某个 Trace 失败时,可以配置自动告警。
简要集成 Logging 示例:
import logging from langchain.callbacks.base import BaseCallbackHandler from langchain_core.callbacks import CallbackManager # 导入 CallbackManager # 配置日志 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') # 自定义一个 CallbackHandler 来记录 LLM 调用 class CustomLLMLogger(BaseCallbackHandler): def on_llm_start(self, serialized: dict, prompts: list[str], **kwargs): logging.info(f"LLM Call Started. Prompts: {prompts[0][:50]}...") def on_llm_end(self, response, **kwargs): logging.info(f"LLM Call Ended. Generated (partial): {response.generations[0][0].text[:50]}...") # 将 CustomLLMLogger 添加到 LLM 的 callback_manager 中 llm_with_logging = ChatOpenAI( model=os.environ.get("OPENAI_MODEL"), temperature=0.9, base_url=os.environ.get("OPENAI_BASE_URL"), openai_api_key=os.environ.get("OPENAI_API_KEY"), callbacks=CallbackManager([CustomLLMLogger()]) # 在这里添加你的自定义Logger ) # 使用 llm_with_logging 构建RAG链,就会在控制台看到 LLM 的日志 res = llm_with_logging.invoke("你好")小结: 调试是找出问题,评估是衡量质量,部署是上线运行,监控是保证稳定。LangSmith 是这些流程中的核心工具。
本期小结
在本期教程中,掌握了 LangChain 应用从开发到生产的关键实践:
- 学会了利用 LangSmith 进行强大的**可视化调试和追踪**,深入了解链条的执行细节。
- 了解了 LangSmith 在 **RAG 评估**方面的能力,为持续优化提供了数据支撑。
- 掌握了使用 LangServe 快速将你的 LCEL 链部署为可访问的 **REST API**。
- 初步了解了生产环境中对 LangChain 应用进行**日志记录和指标监控**的重要性。
现在,你的RAG系统已经准备好迎接真实世界的挑战,可以投入到生产环境中去服务用户了!
普通人如何抓住AI大模型的风口?
领取方式在文末
为什么要学习大模型?
目前AI大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。
目前,开源人工智能大模型已应用于医疗、政务、法律、汽车、娱乐、金融、互联网、教育、制造业、企业服务等多个场景,其中,应用于金融、企业服务、制造业和法律领域的大模型在本次调研中占比超过30%。
随着AI大模型技术的迅速发展,相关岗位的需求也日益增加。大模型产业链催生了一批高薪新职业:
人工智能大潮已来,不加入就可能被淘汰。如果你是技术人,尤其是互联网从业者,现在就开始学习AI大模型技术,真的是给你的人生一个重要建议!
最后
只要你真心想学习AI大模型技术,这份精心整理的学习资料我愿意无偿分享给你,但是想学技术去乱搞的人别来找我!
在当前这个人工智能高速发展的时代,AI大模型正在深刻改变各行各业。我国对高水平AI人才的需求也日益增长,真正懂技术、能落地的人才依旧紧缺。我也希望通过这份资料,能够帮助更多有志于AI领域的朋友入门并深入学习。
真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发
【附赠一节免费的直播讲座,技术大佬带你学习大模型的相关知识、学习思路、就业前景以及怎么结合当前的工作发展方向等,欢迎大家~】
大模型全套学习资料展示
自我们与MoPaaS魔泊云合作以来,我们不断打磨课程体系与技术内容,在细节上精益求精,同时在技术层面也新增了许多前沿且实用的内容,力求为大家带来更系统、更实战、更落地的大模型学习体验。
希望这份系统、实用的大模型学习路径,能够帮助你从零入门,进阶到实战,真正掌握AI时代的核心技能!
01教学内容
从零到精通完整闭环:【基础理论 →RAG开发 → Agent设计 → 模型微调与私有化部署调→热门技术】5大模块,内容比传统教材更贴近企业实战!
大量真实项目案例:带你亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事!
02适学人群
应届毕业生:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。
零基础转型:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界。
业务赋能突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型。
vx扫描下方二维码即可
【附赠一节免费的直播讲座,技术大佬带你学习大模型的相关知识、学习思路、就业前景以及怎么结合当前的工作发展方向等,欢迎大家~】
本教程比较珍贵,仅限大家自行学习,不要传播!更严禁商用!
03入门到进阶学习路线图
大模型学习路线图,整体分为5个大的阶段:
04视频和书籍PDF合集
从0到掌握主流大模型技术视频教程(涵盖模型训练、微调、RAG、LangChain、Agent开发等实战方向)
新手必备的大模型学习PDF书单来了!全是硬核知识,帮你少走弯路(不吹牛,真有用)
05行业报告+白皮书合集
收集70+报告与白皮书,了解行业最新动态!
0690+份面试题/经验
AI大模型岗位面试经验总结(谁学技术不是为了赚$呢,找个好的岗位很重要)
07 deepseek部署包+技巧大全
由于篇幅有限
只展示部分资料
并且还在持续更新中…
真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发
【附赠一节免费的直播讲座,技术大佬带你学习大模型的相关知识、学习思路、就业前景以及怎么结合当前的工作发展方向等,欢迎大家~】