三、核心模块深入:像搭积木一样组装AI能力
1. Models(模型层):给你的AI换个“大脑”
场景需求:
- 需要更高精度的回答?→ 换GPT-4
- 数据敏感必须本地部署?→ 用开源模型
- 想节省成本?→ 选择按量付费的模型
实操演示:
# 使用OpenAI的GPT-4(需账户有访问权限)
from langchain.chat_models import ChatOpenAI
gpt4 = ChatOpenAI(model="gpt-4", temperature=0.5)
# 使用开源的Llama2(需先下载模型文件)
from langchain.llms import LlamaCpp
llama = LlamaCpp(
model_path="./llama-2-7b-chat.ggmlv3.q4_0.bin",
temperature=0.8
)
# 对比两者的诗歌生成
print("GPT-4:", gpt4.predict("用'月光'开头写一句诗"))
print("Llama2:", llama.predict("用'月光'开头写一句诗"))
输出对比:
GPT-4:月光如水洗尘心,星河若梦照古今
Llama2:月光白如雪,照在青石街
小贴士:
- 云端模型:响应快、效果稳定,但需付费
- 本地模型:数据隐私好,但需要显卡资源
2. Chains(任务链):把AI变成流水线工人
典型案例:自动客服工单处理系统
代码实现:
from langchain.chains import TransformChain, LLMChain, SequentialChain
# 第一步:工单分类
classify_prompt = PromptTemplate(...)
classify_chain = LLMChain(...)
# 第二步:根据类型处理
def routing_logic(inputs):
if "投诉" in inputs["type"]:
return "complaint_chain"
else:
return "query_chain"
# 组装完整流程
full_chain = SequentialChain(
chains=[classify_chain, complaint_chain, query_chain],
routing=routing_logic # 自定义路由逻辑
)
调试技巧:
# 查看每个步骤的输入输出
full_chain.run("你们的产品有问题!", verbose=True)
# 输出日志示例:
# [分类链] 输入:"你们的产品有问题!" → 输出:{"type": "投诉"}
# [投诉处理链] 输入:投诉内容 → 输出:安抚话术
3. Agents(智能代理):给你的AI发瑞士军刀
工具包配置:
from langchain.agents import Tool
from langchain.utilities import GoogleSearchAPIWrapper
# 创建三个工具
search = GoogleSearchAPIWrapper()
tools = [
Tool(
name="网络搜索",
func=search.run,
description="用于查询实时信息"
),
Tool(
name="计算器",
func=lambda x: str(eval(x)),
description="用于数学计算"
),
Tool(
name="翻译器",
func=translate_api,
description="中英互译"
)
]
实战场景:全能旅行助手
agent.run("帮我查巴厘岛下周天气,预算1万元玩3天怎么安排?")
AI的思考过程(通过设置verbose=True
可见):
1. 需要天气数据 → 调用「网络搜索」工具
2. 计算每日预算:10000/3 ≈ 3333 → 调用「计算器」
3. 生成行程建议 → 使用LLM本身能力
4. 翻译酒店名称 → 调用「翻译器」
常见问题:
- 工具选择错误:在工具描述中强调使用场景
- 无限循环:设置最大迭代次数
max_iterations=5
4. Memory(记忆管理):让AI记住你的喜好
记忆类型对比表:
类型 | 适用场景 | 代码示例 |
---|---|---|
对话缓存记忆 | 短期聊天 | ConversationBufferMemory |
实体记忆 | 记住用户特定信息 | EntityMemory |
知识图谱记忆 | 复杂关系记忆 | KGMemory |
用户偏好记忆案例:
from langchain.memory import ConversationEntityMemory
# 创建带实体识别的记忆
memory = ConversationEntityMemory(llm=llm)
memory.save_context(
{"input": "我咖啡只喝美式"},
{"output": "已记录您的咖啡偏好"}
)
# 后续对话
print(memory.load_memory_variables({"input": "推荐个饮品?"}))
# 输出:{'history': ..., 'entities': {'用户': {'咖啡偏好': '美式'}}}
记忆丢失问题解决:
- 定期将记忆存储到数据库
- 使用
VectorStoreRetrieverMemory
向量记忆
5. Indexes(数据索引):让AI读懂你的文档
企业知识库搭建四部曲:
-
文档加载:支持PDF/Word/网页
from langchain.document_loaders import PyPDFLoader loader = PyPDFLoader("企业章程.pdf") pages = loader.load()
-
文本分割:防止超过模型token限制
from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000) docs = text_splitter.split_documents(pages)
-
向量存储:把文字变成数学向量
from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import FAISS db = FAISS.from_documents(docs, OpenAIEmbeddings())
-
语义检索:
query = "年假制度是怎样的?" similar_docs = db.similarity_search(query)
效果对比:
传统关键词搜索 → 匹配"年假"出现次数
语义搜索 → 理解"带薪休假怎么计算"也能找到答案
6. 模块组合实战:智能会议助手
需求场景:
- 自动总结会议录音(语音转文字 + 摘要生成)
- 根据讨论内容生成待办事项
- 关联历史会议记录
代码架构:
# 1. 语音处理链
audio_chain = SpeechToTextChain()
# 2. 摘要生成链
summary_chain = LLMChain(...)
# 3. 待办事项抽取链
todo_chain = TransformChain(...)
# 4. 记忆存储
memory = CombinedMemory(memories=[buffer_memory, entity_memory])
# 整合所有模块
assistant_chain = SequentialChain(
chains=[audio_chain, summary_chain, todo_chain],
memory=memory,
input_variables=["audio_file"]
)
7. 调试与优化指南
常见问题诊断表:
现象 | 可能原因 | 解决方案 |
---|---|---|
响应速度慢 | 链过长/模型延迟高 | 异步调用/换轻量模型 |
输出结果不稳定 | temperature值过高 | 降低temperature至0.3-0.6 |
记忆丢失 | 未正确传递memory对象 | 检查chain的memory参数是否设置 |
工具调用失败 | API密钥失效/网络问题 | 添加重试机制/异常捕获 |
性能优化技巧:
- 缓存机制:对常见查询结果缓存
from langchain.cache import InMemoryCache langchain.llm_cache = InMemoryCache()
- 批量处理:同时处理多个输入
inputs = [{"query": "巴黎天气"}, {"query": "伦敦天气"}] chain.apply(inputs)
8. 阶段练习:打造你的第一个智能应用
任务选择:
- 选项1:电商客服机器人(需对接产品数据库)
- 选项2:个人健康助手(记录运动饮食数据)
- 选项3:学习监督员(检查作业生成错题集)
实现步骤提示:
- 画出功能流程图
- 列出需要的模块(如:需要Agent吗?需要哪种Memory?)
- 分模块编写测试代码
- 组装调试时使用
verbose=True
观察执行过程
示例代码框架:
# 健康助手骨架代码
from langchain import LLMChain, Agent, Memory
class HealthAssistant:
def __init__(self):
self.memory = ConversationEntityMemory()
self.food_chain = LLMChain(...)
self.exercise_agent = Agent(...)
def log_meal(self, food):
self.memory.save_context(...)
return self.food_chain.run(food)
def suggest_exercise(self):
return self.exercise_agent.run(
inputs={"memory": self.memory},
tools=[BMI_calculator, workout_generator]
)
下一步学习预告
在第四部分项目实战中,你将:
🔧 用1小时搭建智能客服系统
📊 实现自动分析Excel生成可视化报告
🤖 创建能记住300轮对话的聊天机器人
…
现在先做个选择题检验学习效果吧!
Q:当需要处理“用户咨询→数据库查询→生成报告”流程时,应该使用?
A) 单个LLM直接处理
B) Chain串联多个步骤
C) 训练新模型
(答案:B。Chain就像流水线,适合多步骤任务)