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) } }
关键修改说明
- 复用记忆和对话链实例:只在初始化时创建一次
mem和llm2,循环内不再重新创建,确保对话历史能持续累积在内存中。 - 移除空历史参数:调用
Call时只传入input,Chain会自动从绑定的mem中读取历史对话,拼接成完整的上下文传给LLM。
内容的提问来源于stack exchange,提问作者Ronaldo Tantra
相关产品推荐
相关产品推荐

