本文深入探讨 LangChain 的核心概念,理解这些概念是掌握 LangChain 的关键。
## 1. Runnable Interface
Runnable 是 LangChain 中最重要的接口,几乎所有的组件都实现了这个接口。
### 统一调用方式
“`python
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI(model=”gpt-4o-mini”)
prompt = ChatPromptTemplate.from_template(“回答: {question}”)
response = llm.invoke(“你好”)
result = prompt.invoke({“question”: “什么是 AI?”})
“`
### 流式输出
“`python
for chunk in llm.stream(“讲个笑话”):
print(chunk.content, end=””, flush=True)
“`
### 批处理
“`python
questions = [“什么是 Python?”, “什么是 JavaScript?”, “什么是 AI?”]
responses = llm.batch(questions)
“`
## 2. 链式组合
使用 | 操作符可以将多个组件串联起来:
### 简单链
“`python
chain = (
ChatPromptTemplate.from_template(“翻译成中文: {text}”)
| ChatOpenAI(model=”gpt-4o-mini”)
| StrOutputParser()
)
result = chain.invoke({“text”: “Hello, how are you?”})
“`
### 复杂链
“`python
extractor = ChatPromptTemplate.from_template(“提取关键信息:{text}”) | llm | StrOutputParser()
summarizer = ChatPromptTemplate.from_template(“总结:{content}”) | llm | StrOutputParser()
chain = extractor | summarizer
“`
## 3. LangChain Expression Language (LCEL)
LCEL 是一种声明式方式来构建链,更灵活和可读。
### 可组合性
“`python
translator = ChatPromptTemplate.from_template(“翻译成{lang}: {text}”) | llm | StrOutputParser()
chinese = translator.invoke({“lang”: “中文”, “text”: “Hello”})
english = translator.invoke({“lang”: “英文”, “text”: “你好”})
“`
### 并行处理
“`python
from langchain_core.runnables import RunnableParallel
parallel_chain = RunnableParallel({
“summary”: summarizer,
“translation”: translator
})
results = parallel_chain.invoke({“text”: “今天天气不错”, “lang”: “英文”})
“`
## 4. 记忆管理
– **对话窗口记忆:** 保存最近的消息历史
– **会话摘要记忆:** 自动总结历史,节省 token
## 5. 工具调用
“`python
from langchain_core.tools import tool
@tool
def calculator(expression: str) -> str:
“””计算数学表达式”””
try:
result = eval(expression)
return f”结果: {result}”
except Exception as e:
return f”错误: {str(e)}”
llm = ChatOpenAI(model=”gpt-4o”).bind_tools([calculator])
response = llm.invoke(“计算 123 + 456″)
“`
## 6. 检索增强生成(RAG)
“`python
from langchain_core.documents import Document
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
documents = [
Document(page_content=”LangChain 是一个 LLM 应用框架”),
Document(page_content=”Python 是一种编程语言”),
]
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={“k”: 2})
“`