一、什么是LangChain
LangChain 是一个用于开发由大型语言模型(LLMs)驱动的应用程序的开源框架。它提供了标准接口、工具和抽象,帮助开发者更高效地构建和部署与 LLM 相关的复杂应用,而不必从头开始处理所有底层细节。
其本质上就是基于大模型研发的框架,可以大大降低开发者的开发工作量。
核心价值 | 说明 |
---|---|
抽象与模块化 | 将 LLM 应用拆解为可复用组件(模型调用、提示词管理等),通过统一接口降低开发复杂度。 |
链式处理(Chains) | 通过管道符 “|” 或函数式编程连接组件,实现复杂任务自动化流程(如提示词生成→模型调用→结果解析)。 |
生态系统集成 | 支持对接多种 LLM 模型、向量数据库、工具 API 及存储系统(如 OpenAI、Pinecone、Redis 等)。 |
二、为什么要用 LangChain
直接对接模型 API 的优势
优势 | 适用场景 |
---|---|
轻量灵活,可控性强 | - 简单任务(如单次文本生成、翻译) - 需要高度定制化逻辑(如特殊格式输出、安全合规控制) |
性能损耗低 | - 高并发场景 - 对延迟敏感的实时应用(如聊天机器人即时响应) |
避免框架依赖 | - 项目初期快速验证 MVP - 团队不熟悉第三方框架,希望减少学习成本 |
成本透明 | - 直接按模型 API 用量付费,无框架额外开销 |
列子:
package mainimport ("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 mainimport ("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 结合
如果你既想利用框架的高效性,又需保留对部分环节的控制权,可以采用 混合模式:
- 用 LangChain 管理核心流程(如链式调用、检索逻辑)。
- 自定义部分组件(如用原生 API 替换框架的模型调用层,或添加自定义工具)。
// 示例:在 LangChain 链中插入自定义 API 调用
type CustomAPITool struct {// 实现 LangChain 的 Tool 接口Name stringDescription 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 mainimport ("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)
}