用 LangChain 跑通第一个智能问答应用
【免费下载链接】langchainThe agent engineering platform.项目地址: https://gitcode.com/GitHub_Trending/la/langchain
LangChain 是一个 Python 框架,把聊天模型、消息、工具和检索抽象成统一接口,用来构建 LLM 应用和代理。想搭智能问答、带工具的对话代理的开发者,可以用它少写大量胶水代码。
项目定位:它封装了什么
LangChain 位于模型 API 和你的业务代码之间。它把各家提供商的 SDK 差异封装成同一套消息结构和invoke/stream调用约定,你只需要一个字符串"openai:gpt-4o"就能初始化模型,换成"anthropic:claude-sonnet"时业务代码不用动。
它省掉的主要是三步:各提供商请求格式的适配、流式与异步的统一处理、工具调用的解析与循环执行。仓库本身是三层结构,核心抽象在 libs/core/,代理工厂和高层入口在 libs/langchain_v1/langchain/,各提供商的集成包在 libs/partners/。
和直接调 API 相比,多出来的价值是:消息对象有类型、有 id,可以跨轮次合并去重;调用有生命周期钩子,方便接入追踪和缓存;模型能力(是否支持工具调用、结构化输出)通过模型画像自动探测,不需要自己写判断逻辑。
核心机制拆解
模型层:一个字符串换任意提供商
输入是一句"openai:gpt-4o"这样的字符串。内部先查模型画像库确定该提供商的能力,再实例化对应的 chat model,产出统一的AIMessage对象。输出可以是完整消息,也可以是逐块流式的 chunk,接口签名不变。
from langchain.chat_models import init_chat_model model = init_chat_model("openai:gpt-4o") result = model.invoke("用一句话介绍 LangChain")切换提供商时只改字符串。重试、限流、追踪这些横切逻辑都挂在这一层,不需要你自己包一层。
代理循环:模型和工具之间来回跑
create_agent输入一个模型、一个工具列表和系统提示词,内部编译成状态机:先调模型,判断输出里有没有工具调用,有就执行工具、把结果塞回消息列表再调模型,直到模型不再请求工具,退出循环给出最终答案。结构化输出走同样的循环,框架会自动选提供商原生 schema 或工具调用两种策略之一。
from langchain.agents import create_agent agent = create_agent( model="openai:gpt-4o", tools=[check_weather], system_prompt="You are a helpful weather assistant.", ) for chunk in agent.stream({"messages": [{"role": "user", "content": "北京天气?"}]}): print(chunk)中间件:不改核心逻辑,插进生命周期
中间件在代理循环的固定节点上挂钩子:before_model在每次模型调用前跑,after_model在模型返回后跑,wrap_model_call则直接包在调用外面,可以重放、短路或改写请求。想加人工审批、自动重试、工具结果缓存,都是注册一个中间件的事,不用动代理本体。
# 注册顺序决定层级:第一个注册的处于最外层 agent = create_agent(model, tools=[search], middleware=[retry, human_approval])一个真实任务走一遍:合同问答
拿一份 PDF 合同来问"违约责任在哪些条款"。先把文档交给加载器解析出文本,接着用 text splitters 按语义边界切成几百字的片段,逐段向量化后存进向量库。
用户提问时,查询同样被向量化,和库里片段做相似度匹配,取最相关的三块。这三块原文连同问题被拼进提示词,发给模型,模型据此生成答案并附条款编号。
整个过程里,分块策略、检索返回几条、检索结果怎么拼进提示词,都是你选组件时定的;加载、切分、检索、拼提示词、调用模型之间的传递由框架串起来。你拿到的是成品答案,而不是一堆需要手动对齐的中间格式。
最小可运行路径
- 装框架和提供商集成包:
uv add langchain langchain-openai - 配好环境变量:
export OPENAI_API_KEY=sk-... - 初始化模型并跑通第一次调用:
model.invoke("你好"),看到回复即打通 - 想加工具就
create_agent(model, tools=[...]),用stream看循环过程 - 想接真实数据再接文档加载器和向量库,其余不动
完整配置说明见仓库内 openwiki/quickstart.md。先跑通再调参,顺序别反。
用下来要注意的事
模型不是开箱即用的。现象是init_chat_model("openai:gpt-4o")报 import 错误,原因是框架本体只含解析和画像,真正的调用实现拆在各libs/partners/包里。建议装框架时就把对应提供商的集成包一起装上。
能力探测有边界。现象是换到小厂商模型后,工具调用或结构化输出行为和 OpenAI 不一致,原因是模型画像只覆盖已发布的元数据,未收录的提供商会走保守回退。建议上线前对目标模型单独验一遍这两条路径。
代理循环会放大开销。现象是复杂任务下 token 消耗和延迟明显高于单次调用,原因是每执行一轮工具就再调一次模型,轮数线性叠加。建议工具集和提示词保持精简,生产环境挂上限制轮数的中间件。
延伸方向
需要多代理协作、状态持久化、人工介入的分支流程时,配套框架 LangGraph 值得看一眼,create_agent底层编译出的状态机就来自它。
装好包,用init_chat_model打通一条invoke,再去 libs/langchain_v1/langchain/agents/ 里读一下工厂的实现,你就知道上面那些机制具体落在哪段代码里了。
【免费下载链接】langchainThe agent engineering platform.项目地址: https://gitcode.com/GitHub_Trending/la/langchain
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考