LangChain是一个用于构建基于语言模型应用的框架,它让开发者能够更高效地将大型语言模型(LLM)集成到实际应用中。我第一次接触LangChain是在开发一个智能客服系统时,当时需要将GPT模型与企业知识库连接起来,而LangChain提供的工具链完美解决了这个问题。
这个框架的核心价值在于它解决了语言模型应用的三大痛点:
LangChain提供了统一的模型接口,支持多种LLM提供商。在实际项目中,我通常会这样初始化模型:
python复制from langchain.llms import OpenAI
# 建议将API key放在环境变量中
llm = OpenAI(model_name="gpt-3.5-turbo", temperature=0.7)
关键参数说明:
经验:生产环境建议temperature设为0.3-0.5之间,太高会导致回答不稳定
这是我最常用的功能之一,可以标准化提示词工程:
python复制from langchain import PromptTemplate
template = """你是一个专业的{industry}顾问。请用{language}回答以下问题:
问题:{question}
回答:"""
prompt = PromptTemplate(
input_variables=["industry", "language", "question"],
template=template
)
实际使用技巧:
LangChain提供了多种记忆方案来处理对话历史:
python复制from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("你好")
memory.chat_memory.add_ai_message("你好!有什么可以帮您?")
内存类型对比:
| 类型 | 特点 | 适用场景 |
|---|---|---|
| Buffer | 保存完整历史 | 短对话 |
| Window | 只保留最近N条 | 长对话 |
| Entity | 提取关键实体 | 信息提取 |
我最近帮一家律所实现的案例:
python复制from langchain.document_loaders import DirectoryLoader
loader = DirectoryLoader('./legal_docs/', glob="**/*.pdf")
documents = loader.load()
# 文档分割
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
docs = text_splitter.split_documents(documents)
踩坑提醒:PDF解析质量取决于文档结构,复杂表格建议先用专用工具处理
python复制from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(docs, embeddings)
# 相似度检索
retriever = db.as_retriever(search_kwargs={"k": 3})
性能优化技巧:
python复制from langchain.chains import RetrievalQA
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
memory=memory
)
response = qa_chain.run("劳动合同解除需要哪些条件?")
python复制from langchain.agents import initialize_agent, Tool
from langchain.utilities import GoogleSearchAPIWrapper
search = GoogleSearchAPIWrapper()
tools = [
Tool(
name="Google Search",
func=search.run,
description="用于查询实时信息"
)
]
agent = initialize_agent(tools, llm, agent="zero-shot-react-description")
agent.run("最新的AI立法动态是什么?")
我建立的自动化测试方案:
python复制from langchain.evaluation import load_evaluator
evaluator = load_evaluator("qa")
eval_result = evaluator.evaluate(
examples=[
{"query": "什么是LangChain", "answer": "..."}
],
predictions=[
{"text": "LangChain是..."}
]
)
评估指标建议:
python复制from langchain.cache import InMemoryCache
langchain.llm_cache = InMemoryCache()
python复制async def async_generate():
return await llm.agenerate(["请解释..."])
必须处理的常见异常:
python复制from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def safe_call(prompt):
try:
return llm(prompt)
except Exception as e:
log_error(e)
raise
建议监控指标:
我在项目中的实现方案:
python复制from prometheus_client import Counter
REQUEST_COUNT = Counter('langchain_requests', 'API请求计数')
def instrumented_call(prompt):
REQUEST_COUNT.inc()
start = time.time()
response = llm(prompt)
latency = time.time() - start
monitor_latency(latency)
return response
python复制from langchain.text_splitter import SpacyTextSplitter
text_splitter = SpacyTextSplitter()
分块策略对比:
| 策略 | 优点 | 缺点 |
|---|---|---|
| 固定长度 | 实现简单 | 可能切断句子 |
| 句子分割 | 保持语义完整 | 依赖NLP模型 |
| 递归分割 | 平衡效果 | 计算成本高 |
我的解决方案:
python复制text_splitter = RecursiveCharacterTextSplitter(
separators=["\n\n", "\n", "。", "!", "?", ";"],
chunk_size=800,
chunk_overlap=100
)
python复制from langchain.callbacks import get_openai_callback
with get_openai_callback() as cb:
result = llm("解释机器学习")
print(f"消耗token: {cb.total_tokens}")
典型架构示例:
code复制用户界面 → API网关 → LangChain服务 → 向量数据库 → 外部数据源
关键配置:
yaml复制# docker-compose.yml示例
services:
langchain-service:
image: my-langchain-app
environment:
OPENAI_API_KEY: ${API_KEY}
REDIS_URL: redis://cache
depends_on:
- redis
- weaviate
必须实现的措施:
python复制from langchain.schema import OutputParserException
def sanitize_input(text):
if contains_malicious_code(text):
raise OutputParserException("非法输入")
return clean_text(text)
我的CI/CD流程:
python复制# pytest示例
def test_qa_accuracy():
test_cases = load_test_data()
for case in test_cases:
result = qa_chain.run(case["question"])
assert similarity(result, case["expected"]) > 0.8
值得关注的方向:
我建议的学习路线:
典型项目迭代过程:
code复制MVP → 添加记忆 → 连接知识库 → 引入工具 → 优化体验 → 部署上线