4.1 四条典型产线:常见应用场景


4.1 四条典型产线:常见应用场景

本节摘要:LangChain 应用的常见形态收敛为四条产线——对话助手、知识库问答、内容生成、自主代理。本节给每条产线一张装配卡:业务特征、零件清单、最小可跑代码与专属的坑,帮你按需求对号入座。

先选产线,再写代码

需求进车间后的第一个决定不是"用哪个模型",而是"这是哪条产线"。选错形态的代价极大:把固定流程硬套进代理产线,得到的是不可控与高延迟;把需要自主决策的任务塞进固定链,得到的是频繁的人工介入。四条产线的判别特征一句话版:要聊就是对话线,要查资料就是问答线,要出稿就是生成线,要跨系统办事就是代理线。

四条产线选型矩阵

四条产线选型矩阵

产线一:对话助手

零件最少的产线,核心是记忆件(2.5 节):

from langchain_core.prompts import ChatPromptTemplate from langchain_core.runnables import RunnableWithMessageHistory from langchain_core.chat_history import InMemoryChatMessageHistory from langchain_openai import ChatOpenAI store = {} def get_history(sid): return store.setdefault(sid, InMemoryChatMessageHistory()) chat = (ChatPromptTemplate.from_messages([ ("system", "你是袜子品牌的小助手豆豆"), ("placeholder", "{chat_history}"), ("human", "{q}"), ]) | ChatOpenAI(temperature=0.5)) bot = RunnableWithMessageHistory( chat, get_history, input_messages_key="q", history_messages_key="chat_history") cfg = {"configurable": {"session_id": "u-1"}} print(bot.invoke({"q": "推荐一双夏天穿的"}, config=cfg).content) print(bot.invoke({"q": "再便宜一点的"}, config=cfg).content) # 第二问能接住 再 字 靠的是记忆件 # 输出示例:那看看基础纯色款 单价19.9 透气性同样在线

坑位集中在状态:会话仓库要分布式(3.2 节 Redis 方案)、历史要裁剪(窗口或摘要)。

产线二:知识库问答

第2章供料线的完全体,4.2 节整节总装,这里先给最小样机:

from langchain_community.vectorstores import Chroma from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough vs = Chroma.from_texts( ["退货需在签收后七天内提出", "定制款不支持退换", "棉袜建议冷水手洗"], OpenAIEmbeddings()) def fmt(docs): return "\n".join(d.page_content for d in docs) qa = ({"ctx": vs.as_retriever(search_kwargs={"k": 2}) | fmt, "q": RunnablePassthrough()} | ChatPromptTemplate.from_template( "依据资料回答 没有就说不知道:\n{ctx}\n问题:{q}") | ChatOpenAI(temperature=0) | StrOutputParser()) print(qa.invoke("定制款能退吗")) # 输出示例:不能 定制款不支持退换。

坑位集中在数据:文档版本更新要同步重建索引、切分参数要按 3.3 节质检台调优。

产线三:内容生成

批量出稿的产线,核心是顺序链加输出解析(2.3、2.2 节):

from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_openai import ChatOpenAI from langchain_core.runnables import RunnableParallel llm = ChatOpenAI(temperature=0.8) # 两道工序:卖点提炼 与 标语生成 汇流成稿 pitch = (ChatPromptTemplate.from_template("提炼{item}的三个卖点") | llm | StrOutputParser()) slogan = (ChatPromptTemplate.from_template("为{item}写一句10字标语") | llm | StrOutputParser()) line = RunnableParallel(pitch=pitch, slogan=slogan) out = line.invoke({"item": "彩色袜子"}) print(out["slogan"]) # 输出示例:一双袜子 一天好心情 # 批量生产:一次喂十个商品 items = [{"item": f"商品{i}"} for i in range(10)] print(len(line.batch(items))) # 输出:10

坑位是格式漂移:批量生成时偶尔窜出解释性废话,出口挂 3.1 节的安检门即可。

产线四:自主代理

跨系统办事的产线,核心是工具柜与执行器(2.4 节):

from langchain.agents import create_tool_calling_agent, AgentExecutor from langchain_core.prompts import ChatPromptTemplate from langchain_core.tools import tool from langchain_openai import ChatOpenAI @tool def inventory_check(sku: str) -> str: """查询商品库存。需要知道有没有货时使用。""" stock = {"SO-RED": 120, "SO-BLUE": 0} n = stock.get(sku, -1) return f"{sku} 库存 {n} 件" if n >= 0 else "无此型号" @tool def order_create(sku: str, qty: int) -> str: """创建订单。用户明确说要下单时使用。""" return f"订单已创建 {sku} x{qty}" llm = ChatOpenAI(temperature=0) tools = [inventory_check, order_create] prompt = ChatPromptTemplate.from_messages([ ("system", "你是下单助手"), ("human", "{input}"), ("placeholder", "{agent_scratchpad}"), ]) agent = create_tool_calling_agent(llm, tools, prompt) bot = AgentExecutor(agent=agent, tools=tools, max_iterations=6) print(bot.invoke({"input": "红色款还有货吗 有的话帮我来两双"})) # 输出示例:红色款有货 已为你下单两双 # 执行轨迹:先查库存 看到有货 再建订单

坑位最深的一条线:工具描述决定成败、死循环靠 max_iterations 兜底、不可逆操作要走 3.5 节的权限闸门。

⚠️ 选型最常见的错配:拿代理线做问答。用户只是想查一句政策,代理却来回调工具三四次,延迟翻倍、体验稀碎。先问"流程能不能写死",再决定要不要给产线自治权。

💡 组合产线是常态:真实系统常是"小分类链加大问答线"或"生成线加质检小链"。把四条产线当四种基本电路,业务是它们的串联并联。

动手实验

拿你手头的业务各写一句需求描述,先按判别轴归类产线,再对比上面对应装配卡里的零件清单,看缺什么零件就回第2章对应节补。下一节进入全教程的重头戏:把知识库问答产线从零到一完整总装。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U