Skip to main content

LangChain-Go + Ollama 实战教学:知识点与课程笔记

一、核心知识点概览

本节代码基于 LangChain-Go 框架和 Ollama 本地大模型,展示了大语言模型应用开发的核心技术点,包括:

  • LLM 基础调用与文本生成
  • 带记忆的多轮对话实现
  • 自定义提示模板设计
  • 工具集成与 Agent 模式
  • 流式输出与批量处理

二、详细知识点解析

1. LangChain-Go 基础架构与依赖

核心库与模型配置

  • langchaingo 框架:Go 语言版的 LangChain 实现,提供模型集成、链(Chains)、记忆(Memory)等核心组件
  • ollama 客户端:用于连接本地 Ollama 服务,支持调用开源模型(如代码中的 llama3.2
  • 模型初始化代码
    llm, err := ollama.New(ollama.WithModel("llama3.2"))

    注意:需提前通过 ollama pull llama3.2 下载模型,并确保 Ollama 服务正在运行(ollama serve

2. 自定义工具(Tool)开发

工具是 LangChain 扩展 LLM 能力的核心,通过实现 tools.Tool 接口可自定义工具:

接口定义与实现

type Tool interface {
Name() string // 工具名称(用于调用标识)
Description() string // 工具描述(供 LLM 判断是否调用)
Call(ctx context.Context, input string) (string, error) // 工具执行逻辑
}

示例工具解析

  • 计算器工具(CalculatorTool
    解析加减乘表达式并返回结果,核心是字符串分割与逻辑判断
  • 天气工具(WeatherTool
    基于预设的城市-天气映射表返回模拟数据,演示外部数据源对接思路
  • 时间工具(TimeTool
    调用 time.Now() 获取系统时间,展示实时信息获取能力
  • 摘要工具(SummaryTool
    对长文本进行截断处理,演示文本处理逻辑

3. 带记忆的对话系统

记忆组件(Memory)

  • memory.NewConversationBuffer():简单的对话缓冲区,存储完整对话历史
  • 对话链(chains.NewConversation:将 LLM 与记忆组件结合,实现上下文感知

工作原理

每轮对话输入会被存入记忆,LLM 调用时自动携带历史对话作为上下文,例如:

// 用户:你还记得我的名字吗?
// 记忆中已存储:["你好,我叫张三..."]
// LLM 实际接收的输入包含历史,因此能回答出名字

4. 提示模板(Prompt Template)

模板定义与使用

  • 作用:标准化输入格式,引导 LLM 生成符合预期的输出
  • 示例代码:
    promptTemplate := prompts.NewPromptTemplate(
    "你是一个专业的{{.profession}}。请根据以下问题给出建议:\n问题:{{.question}}",
    []string{"profession", "question"}, // 模板参数
    )
  • 格式化调用:通过 promptTemplate.Format(map[string]interface{}) 填充参数

5. 工具调用与 Agent 模式

工具调用流程

  1. 接收用户查询(如“计算 15+27”)
  2. 匹配对应的工具(calculator
  3. 调用工具并获取结果(15+27=42
  4. 让 LLM 基于工具结果生成自然语言回答

Agent 核心逻辑

虽然代码中是手动指定工具,但其思路可扩展为自动 Agent:

  • LLM 根据用户问题判断是否需要调用工具
  • 若需要,选择合适的工具并生成输入参数
  • 处理工具返回结果,必要时进行多轮调用

6. 流式输出与批量处理

流式输出

  • 原理:将 LLM 生成的文本分块返回,模拟实时打字效果
  • 代码模拟:通过 time.Sleep 延迟输出每个单词,实际项目中可使用 llm.Stream 接口

批量处理

  • 对多个问题依次调用 LLM,适合批量生成内容(如批量摘要、批量翻译)
  • 可结合 Go 的 goroutine 实现并行处理,提升效率

三、课程实践笔记

1. 环境搭建步骤

  1. 安装 Go 环境(1.19+)
  2. 安装 Ollama:curl https://ollama.ai/install.sh | sh
  3. 拉取模型:ollama pull llama3.2
  4. 启动 Ollama 服务:ollama serve(后台运行)
  5. 创建项目并引入依赖:
    go mod init langchain-demo
    go get github.com/tmc/langchaingo

2. 关键功能实现要点

功能核心代码位置注意事项
基础 LLM 调用demonstrateBasicOllamaUsage确保模型名称与本地已下载模型一致
对话记忆demonstrateConversationWithMemory长对话需考虑记忆优化(如滑动窗口)
工具集成demonstrateToolUsage工具描述需清晰,否则 LLM 可能调用错误
批量处理demonstrateBatchProcessing大量请求建议加并发控制,避免 API 限流

3. 扩展与优化方向

  • 工具扩展:对接真实 API(如天气 API、股票接口)
  • 记忆优化:使用 memory.NewConversationSummary 压缩长对话历史
  • 并发处理:通过 goroutine 并行调用 LLM,提升批量处理效率
  • 错误处理:完善工具调用失败的重试机制

4. 常见问题解决

  • Ollama 连接失败:检查服务是否启动、模型是否存在
  • LLM 不按预期回答:优化提示模板,增加示例引导
  • 内存占用过高:减少对话记忆长度,或使用更轻量的模型

四、总结与应用场景

通过本代码可掌握 LangChain-Go 的核心功能,其典型应用场景包括:

  • 企业内部知识库问答系统
  • 带工具调用能力的智能助手
  • 批量内容生成与处理工具
  • 实时数据交互的对话机器人

Go 语言的高性能特性使其特别适合构建生产级 LLM 应用,结合 LangChain 的模块化设计,可快速迭代出稳定可靠的 AI 产品。

package main

import (
"context"
"fmt"
"github.com/tmc/langchaingo/llms/ollama"
"log"
"strings"
)

func main() {

// 创建 Ollama LLM 实例
llm, err := ollama.New(ollama.WithModel("llama3.2"))
if err != nil {
log.Printf("创建 Ollama LLM 失败: %v", err)
fmt.Println("请确保 Ollama 已安装并运行,且已下载 llama3.2 模型")
fmt.Println("安装命令: ollama pull llama3.2")
return
}

ctx := context.Background()

// 简单的文本生成
questions := []string{
"请用中文简单介绍一下人工智能",
"Go语言有哪些优势?",
"什么是 LangChain?",
}

for i, question := range questions {
fmt.Printf("\n问题 %d: %s\n", i+1, question)
fmt.Println(strings.Repeat("-", 50))
response, err := llm.Call(ctx, question)
if err != nil {
log.Printf("LLM 调用失败: %v", err)
continue
}
fmt.Printf("回答: %s\n", response)
}
}