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 模式
工具调用流程
- 接收用户查询(如“计算 15+27”)
- 匹配对应的工具(
calculator) - 调用工具并获取结果(
15+27=42) - 让 LLM 基于工具结果生成自然语言回答
Agent 核心逻辑
虽然代码中是手动指定工具,但其思路可扩展为自动 Agent:
- LLM 根据用户问题判断是否需要调用工具
- 若需要,选择合适的工具并生成输入参数
- 处理工具返回结果,必要时进行多轮调用
6. 流式输出与批量处理
流式输出
- 原理:将 LLM 生成的文本分块返回,模拟实时打字效果
- 代码模拟:通过
time.Sleep延迟输出每个单词,实际项目中可使用llm.Stream接口
批量处理
- 对多个问题依次调用 LLM,适合批量生成内容(如批量摘要、批量翻译)
- 可结合 Go 的
goroutine实现并行处理,提升效率
三、课程实践笔记
1. 环境搭建步骤
- 安装 Go 环境(1.19+)
- 安装 Ollama:
curl https://ollama.ai/install.sh | sh - 拉取模型:
ollama pull llama3.2 - 启动 Ollama 服务:
ollama serve(后台运行) - 创建项目并引入依赖:
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)
}
}