You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

langchaingo带记忆对话异常:AI无法识别历史输入问题排查

对话记忆失效问题的修复方案

你编写的LangChain Go对话系统无法保留用户历史信息,导致后续询问姓名时无法正确回复,核心问题出在对话记忆的处理逻辑上。

错误原因

  • 手动清空历史参数:调用llm2.Call时,传入了空数组"history": []string{},这会覆盖Chain原本要从内存中读取的对话历史,LLM根本无法获取之前的对话内容。
  • 重复重置记忆实例:每次循环都重新创建ConversationBuffer和Conversation对象,相当于每次对话都初始化一个全新的会话,之前的历史被完全丢弃。

修正后的代码

package main

import (
	"bufio"
	"context"
	"fmt"
	"os"
	"strings"

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

func main() {
	llm, err := openai.New()
	if err != nil {
		fmt.Println("err create llm ", err)
		return
	}
	// 初始化一次记忆和对话链,后续复用
	mem := memory.NewConversationBuffer()
	llm2 := chains.NewConversation(llm, mem)

	reader := bufio.NewReader(os.Stdin)
	for {
		input, err := reader.ReadString('\n')
		if err != nil {
			fmt.Println("An error occured while reading input. Please try again", err)
			return
		}
		ctx := context.Background()
		input = strings.TrimSuffix(input, "\n")
		// 移除手动传入的history参数,让Chain自动使用内存中的历史
		completion, err := llm2.Call(ctx, map[string]any{
			"input": input,
		})
		if err != nil {
			fmt.Println("err get completion ", err)
			continue
		}
		fmt.Println(completion)
	}
}

关键修改说明

  1. 复用记忆和对话链实例:只在初始化时创建一次mem和llm2,循环内不再重新创建,确保对话历史能持续累积在内存中。
  2. 移除空历史参数:调用Call时只传入input,Chain会自动从绑定的mem中读取历史对话,拼接成完整的上下文传给LLM。

内容的提问来源于stack exchange,提问作者Ronaldo Tantra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:57:24