LangChainGo 入门到精通

30 阅读5分钟

大家好!我是 [数擎 AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | AI 应用 | Web3D | 元宇宙
技术栈:JavaScript、React、ThreeJs、WebGL、Go
经验经验:6 年+ 前端开发经验,专注于图形渲染和 AI 技术
开源项目智简未来数擎AILangChainDemo

一、前言

人工智能应用正在快速发展,LangChain 作为 AI 应用的“编排框架”,在 Python 与 JavaScript 生态中已经大放异彩。
如果你是 Golang 开发者,想要利用 Go 的并发性能、生态和工程化能力来构建 AI 应用,那么 LangChainGo 就是你的不二之选。

这篇文章将带你从入门到进阶,掌握 LangChainGo 的核心能力,最终实现一个完整的 AI 应用。


二、LangChainGo 简介

LangChainGo 是 LangChain 的 Go 语言实现,其目标与 Python 版一致:

  • 提供 统一的 LLM 接口(支持 OpenAI、Azure、Anthropic 等)。
  • 提供 链(Chain)与代理(Agent) 机制,让你快速构建复杂 AI 流程。
  • 支持 工具集成(检索、数据库、知识库、外部 API)。

优势

  • Go 的 高性能并发 能力非常适合需要处理大量请求的 AI 应用。
  • 天然适合和 微服务、云原生架构 融合。
  • 工程化强,部署方便。

可以理解为:Python 版 LangChain 更适合科研与快速原型,而 Go 版 LangChainGo 则更适合高并发生产环境。


三、快速入门

1. 安装

go get github.com/tmc/langchaingo

安装完成后,即可在 Go 项目中直接使用 LangChainGo 提供的各类组件。

  1. 大词言模型

在 LangChain 中,LLM(大语言模型)是最底层的能力,所有功能都基于它来实现。 下面的示例展示了如何在 LangChainGo 中调用 OpenAI 模型,并通过 System Prompt 设定 AI 的角色。

package main

import (
	"context"
	"fmt"
	"github.com/tmc/langchaingo/llms"
	"github.com/tmc/langchaingo/llms/openai"
)

var (
	apiKey = "sk-xxxxxxxxxxxxxxxxxxxx"
	url    = "https://poloai.top/v1"
)

func main() {

	llm, err := openai.New(openai.WithToken(apiKey), openai.WithBaseURL(url))
	if err != nil {
		panic(err)
	}

	rsp, err := llm.GenerateContent(context.Background(), []llms.MessageContent{
		llms.TextParts(llms.ChatMessageTypeSystem, "你是一个诗人"),
		llms.TextParts(llms.ChatMessageTypeHuman, "请用一句诗来描述你"),
	})
	if err != nil {
		panic(err)
	}
	fmt.Println(rsp.Choices[0].Content)

}

在这个例子中,我们让 AI 扮演“诗人”的身份,然后向它提问。 这种 角色设定 能让 AI 的回答更符合场景化需求。

  1. Prompts —— 提示词模板

Prompt 工程是 AI 应用的核心竞争力。通过模板化的方式,我们可以 参数化生成 Prompt,从而批量化或动态化地构建对话。

package main

import (
	"context"
	"fmt"
	"github.com/tmc/langchaingo/llms"
	"github.com/tmc/langchaingo/llms/openai"
	"github.com/tmc/langchaingo/prompts"
)

var (
	apiKey = "sk-xxxxxxxxxxxxxxxxxxxx"
	url    = "https://poloai.top/v1"
)

func main() {

	ctx := context.Background()
	llm, err := openai.New(openai.WithToken(apiKey), openai.WithBaseURL(url))
	if err != nil {
		panic(err)
	}

	template := prompts.NewPromptTemplate(
		"请你为{{.dep}}部门新入职员工{{.name}} 设计一个自我介绍",
		[]string{"dep", "name"},
	)

	staff := map[string]any{
		"name": "数擎Ai",
		"dep":  "产品研发",
	}

	prompt, err := template.FormatPrompt(staff)
	if err != nil {
		panic(err)
	}
	text, err := llms.GenerateFromSinglePrompt(ctx, llm, prompt.String())
	if err != nil {
		panic(err)
	}
	fmt.Println(text)

}

在这个示例中:

通过 模板化的 Prompt,我们可以复用提示词逻辑。

只需要传入不同的参数(如 name、dep),就能自动生成符合场景的提示。

这让 Prompt 工程标准化,避免了硬编码。

  1. Chains —— 链式调用

Chain 就像流水线,把多个步骤组合在一起:输入 → 处理 → 输出。 这种模式非常适合场景化的 AI 应用,例如“先生成内容 → 再翻译 → 最后总结”。

package main

import (
	"context"
	"fmt"
	"github.com/tmc/langchaingo/chains"
	"github.com/tmc/langchaingo/llms/openai"
	"github.com/tmc/langchaingo/prompts"
)

var (
	apiKey = "sk-xxxxxxxxxxxxxxxxxxxx"
	url                = "https://poloai.top/v1"
	format             = "要求:用中文输出,内容自然流畅,不要包含任何奇怪的符号、特殊空格或控制字符。"
	template           = "请你为{{.dep}}部门新入职员工{{.name}}设计一个自我介绍 "
	templateInputValue = []string{"dep", "name"}
)

func main() {
	ctx := context.Background()
	llm, err := openai.New(openai.WithToken(apiKey), openai.WithBaseURL(url))
	if err != nil {
		panic(err)
	}

	promptTemplate := prompts.NewPromptTemplate(template, templateInputValue)
	// 生成链
	chain := chains.NewLLMChain(llm, promptTemplate)
	call, err := chains.Call(ctx, chain, map[string]any{
		"name": "数擎Ai",
		"dep":  "产品研发",
	})
	if err != nil {
		panic(err)
	}
	fmt.Println(call)
}

这里通过 LLMChain 把 PromptTemplate + LLM 组合起来,实现了“链式调用”。 这种方式让我们可以快速扩展成多步骤任务,例如:

生成介绍 → 翻译 → 格式化

用户问题 → 检索 → LLM 回答

  1. 总结 Agents —— 智能代理

Agent 是 LangChain 最强大的功能,它让 AI 不再局限于对话,而是能 自主调用工具 来完成任务。

常见的应用场景包括:

判断是否需要调用外部 API

是否需要搜索数据库

是否要进行数学计算

是否需要多轮推理


package main

import (
	"context"
	"fmt"
	"github.com/tmc/langchaingo/agents"
	"github.com/tmc/langchaingo/chains"
	"github.com/tmc/langchaingo/llms/openai"
	"github.com/tmc/langchaingo/tools"
	"github.com/tmc/langchaingo/tools/serpapi"
	"log"
)

var (
	apiKey = "sk-xxxxxxxxxxxxxxxxxxxx"
	url        = "https://poloai.top/v1"
	serpapiKey = "xxxxx"
)

func handlePanic(err error) {
	if err != nil {
		log.Fatal(err)
	}
}

func main() {

	ctx := context.Background()
	llm, err := openai.New(openai.WithToken(apiKey), openai.WithBaseURL(url))
	handlePanic(err)

	// 定义工具
	tool, err := serpapi.New(serpapi.WithAPIKey(serpapiKey))
	handlePanic(err)

	// 定义计算
	calculator := new(tools.Calculator)
	t := []tools.Tool{tool, calculator}

	executor := agents.NewExecutor(agents.NewOneShotAgent(llm, t))
	run, err := chains.Run(ctx, executor, "贵州数擎科技有限公司")
	handlePanic(err)

	fmt.Println(run)

}

在这个例子中:

  1. 定义了 SerpAPI(搜索引擎)工具和 Calculator(计算器)工具。

  2. Agent 根据问题内容,自动决定是否调用工具。

  3. 最终得到更精准的结果,而不是纯粹的“猜测”。

总结

通过以上五个部分,我们完整体验了 LangChainGo 的 四大核心功能: LLMs —— 统一调用大模型。

Prompts —— 提示词模板化。

Chains —— 把多个步骤组合成流水线。

Agents —— 让 AI 主动使用工具,成为真正的“智能体”。

如果你是 Golang 开发者,想进入 AI 应用开发领域,LangChainGo 提供了一个非常适合的工程化选择:

高性能适合微服务和云原生工程实践友好 未来你可以基于此快速搭建 智能客服、知识库问答、搜索增强生成(RAG) 等应用,真正实现从 入门到精通。