LangChain 全面入门

发布于:2025-07-05 ⋅ 阅读:(20) ⋅ 点赞:(0)

什么是 LangChain?

LangChain 是一个专门为 大语言模型 (LLM) 应用开发设计的开源框架,帮你快速实现:
• 多轮对话
• 知识库问答 (RAG)
• 多工具协同调用 (function calling / tool)
• 智能体 Agent 自动决策任务链

解耦 LLM 接口、Prompt、Memory、检索、工具、Agent,模块化管理,专注业务逻辑开发。

LangChain 核心功能详解

模块 功能说明 典型用途
LLM 封装各类语言模型 (OpenAI、Azure、Gemini、Claude) 接口 文本生成、摘要、翻译、续写
Prompt 灵活编排多角色 Prompt 模板,支持变量插值和参数化调用 定制多轮对话、RAG、文档总结
Memory 保存对话上下文、变量或历史记录,维持多轮上下文一致性 多轮对话机器人、智能 Agent
Retriever 检索器,配合向量库 (FAISS / Azure Search / Milvus) 实现文档检索 知识库检索问答、RAG 系统
Tool 封装 Python 函数 / 外部 API,让 LLM 能实时调用 实时查天气、数据库读写、调用第三方接口
Function Calling LLM 判断需要调用 Tool 时,自动生成调用请求(含参数),返回结构化 JSON LLM 与工具实时交互,动态任务执行
Agent 智能体,能调度多个工具,执行多步骤任务链,有判断、记忆、推理能力 AutoGPT、任务规划、多接口串联
Document Loader 加载本地/远程/数据库/网页文档,支持多格式 (txt、pdf、markdown) 知识库构建、RAG 文档管理
Text Splitter 将长文档拆分成小块,便于后续向量化检索,支持按字数/句子/段落拆分 文档分割、RAG 知识库优化
Embedding Model 将文本转为向量,便于检索与相似度计算,兼容 OpenAI / Huggingface 等 向量检索、RAG、智能推荐

Azure OpenAI and Gemini

下文会用langchian来分别对Azure OpenAI和Gemini的实现,所以这里也简单对二者进行一个功能对比。
功能对比

项目 Azure OpenAI Google Gemini
📖 背景厂商 Microsoft Azure + OpenAI Google DeepMind (PaLM 升级版)
📦 模型版本 GPT-3.5 / GPT-4 / GPT-4o Gemini 1 / Gemini 1.5 Pro / Gemini Flash
📑 接口方式 REST API / Azure SDK / LangChain / Function Calling 支持 REST API / Google Generative AI SDK / LangChain
📦 兼容 LangChain
📃 Function Calling ✅ (Gemini 1.5 后原生支持)
🔒 部署模式 私有化企业 Azure 内网部署 / 公有云 公有云部署
📂 知识库检索 (RAG) ✅ (Azure Cognitive Search / FAISS / Chroma) ✅ (FAISS / Google Cloud Search / Chroma)
🌐 多模态支持 GPT-4o (文本+图像) Gemini 1.5 (文本+图片+音频+视频)
💰 成本控制 Azure 统一计费,按 token 收费 Google Cloud Platform 计费,按 token 或调用次数收费
📊 性能 高稳定性,企业级 SLA,支持模型多副本部署 多模态能力领先,性能灵活
📌 适用场景 企业 AI 应用、智能客服、知识库问答、Agent、RAG AI Copilot、多模态问答、AI 助手、多模态检索
📦 API Key 配置方式 Azure Portal → Azure OpenAI Resource → Key + Endpoint Google Cloud Console → API & Services → Credentials + Key
📚 官方文档 https://learn.microsoft.com/azure/cognitive-services/openai/ https://ai.google.dev/
  • Azure OpenAI:稳定、企业私有部署强、RAG 知识库生态好、适合企业应用落地。
  • Google Gemini:多模态能力超强、文本+图像+音频+视频一体、灵活 AI Copilot 场景首选。

实战案例汇总

环境准备

基本库

!python version  #3.12.x
!pip install python-dotenv requests tiktoken
 
 #langchian
!pip install langchain 

# openai
## Azure 用法同 OpenAI,只是多了 azure_endpoint 和 deployment_name 配置。
!pip install langchain-openai 

# gemini
!pip install langchain-google-genai

验证安装

from langchain import __version__
print(__version__) #0.3.25

.env

GOOGLE_API_KEY=AIza****

AZURE_API_KEY=N2****
AZURE_ENDPOINT=****
AZURE_API_VERSION=2024-12-01-preview
AZURE_DEPLOYMENT=o4-mini-global

LangChain 调用 Gemini/Azure OpenAI 示例

调用 Gemini

from langchain_google_genai import ChatGoogleGenerativeAI
from dotenv import load_dotenv
import os

load_dotenv()
llm = ChatGoogleGenerativeAI(
    model="gemini-2.0-flash",
    google_api_key=os.getenv("GOOGLE_API_KEY")
)

# 普通 prompt 调用
response = llm.invoke("用一句话介绍LangChain")
print(response.content)

LangChain是一个用于开发由大型语言模型 (LLM) 驱动的应用程序的框架。

调用Azure OpenAI

from langchain_openai import AzureChatOpenAI
load_dotenv()
llm2 = AzureChatOpenAI(
    deployment_name=os.getenv("AZURE_DEPLOYMENT"),
    openai_api_key=os.getenv("AZURE_API_KEY"),
    azure_endpoint=os.getenv("AZURE_ENDPOINT"),
    api_version=os.getenv("AZURE_API_VERSION"),
    temperature=1
)

response = llm2.invoke("用一句话介绍LangChain")
print(response.content)

LangChain是一个开源框架,通过链式调用、内存管理与工具集成,简化基于大型语言模型的应用构建。


PromptTemplate

from langchain.prompts import PromptTemplate

# PromptTemplate 调用
prompt = PromptTemplate(
    input_variables=["product"],
    template="请写一段关于 {product} 的夸赞"
)
response = llm.invoke(prompt.format(product="小米YU7"))
print(response.content)

多轮消息

from langchain.schema import AIMessage, HumanMessage, SystemMessage

# 多轮消息
response = llm.invoke([
    SystemMessage(content="你是一个 Python 顾问,只能用代码回答。"),
    HumanMessage(content="写一个hello world")
])
print(response.content)

```python
print(“Hello, world!”)
```

Few-ShotPromptTemplate

from langchain.prompts import FewShotPromptTemplate, PromptTemplate

# Few-ShotPromptTemplate
# 定义范例
examples = [
    {"question": "北京今天天气如何?", "answer": "北京今天晴天 28°C"},
    {"question": "上海今天天气?", "answer": "上海今天多云 27°C"}
]

# 单个示例模板
example_prompt = PromptTemplate(
    input_variables=["question", "answer"],
    template="问:{question}\n答:{answer}\n"
)

# few-shot 模板
prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    suffix="问:{input}\n答:",
    input_variables=["input"]
)

response = llm.invoke(prompt.format(input="广州天气?"))
print(response.content)

广州今天多云 30°C

多轮对话+memory

from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain

memory2 = ConversationBufferMemory()
conversation = ConversationChain(llm=llm, memory=memory2)
conversation.run("你好,我是谁?")
print(conversation.run("我刚才说了什么?"))

你刚才说:“你好,我是谁?”

RAG

环境依赖

!pip install faiss-cpu        # 向量数据库,推荐CPU版本
!pip install tiktoken         # Tokenizer

Gemini

from langchain_google_genai import GoogleGenerativeAIEmbeddings, ChatGoogleGenerativeAI
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.text_splitter import CharacterTextSplitter

# 1. 假想手机产品介绍文本
docs = [
    """
    大豆15PRO 5G 是由星辰科技推出的一款旗舰智能手机,搭载最新的5纳米制程芯片,配备8核处理器和12GB高速内存,确保流畅的多任务处理能力。该机拥有6.7英寸AMOLED全面屏,支持120Hz刷新率和HDR10+显示技术,带来细腻逼真的视觉体验。

    摄像方面,大豆15PRO 5G 配备后置四摄系统,包括一颗1亿像素主摄、超广角镜头、微距镜头和深度感应器,支持夜景增强和4K视频录制功能。前置摄像头为3200万像素,支持美颜和人脸解锁。

    电池容量为4500mAh,支持55W有线快充和30W无线快充,续航表现优异。操作系统基于最新的StarOS,优化了系统流畅度和隐私保护。大豆15PRO 5G 还支持5G双卡双待、NFC支付以及IP68级防尘防水。

    该产品定位高端用户,主打性能和拍照体验,适合游戏玩家和摄影爱好者使用。
    """
]

# 2. 文本拆分
# 就把文本每100个字符拆一块。每个块会和前一个块重叠10个字符。
## 即块为分为[0,100),[91,190)....
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=10)
texts = []
for doc in docs:
    texts.extend(text_splitter.split_text(doc))

# 3. 初始化 Gemini Embeddings
embeddings = GoogleGenerativeAIEmbeddings(model="models/gemini-embedding-exp-03-07")

# 4. 创建向量索引
vector_store = FAISS.from_texts(texts, embeddings)

# 5.构建 RAG 检索问答链
qa_chain = RetrievalQA.from_chain_type(llm=llm, retriever=vector_store.as_retriever())

# 6. 测试问答
query = "大豆15PRO的规格是什么?"
answer = qa_chain.run(query)
print("Q:", query)
print("A:", answer)

输出:

Q: 大豆15PRO的规格是什么?
A: 大豆15PRO 5G 是一款旗舰智能手机,具有以下规格:
* 芯片:最新的5纳米制程芯片,8核处理器,12GB高速内存
* 屏幕:6.7英寸AMOLED全面屏,120Hz刷新率,HDR10+
* 电池:4500mAh,55W有线快充,30W无线快充
* 操作系统:StarOS
* 网络:5G双卡双待,NFC,IP68级防尘防水
* 后置摄像头:1亿像素主摄、超广角镜头、微距镜头、深度感应器,支持夜景增强和4K视频录制
* 前置摄像头:3200万像素,支持美颜和人脸解锁

Azure OpenAI

from langchain_openai import AzureOpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain_openai import AzureChatOpenAI
from langchain.chains import RetrievalQA
from langchain.text_splitter import CharacterTextSplitter

load_dotenv()
# 1. 假想手机产品介绍文本
#data....

# 2. 文本拆分
# 就把文本每100个字符拆一块。每个块会和前一个块重叠10个字符。
## 即块为分为[0,100),[91,190)....
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=10)
texts = []
for doc in docs:
    texts.extend(text_splitter.split_text(doc))

# 3. Embeddings 初始化(Azure OpenAI)
embeddings = AzureOpenAIEmbeddings(
    azure_endpoint=os.getenv("AZURE_ENDPOINT"),
    azure_deployment="text-embedding-3-small",
    openai_api_version=os.getenv("AZURE_API_VERSION"),
    openai_api_key=AZURE_API_KEY
)

# 4. 创建向量索引
docsearch = FAISS.from_texts(texts, embeddings)

# 5.构建 RAG 检索问答链
qa_chain = RetrievalQA.from_chain_type(llm=llm2, retriever=docsearch.as_retriever())

# 6. 测试问答
query = "大豆15PRO的规格是什么?"
answer = qa_chain.run(query)
print("Q:", query)

输出:

Q: 大豆15PRO的规格是什么?
A: 大豆15PRO 5G 主要规格一览:

• 处理器  
  – 最新 5 nm 制程 8 核芯片  

• 内存  
  – 12 GB 高速 RAM  

• 屏幕  
  – 6.7 英寸 AMOLED 全面屏  
  – 120 Hz 刷新率  
  – HDR10+ 显示技术  

• 电池与充电  
  – 4500 mAh 电池  
  – 55 W 有线快充  
  – 30 W 无线快充  

• 操作系统  
  – 基于最新 StarOS  

• 网络与连接  
  – 5G 双卡双待  
  – NFC 支付  
  – IP68 级防尘防水  

• 摄像系统  
  – 后置四摄  
     • 1 亿像素主摄  
     • 超广角镜头  
     • 微距镜头  
     • 深度感应器  
  – 夜景增强、4K 视频录制  
  – 前置 3200 万像素自拍摄像头(支持美颜、人脸解锁)

该机面向高端用户,主打性能与拍照体验,适合游戏玩家和摄影爱好者。

Function Calling

Gemini

import os, requests
from langchain.agents import initialize_agent, Tool, AgentType
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_openai import AzureChatOpenAI
from langchain.tools import StructuredTool

def get_weather(city: str) -> str:
    return f"{city} 今天天气晴朗 26°C (模拟数据)"

#weather_tool = Tool(name="get_weather", func=get_weather, description="获取城市天气")

weather_tool_func = StructuredTool.from_function(
    func=get_weather,
    name="get_weather",
    description="获取城市天气"
)

agent_gemini = initialize_agent(
    tools=[weather_tool_func],
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)
print("Gemini Tool:", agent_gemini.run("查成都天气"))

输出

> Entering new AgentExecutor chain...
我需要查询成都的天气。
Action: get_weather
Action Input: 成都
Observation: 成都 今天天气晴朗 26°C (模拟数据)
我已经知道了成都的天气。
Final Answer: 成都今天天气晴朗,26°C。

> Finished chain.
Gemini Tool: 成都今天天气晴朗,26°C。

Azure OpenAI

agent_azure = initialize_agent(
    tools=[weather_tool],
    llm=llm2,
    agent=AgentType.OPENAI_FUNCTIONS,
    verbose=True
)
print("Azure Tool:", agent_azure.run("查广州天气"))

输出

> Entering new AgentExecutor chain...

Invoking: `get_weather` with `广州`


广州 今天天气晴朗 26°C (模拟数据)

多工具任务链 Agent

Gemini

def get_weather(city: str) -> str:
    return f"{city} 天气晴 27°C"

def get_joke(_) -> str:
    """本方法不需要任何入参"""
    url = "https://icanhazdadjoke.com/"
    return requests.get(url, headers={"Accept": "text/plain"}).text

tools = [
    Tool(name="weather", func=get_weather, description="获取天气"),
    Tool(name="joke", func=get_joke, description="讲个笑话")
]

agent_gemini = initialize_agent(
    tools=tools,
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)
print("Gemini Agent:", agent_gemini.run("帮我查北京天气,然后讲个笑话,最后将笑话翻译为中文"))

输出

> Entering new AgentExecutor chain...
Thought: First, I need to find out the weather in Beijing. Then, I need to get a joke. Finally, I will present both pieces of information.
Action: weather
Action Input: 北京
Observation: 北京 天气晴 27°C
Now I know the weather in Beijing. I need to get a joke.
Action: joke
Action Input: _
Observation: Why are pirates called pirates? Because they arrr!
I have the weather and the joke. Now I need to present them together.
Final Answer: 北京天气晴,27°C。笑话:Why are pirates called pirates? Because they arrr! (为什么海盗叫海盗?因为他们啊啊啊!)

> Finished chain.
Gemini Agent: 北京天气晴,27°C。笑话:Why are pirates called pirates? Because they arrr! (为什么海盗叫海盗?因为他们啊啊啊!)

网站公告

今日签到

点亮在社区的每一天
去签到