Langchain + LLM API 完整集成指南

使用 Langchain 框架构建智能应用,支持 RAG、Agent、Memory 等高级功能

RAG 系统

知识库检索增强

智能代理

自主决策与工具调用

链式调用

模块化任务编排

多模型支持

统一接口调用

一、基础配置与使用

快速开始

# 安装 Langchain
pip install langchain langchain-openai chromadb tiktoken

# 基础配置示例
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import LLMChain

# 初始化模型
llm = ChatOpenAI(
    base_url="https://api.n1n.ai/v1",
    api_key="your-api-key",
    model="gpt-4o",
    temperature=0.7
)

# 创建提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的{role}"),
    ("human", "{input}")
])

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

# 运行链
response = chain.run(role="翻译专家", input="Hello World")
print(response)

支持的模型

  • • GPT-4o / GPT-3.5-turbo
  • • Claude 3.5 Sonnet
  • • Gemini Pro
  • • 本地 Llama / Mistral

核心组件

  • • Prompts - 提示管理
  • • Models - 模型接口
  • • Chains - 任务链
  • • Memory - 上下文记忆

二、RAG 检索增强生成

完整 RAG 实现

from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain_community.document_loaders import PyPDFLoader
import os

# 配置 API
os.environ["OPENAI_API_BASE"] = "https://api.n1n.ai/v1"
os.environ["OPENAI_API_KEY"] = "your-api-key"

# 1. 加载文档
loader = PyPDFLoader("document.pdf")
documents = loader.load()

# 2. 分割文档
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    length_function=len,
    separators=["\n\n", "\n", "。", "!", "?", ",", " ", ""]
)
texts = text_splitter.split_documents(documents)

# 3. 创建向量存储
embeddings = OpenAIEmbeddings(
    model="text-embedding-3-small",
    openai_api_base="https://api.n1n.ai/v1"
)

vectorstore = Chroma.from_documents(
    documents=texts,
    embedding=embeddings,
    persist_directory="./chroma_db"
)

# 4. 创建检索链
llm = ChatOpenAI(
    model="gpt-4o",
    temperature=0,
    openai_api_base="https://api.n1n.ai/v1"
)

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(
        search_type="similarity",
        search_kwargs={"k": 3}
    ),
    return_source_documents=True
)

# 5. 查询
query = "文档中提到的主要观点是什么?"
result = qa_chain({"query": query})

print("答案:", result["result"])
print("\n相关文档:")
for doc in result["source_documents"]:
    print(f"- {doc.page_content[:100]}...")

💡 RAG 最佳实践

  • • Chunk Size: 500-1500 tokens,根据内容类型调整
  • • Overlap: 10-20% 重叠确保上下文连续性
  • • Embedding: text-embedding-3-small 性价比高
  • • 检索数量: 3-5个相关文档最优
  • • 向量库: Chroma 本地开发,Pinecone 生产环境

三、智能 Agent 系统

工具调用 Agent

from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain.tools import Tool, StructuredTool
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage
import requests
from pydantic import BaseModel, Field

# 定义工具
class WeatherInput(BaseModel):
    city: str = Field(description="城市名称")

def get_weather(city: str) -> str:
    """获取天气信息"""
    # 实际应用中调用真实API
    return f"{city}的天气是晴天,温度25°C"

def search_web(query: str) -> str:
    """搜索网络信息"""
    return f"搜索结果:{query}的相关信息..."

# 创建工具列表
tools = [
    StructuredTool.from_function(
        func=get_weather,
        name="get_weather",
        description="获取指定城市的天气",
        args_schema=WeatherInput
    ),
    Tool(
        name="search_web",
        func=search_web,
        description="搜索网络获取信息"
    )
]

# 初始化模型
llm = ChatOpenAI(
    model="gpt-4o",
    temperature=0,
    openai_api_base="https://api.n1n.ai/v1",
    openai_api_key="your-api-key"
)

# 创建提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", """你是一个智能助手,可以使用以下工具:
    - get_weather: 获取天气信息
    - search_web: 搜索网络信息
    
    请根据用户的问题,选择合适的工具来回答。"""),
    MessagesPlaceholder(variable_name="chat_history", optional=True),
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad")
])

# 创建代理
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    verbose=True,
    max_iterations=3
)

# 执行代理
response = agent_executor.invoke({
    "input": "北京今天天气怎么样?明天适合出游吗?"
})

print(response["output"])

常用工具

  • • 搜索引擎
  • • 计算器
  • • 数据库查询
  • • API 调用

Agent 类型

  • • ReAct Agent
  • • OpenAI Functions
  • • Plan-and-Execute
  • • Self-Ask

应用场景

  • • 客服机器人
  • • 数据分析
  • • 任务自动化
  • • 研究助手

四、记忆系统

多种记忆类型

from langchain.memory import ConversationBufferMemory, ConversationSummaryMemory
from langchain_openai import ChatOpenAI
from langchain.chains import ConversationChain
from langchain.memory import ChatMessageHistory

# 1. 基础对话记忆
memory = ConversationBufferMemory()
llm = ChatOpenAI(
    model="gpt-4o",
    openai_api_base="https://api.n1n.ai/v1",
    openai_api_key="your-api-key"
)

conversation = ConversationChain(
    llm=llm,
    memory=memory,
    verbose=True
)

# 对话示例
print(conversation.run("我叫小明"))
print(conversation.run("我刚才说的名字是什么?"))

# 2. 摘要记忆(适合长对话)
summary_memory = ConversationSummaryMemory(
    llm=llm,
    max_token_limit=100
)

summary_chain = ConversationChain(
    llm=llm,
    memory=summary_memory,
    verbose=True
)

# 3. 向量记忆(检索相关历史)
from langchain.memory import VectorStoreRetrieverMemory
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

embeddings = OpenAIEmbeddings(
    openai_api_base="https://api.n1n.ai/v1"
)

vectorstore = Chroma(embedding_function=embeddings)
retriever = vectorstore.as_retriever(search_kwargs=dict(k=2))

vector_memory = VectorStoreRetrieverMemory(
    retriever=retriever,
    memory_key="history",
    input_key="input"
)

# 4. 持久化记忆
from langchain.memory import SQLiteEntityStore
from langchain.memory import ConversationEntityMemory

entity_store = SQLiteEntityStore(db_file="memory.db")
entity_memory = ConversationEntityMemory(
    llm=llm,
    entity_store=entity_store
)

五、流式输出

实时流处理

from langchain_openai import ChatOpenAI
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain.prompts import ChatPromptTemplate
import asyncio

# 1. 同步流式输出
llm = ChatOpenAI(
    model="gpt-4o",
    streaming=True,
    callbacks=[StreamingStdOutCallbackHandler()],
    openai_api_base="https://api.n1n.ai/v1",
    openai_api_key="your-api-key"
)

# 流式输出到控制台
response = llm.invoke("写一个关于AI的故事")

# 2. 异步流式处理
async def async_stream():
    llm = ChatOpenAI(
        model="gpt-4o",
        streaming=True,
        openai_api_base="https://api.n1n.ai/v1",
        openai_api_key="your-api-key"
    )
    
    async for chunk in llm.astream("讲一个笑话"):
        print(chunk.content, end="", flush=True)

# 3. 自定义流处理回调
from langchain.callbacks.base import BaseCallbackHandler
from typing import Any, Dict, List

class CustomStreamHandler(BaseCallbackHandler):
    def __init__(self):
        self.tokens = []
        
    def on_llm_new_token(self, token: str, **kwargs) -> None:
        """处理新的token"""
        self.tokens.append(token)
        # 可以发送到WebSocket、SSE等
        print(f"Token: {token}", end="")
        
    def on_llm_end(self, response: Any, **kwargs) -> None:
        """LLM结束时的处理"""
        full_response = "".join(self.tokens)
        print(f"\n完整响应长度: {len(full_response)}")

# 使用自定义处理器
custom_llm = ChatOpenAI(
    model="gpt-4o",
    streaming=True,
    callbacks=[CustomStreamHandler()],
    openai_api_base="https://api.n1n.ai/v1"
)

response = custom_llm.invoke("解释量子计算")

六、性能优化与成本控制

优化技巧

from langchain.cache import SQLiteCache, InMemoryCache
from langchain.globals import set_llm_cache
from langchain_openai import ChatOpenAI
import time

# 1. 设置缓存
set_llm_cache(SQLiteCache(database_path=".langchain.db"))
# 或使用内存缓存
# set_llm_cache(InMemoryCache())

llm = ChatOpenAI(
    model="gpt-3.5-turbo",  # 使用更便宜的模型
    openai_api_base="https://api.n1n.ai/v1",
    openai_api_key="your-api-key"
)

# 第一次调用(会缓存)
start = time.time()
response1 = llm.invoke("什么是机器学习?")
print(f"第一次调用耗时: {time.time() - start:.2f}秒")

# 第二次调用(从缓存读取)
start = time.time()
response2 = llm.invoke("什么是机器学习?")
print(f"第二次调用耗时: {time.time() - start:.2f}秒")

# 2. 批处理优化
from langchain.callbacks import get_openai_callback

prompts = [
    "解释Python",
    "解释JavaScript",
    "解释Rust"
]

# 使用回调跟踪成本
with get_openai_callback() as cb:
    # 批量处理
    responses = llm.batch(prompts, config={"max_concurrency": 3})
    print(f"总Token数: {cb.total_tokens}")
    print(f"预估成本: ${cb.total_cost:.4f}")

# 3. 提示压缩
from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.example_selector import LengthBasedExampleSelector

examples = [
    {"input": "2+2", "output": "4"},
    {"input": "5*3", "output": "15"},
    {"input": "10/2", "output": "5"}
]

example_selector = LengthBasedExampleSelector(
    examples=examples,
    example_prompt=ChatPromptTemplate.from_template(
        "输入: {input}\n输出: {output}"
    ),
    max_length=50  # 限制示例长度
)

# 4. 模型降级策略
from langchain.llms import FallbackLLM

primary_llm = ChatOpenAI(
    model="gpt-4o",
    openai_api_base="https://api.n1n.ai/v1"
)

fallback_llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    openai_api_base="https://api.n1n.ai/v1"
)

# 主模型失败时自动降级
try:
    response = primary_llm.invoke("复杂问题...")
except Exception:
    response = fallback_llm.invoke("复杂问题...")

🎯 优化策略

  • ✅ 启用缓存减少重复调用
  • ✅ 使用批处理提高吞吐量
  • ✅ 压缩提示减少 token 使用
  • ✅ 模型降级处理简单任务
  • ✅ 异步并发处理

💰 成本控制

  • ✅ GPT-3.5 处理常规任务
  • ✅ GPT-4o 处理复杂推理
  • ✅ 本地模型处理隐私数据
  • ✅ 监控 token 使用量
  • ✅ 设置成本预警