Ai学习之LangChain框架

一、什么是LangChain

LangChain 是一个用于开发由大型语言模型(LLMs)驱动的应用程序的开源框架。它提供了标准接口、工具和抽象,帮助开发者更高效地构建和部署与 LLM 相关的复杂应用,而不必从头开始处理所有底层细节。

其本质上就是基于大模型研发的框架,可以大大降低开发者的开发工作量。

核心价值 说明
抽象与模块化 将 LLM 应用拆解为可复用组件(模型调用、提示词管理等),通过统一接口降低开发复杂度。
链式处理(Chains) 通过管道符 “|” 或函数式编程连接组件,实现复杂任务自动化流程(如提示词生成→模型调用→结果解析)。
生态系统集成 支持对接多种 LLM 模型、向量数据库、工具 API 及存储系统(如 OpenAI、Pinecone、Redis 等)。

二、为什么要用 LangChain

直接对接模型 API 的优势

优势 适用场景
轻量灵活,可控性强 - 简单任务(如单次文本生成、翻译)
- 需要高度定制化逻辑(如特殊格式输出、安全合规控制)
性能损耗低 - 高并发场景
- 对延迟敏感的实时应用(如聊天机器人即时响应)
避免框架依赖 - 项目初期快速验证 MVP
- 团队不熟悉第三方框架,希望减少学习成本
成本透明 - 直接按模型 API 用量付费,无框架额外开销

列子:

package main

import (
    "context"
    "fmt"
    "net/http"
    "os"

    "github.com/sashabaranov/go-openai"
)

func main() {
    ctx := context.Background()
    client := openai.NewClient(os.Getenv("OPENAI_API_KEY"))
    
    req := openai.CompletionRequest{
        Model:       openai.GPT3TextDavinci003,
        Prompt:      "推荐一部科幻电影",
        Temperature: 0.7,
    }
    
    resp, err := client.CreateCompletion(ctx, req)
    if err != nil {
        panic(err)
    }
    
    fmt.Println(resp.Choices[0].Text)
}

通过 LangChain 调用模型的优势

优势 适用场景
模块化开发,效率高 - 复杂任务链(如多轮对话、工具调用、知识库检索)
- 需要快速组合不同组件(提示词、模型、数据库)
生态集成统一 - 多模型切换(OpenAI ↔ Hugging Face ↔ 本地模型)
- 无缝对接向量数据库、工具 API
内置最佳实践 - 自动处理提示词模板、输出解析、重试机制
- 支持内存管理(对话历史跟踪)
社区资源丰富 - 参考成熟的示例代码(如问答系统、代码生成工具)
- 利用社区封装的自定义组件

示例:LangChain 实现带知识库的问答(Go)

package main

import (
    "context"
    "fmt"

    "github.com/tmc/langchaingo/chains"
    "github.com/tmc/langchaingo/llms/openai"
    "github.com/tmc/langchaingo/schema"
    "github.com/tmc/langchaingo/vectorstores/chroma"
)

func main() {
    ctx := context.Background()
    llm, _ := openai.New()
    
    // 初始化向量数据库并添加知识库
    store, _ := chroma.New(chroma.WithEmbeddings(openai.NewEmbeddings()))
    store.AddDocuments(ctx, []schema.Document{{
        PageContent: "小米的CEO是雷军",
    }})
    
    // 创建检索链(自动完成 "检索 → 生成回答" 流程)
    retriever := store.AsRetriever()
    chain := chains.NewRetrievalQAChain(llm, retriever)
    
    // 提问:诺兰导演的科幻电影有哪些?
    result, _ := chain.Run(ctx, "小米的CEO是谁?")
    fmt.Println(result) // 输出包含知识库内容的回答
}

三、如何选择?

场景 推荐方式 理由
简单任务(如单次文本生成) 直接调用 API 轻量高效,无需额外框架开销
复杂任务链(如多轮对话+工具调用) LangChain 等框架 模块化组件快速组装,减少重复开发
高并发/低延迟场景 直接调用 API 避免框架层性能损耗
多模型/多工具集成 LangChain 等框架 统一接口适配不同服务,降低集成成本
团队缺乏框架经验 直接调用 API 学习成本低,快速上手

四、混合模式:框架与原生 API 结合

如果你既想利用框架的高效性,又需保留对部分环节的控制权,可以采用 混合模式

  1. 用 LangChain 管理核心流程(如链式调用、检索逻辑)。
  2. 自定义部分组件(如用原生 API 替换框架的模型调用层,或添加自定义工具)。
// 示例:在 LangChain 链中插入自定义 API 调用
type CustomAPITool struct {
    // 实现 LangChain 的 Tool 接口
    Name        string
    Description string
}

func (t *CustomAPITool) Call(ctx context.Context, input string) (string, error) {
    // 直接调用外部 API(如天气、股票数据)
    return "自定义 API 返回结果", nil
}

// 将自定义工具注入 LangChain 代理
agent, _ := agents.NewZeroShotAgent(
    llm,
    []agents.Tool{&CustomAPITool{Name: "custom_api", Description: "调用自定义服务"}},
)
方案 优势 劣势 适用场景
直接调用 API 轻量、可控、性能高 开发复杂任务成本高 简单场景、性能敏感型需求
LangChain 等框架 高效集成、模块化、社区生态丰富 存在学习成本和轻微性能损耗 复杂 LLM 应用、快速迭代项目

根据项目规模和需求灵活选择,两者并非互斥——简单场景用原生 API,复杂场景用框架,甚至可以混合使用。

五、 LangChainGo 如何支持其他大模型

LangChain 的官方 Go 实现,可通过自定义配置支持 DeepSeek(兼容 OpenAI API 接口)

package main

import (
    "context"
    "fmt"

    "github.com/tmc/langchaingo/llms"
    "github.com/tmc/langchaingo/llms/openai"
)

func main() {
    ctx := context.Background()
    
    // 配置 DeepSeek API(兼容 OpenAI 接口)
    llm, err := openai.New(
        openai.WithBaseURL("https://api.deepseek.com/v1"),
        openai.WithAuthToken("your-deepseek-api-key"),
    )
    if err != nil {
        panic(err)
    }
    
    // 直接调用 DeepSeek 模型
    result, err := llm.Call(ctx, "雷军是几几年出生的")
    if err != nil {
        panic(err)
    }
    
    fmt.Println(result)
}

你可能感兴趣的:(Ai学习之旅,人工智能,学习,langchain)