什么是 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! (为什么海盗叫海盗?因为他们啊啊啊!)