LangChain Memory 使用示例
环境
- Anaconda:v25.5.1
- Python:v3.13.9
- LangChain:v1.0.3
- langchain-openai:v1.0.2
【示例一】AI 聊天助手
本节我们主要实现一个 AI 聊天助手的项目,界面如下:

左侧提供 OpenAI API Key 的输入框,并且提供获取 OpenAI API Key 的文档地址,右侧内容区域提供一个类似于 ChatGPT 一样的界面,用来以对话的形式展示我们给模型的输入信息以及模型的生成结果,同时提供用户输入框,用户在填写完相应的内容后点击【发送】按钮,模型即可按照我们输入的内容去输出相应的回答,从而显示到界面中,接下来我们逐步来实现这个小项目。
1、创建项目及安装依赖项
在 PyCharm 中新建一个项目目录,取名为“project-chatgpt”(项目名称自定义即可),因为毕竟是一个小项目,所以我们新建一个干净的目录来进行接下来的操作。
从本文的结尾位置找到 requirements.txt 文件,然后在刚才新建的空目录下新建一个同名文件,将本文 requirements.txt 文件里面的内容拷贝到刚才新建的同名文件中,然后在 PyCharm 终端运行以下命令安装 requirements.txt 文件中的所有依赖:
pip install -r requirements.txt
此时我们在这个空目录下就已经安装了接下来我们所需要的所有依赖。
2、创建 AI 请求
在空目录下新建 utils.py 文件,然后将下面代码拷贝:
from langchain_openai import ChatOpenAI
from langchain_classic.chains import ConversationChain
from langchain_classic.memory import ConversationBufferMemoryimport osdef get_chat_response(prompt, memory, openai_api_key):model = ChatOpenAI(model="gpt-4o-mini", api_key=openai_api_key)chain = ConversationChain(llm=model, memory=memory)response = chain.invoke({ "input": prompt})return response["response"]memory = ConversationBufferMemory(return_messages=True)result1 = get_chat_response("牛顿提出过哪些著名的定律?", memory, os.environ["OPENAI_API_KEY"])
print(result1)result2 = get_chat_response("我上一个问题是啥?", memory, os.environ["OPENAI_API_KEY"])
print(result2)
上述代码中我们定义了一个 get_chat_response() 方法,它接收三个参数:用户输入、记忆和 OpenAI API Key。有了这三个参数之后,我们直接使用记忆链的形式将用户输入在调用 invoke() 方法时传入,不需要做额外的事情,记忆链自动会将我们每轮对话进行存储。下面是代码运行后的输出,我们可以看到,模型是具备记忆功能的:
/Users/xxxx/Documents/some-test/python-project-test/project-chatgpt/utils.py:15: LangChainDeprecationWarning: Please see the migration guide at: https://python.langchain.com/docs/versions/migrating_memory/memory = ConversationBufferMemory(return_messages=True)
/Users/xxxx/Documents/some-test/python-project-test/project-chatgpt/utils.py:10: LangChainDeprecationWarning: The class `ConversationChain` was deprecated in LangChain 0.2.7 and will be removed in 1.0. Use `langchain_core.runnables.history.RunnableWithMessageHistory` instead.chain = ConversationChain(llm=model, memory=memory)
牛顿提出了几个著名的定律,其中最为人们熟知的包括:1. **牛顿第一定律(惯性定律)**:一个物体如果不受外力作用,就会保持静止状态或匀速直线运动。这一定律表明,物体的状态不会自行改变,除非有外力介入。2. **牛顿第二定律(加速度定律)**:物体的加速度与施加在它上面的外力成正比,与它的质量成反比。这可以用公式表示为 \( F = ma \),其中 \( F \) 是外力,\( m \) 是物体的质量,\( a \) 是物体的加速度。3. **牛顿第三定律(作用与反作用定律)**:对于每一个作用力,都会有一个大小相等、方向相反的反作用力。这意味着如果物体 A 施加一个力作用于物体 B,那么物体 B 同样会施加一个等大而反向的力作用于物体 A。这些定律构成了经典力学的基础,解释了物体的运动规律,广泛应用于物理学、工程学等领域。如果你还有其他问题,欢迎继续问我!
你上一个问题是关于牛顿提出的著名定律。你想了解牛顿有哪些著名的定律,我详细介绍了牛顿的第一、第二和第三定律。如果你还有其他问题,或者想深入了解某个定律,欢迎继续提问!
3、创建网站界面
在项目目录下新建 main.py 文件,将下面代码拷贝进去:
import streamlit as st
from langchain_classic.memory import ConversationBufferMemoryfrom utils import get_chat_responsest.title("💬 克隆ChatGPT")with st.sidebar:openai_api_key = st.text_input("请输入OpenAI API Key:", type="password")st.markdown("[获取OpenAI API key](https://platform.openai.com/account/api-keys)")if "memory" not in st.session_state:st.session_state["memory"] = ConversationBufferMemory(return_messages=True)st.session_state["messages"] = [{"role": "ai","content": "你好,我是你的AI助手,有什么可以帮你的吗?"}]for message in st.session_state["messages"]:st.chat_message(message["role"]).write(message["content"])prompt = st.chat_input()
if prompt:if not openai_api_key:st.info("请输入你的OpenAI API Key")st.stop()st.session_state["messages"].append({"role": "human", "content": prompt})st.chat_message("human").write(prompt)with st.spinner("AI正在思考中,请稍等..."):response = get_chat_response(prompt, st.session_state["memory"],openai_api_key)msg = {"role": "ai", "content": response}st.session_state["messages"].append(msg)st.chat_message("ai").write(response)
上述代码主要使用 streamlit 开发了一个网站界面,具体语法可查看 streamlit 官网学习,网站中添加了我们上述介绍的输入框以及发送按钮,并且添加了相应关键字的判断,最后调用 get_chat_response() 方法得到最终结果并展示。
在终端运行以下命令即可在浏览器看到我们写的界面,填入相应值后可得到模型生成的结果:
streamlit run main.py

总结
本文我们使用记忆链实现了一个简单版的 AI 聊天助手,在这个示例中还是使用了 streamlit 去开发网站界面,如果大家对此感兴趣的话也可以尝试去学习一下。到目前为止,我们使用 AI 去生成相应的内容时,模型使用的数据都是当初训练时传入的知识库,如果想为公司内网搭建一个知识库,通过 AI 去输出跟公司产品相关的内容时我们目前的做法可能会得不到预期的结果,这个时候就要求模型具备读取私人知识库的能力了,我们下篇文章见。
附:
requirements.txt 文件
aiohappyeyeballs==2.6.1
aiohttp==3.13.2
aiosignal==1.4.0
altair==5.5.0
annotated-types==0.7.0
anyio==4.11.0
attrs==25.4.0
beautifulsoup4==4.14.2
blinker==1.9.0
cachetools==6.2.1
certifi==2025.10.5
charset-normalizer==3.4.4
click==8.3.0
dataclasses-json==0.6.7
distro==1.9.0
frozenlist==1.8.0
gitdb==4.0.12
GitPython==3.1.45
h11==0.16.0
httpcore==1.0.9
httpx==0.28.1
httpx-sse==0.4.3
idna==3.11
Jinja2==3.1.6
jiter==0.11.1
jsonpatch==1.33
jsonpointer==3.0.0
jsonschema==4.25.1
jsonschema-specifications==2025.9.1
langchain==1.0.3
langchain-classic==1.0.0
langchain-community==0.4.1
langchain-core==1.0.3
langchain-openai==1.0.2
langchain-text-splitters==1.0.0
langgraph==1.0.2
langgraph-checkpoint==3.0.1
langgraph-prebuilt==1.0.2
langgraph-sdk==0.2.9
langsmith==0.4.41
MarkupSafe==3.0.3
marshmallow==3.26.1
multidict==6.7.0
mypy_extensions==1.1.0
narwhals==2.11.0
numpy==2.3.4
openai==2.6.1
orjson==3.11.4
ormsgpack==1.12.0
packaging==25.0
pandas==2.3.3
pillow==12.0.0
propcache==0.4.1
protobuf==6.33.0
pyarrow==21.0.0
pydantic==2.12.3
pydantic-settings==2.12.0
pydantic_core==2.41.4
pydeck==0.9.1
python-dateutil==2.9.0.post0
python-dotenv==1.2.1
pytz==2025.2
PyYAML==6.0.3
referencing==0.37.0
regex==2025.10.23
requests==2.32.5
requests-toolbelt==1.0.0
rpds-py==0.28.0
setuptools==80.9.0
six==1.17.0
smmap==5.0.2
sniffio==1.3.1
socksio==1.0.0
soupsieve==2.8
SQLAlchemy==2.0.44
streamlit==1.51.0
tenacity==9.1.2
tiktoken==0.12.0
toml==0.10.2
tornado==6.5.2
tqdm==4.67.1
typing-inspect==0.9.0
typing-inspection==0.4.2
typing_extensions==4.15.0
tzdata==2025.2
urllib3==2.5.0
wheel==0.45.1
wikipedia==1.4.0
xxhash==3.6.0
yarl==1.22.0
zstandard==0.25.0
