LangChain进阶:Python实现复杂AI工作流

云信安装大师
90
AI 质量分
2 5 月, 2025
3 分钟阅读
0 阅读

LangChain进阶:Python实现复杂AI工作流

引言

LangChain是一个强大的框架,可以帮助开发者构建基于语言模型的复杂应用。本文将带你深入探索如何使用Python和LangChain实现复杂的AI工作流,包括多步骤处理、记忆机制和工具集成等高级功能。

准备工作

在开始之前,请确保你已经安装了以下环境:

  • Python 3.8+
  • LangChain库
  • OpenAI API密钥(或其他LLM提供商)

安装命令:

代码片段
pip install langchain openai

1. 基础设置与LLM初始化

首先我们需要初始化语言模型。这里我们使用OpenAI的GPT模型作为示例。

代码片段
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI

# 初始化标准LLM
llm = OpenAI(temperature=0.7, model_name="gpt-3.5-turbo")

# 初始化Chat模型(更适合对话场景)
chat_model = ChatOpenAI(temperature=0.7)

参数说明:
temperature:控制输出的随机性(0-1),值越高结果越有创意
model_name:指定使用的模型版本

注意事项:
1. 确保你的API密钥已设置环境变量OPENAI_API_KEY
2. 生产环境中建议将密钥存储在安全的地方,而不是硬编码在脚本中

2. 构建复杂工作流链

LangChain的核心概念之一是”链”(Chain),它允许我们将多个组件连接起来形成工作流。

示例1:简单的问答链

代码片段
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 定义提示模板
prompt = PromptTemplate(
    input_variables=["product"],
    template="为{product}写一个创意广告文案,不超过50字"
)

# 创建链
ad_chain = LLMChain(llm=llm, prompt=prompt)

# 运行链
result = ad_chain.run("智能手表")
print(result)

示例2:顺序链(Sequential Chain)

顺序链允许我们将多个链按顺序连接起来:

代码片段
from langchain.chains import SimpleSequentialChain

# 第一个链:生成产品名称
name_prompt = PromptTemplate(
    input_variables=["product_category"],
    template="为{product_category}想一个创新的产品名称"
)
name_chain = LLMChain(llm=llm, prompt=name_prompt)

# 第二个链:生成产品描述
description_prompt = PromptTemplate(
    input_variables=["product_name"],
    template="为{product_name}写一段详细的产品描述"
)
description_chain = LLMChain(llm=llm, prompt=description_prompt)

# 组合成顺序链
overall_chain = SimpleSequentialChain(
    chains=[name_chain, description_chain],
    verbose=True
)

# 运行顺序链
result = overall_chain.run("环保家居产品")
print(result)

工作原理:
1. SimpleSequentialChain会按顺序执行每个子链
2. 前一个链的输出自动作为下一个链的输入
3. verbose=True会显示详细的执行过程

3. 添加记忆机制

对于对话式应用,记忆功能至关重要。LangChain提供了多种记忆实现方式。

代码片段
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain

# 初始化带记忆的对话链
memory = ConversationBufferMemory()
conversation = ConversationChain(
    llm=chat_model,
    memory=memory,
    verbose=True
)

# 进行对话测试
conversation.predict(input="你好,我是小明")
conversation.predict(input="你能记住我的名字吗?")

# 查看记忆内容
print(memory.buffer)

进阶记忆选项:
ConversationBufferWindowMemory:只保留最近的N条对话记录
ConversationSummaryMemory:保存对话的摘要而非完整记录

4. 集成外部工具

LangChain的强大之处在于可以轻松集成各种外部工具和API。

示例:使用搜索引擎增强问答能力

代码片段
from langchain.agents import load_tools, initialize_agent, AgentType

# 加载工具包(需要安装serpapi包)
tools = load_tools(["serpapi"], llm=llm)

# 初始化代理(Agent)
agent = initialize_agent(
    tools,
    llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

# 运行代理查询当前信息问题
result = agent.run("2023年诺贝尔文学奖得主是谁?")
print(result)

注意事项:
1. SerpAPI需要单独注册并获取API密钥(https://serpapi.com/)
2. Agent会自行决定何时使用搜索引擎工具,何时直接回答问题

5. RAG(检索增强生成)实现

RAG技术可以让语言模型访问外部知识库,提供更准确的回答。

代码片段
from langchain.document_loaders import WebBaseLoader
from langchain.indexes import VectorstoreIndexCreator

# 加载网页内容作为知识库(这里以LangChain文档为例)
loader = WebBaseLoader("https://docs.langchain.com/docs/")
index = VectorstoreIndexCreator().from_loaders([loader])

# RAG查询示例
query = "LangChain支持哪些类型的记忆机制?"
result = index.query(query) 
print(result)

实现原理:
1. WebBaseLoader从指定URL加载文档内容
2. VectorstoreIndexCreator将文档转换为向量存储(embedding)
3. query时先检索相关文档片段,再生成最终回答

6. AI工作流完整示例:客户服务机器人

让我们综合以上技术构建一个完整的客户服务机器人:

代码片段
from langchain.chains import LLMChain, SequentialChain, TransformChain 
from langchain.memory import ConversationBufferMemory 
from typing import Dict, Any 

def transform_func(inputs: Dict[str, Any]) -> Dict[str, str]:
    """转换用户输入为更友好的格式"""
    user_input = inputs["user_input"]

    # AI辅助情感分析(简化版)
    sentiment_prompt = f"""分析以下文本的情感倾向:
    文本: {user_input}
    情感倾向是[积极/中立/消极]:
    """

    sentiment_result = llm(sentiment_prompt).strip().lower()

    return {
        "processed_input": user_input,
        "sentiment": sentiment_result,
        "greeting": "您好!很高兴为您服务。" if sentiment_result == "积极" else "您好!请问有什么可以帮您?"
    }

# Step1: Transform Chain预处理输入 
preprocess_chain = TransformChain(
    input_variables=["user_input"],
    output_variables=["processed_input", "sentiment", "greeting"],
    transform=transform_func,
)

# Step2: LLM Chain生成响应 
response_prompt_template = """基于以下信息生成客服回复:
用户输入: {processed_input}
情感倾向: {sentiment}
问候语: {greeting}

请提供专业、有帮助的回复:
"""
response_prompt = PromptTemplate(
    input_variables=["processed_input", "sentiment", "greeting"],
    template=response_prompt_template,
)
response_chain = LLMChain(llm=chat_model, prompt=response_prompt, output_key="reply")

# Step3: Sequential Chain组合流程 
customer_service_bot = SequentialChain(
    chains=[preprocess_chain, response_chain],
    input_variables=["user_input"],
    output_variables=["reply"],
    verbose=True,
) 

# Test the bot 
test_inputs = [
   "你们的产品太棒了!",
   "我遇到了登录问题",
   "这简直是我用过最差的服务!"
]

for inp in test_inputs:
   print(f"\n用户输入: {inp}")
   result = customer_service_bot({"user_input": inp})
   print(f"客服回复: {result['reply']}")

这个工作流展示了:
1. 输入预处理:分析用户情感并生成适当问候语
2. 动态响应生成:根据情感和内容生成定制回复
3. 模块化设计:每个步骤可独立开发和测试

Best Practices & Troubleshooting

最佳实践

  1. 温度参数调优

    • temperature=0用于事实性回答
    • temperature=0.7适合创意任务
  2. 错误处理

    代码片段
    from tenacity import retry, stop_after_attempt 
    
    @retry(stop=stop_after_attempt(3))
    def safe_run(agent, query):
        try:
            return agent.run(query) 
        except Exception as e:
            print(f"Error: {str(e)}") 
            return None  
    

3.性能优化
– Cache常见查询结果
– Batch处理相似请求

常见问题

Q: API调用超时怎么办?
A:

代码片段
ChatOpenAI(request_timeout=30) #增加超时时间  

Q: Token限制错误?
A:

代码片段
方法1: summary_memory减少token使用  
方法2: truncate过长的上下文  

Q: Agent陷入循环?
A:

代码片段
设置max_iterations参数限制推理步数:
agent_executor(max_iterations=5)  

Conclusion

本文介绍了如何利用LangChian构建复杂的AI工作流:

✔️ 核心概念掌握 – Chains/Memory/Agents/RAG架构
✔️ 模块化开发方法 – Transform→Process→Generate模式
✔️ 生产级优化技巧 – Caching/Error handling/Batching

进阶学习建议:
1️⃣ LangSmith调试平台 (https://smith.langchian.com)
2️⃣ LangServe部署方案 (https://github.com/langchian-ai/langserve)
3️⃣ Local替代方案 (LlamaIndex + LocalLLMs)

通过灵活组合这些组件,你可以构建出适应各种业务场景的智能系统。Happy coding! 🚀

原创 高质量