from langchain_community.chat_models import ChatOpenAI
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableLambda, RunnableWithMessageHistory
module = ChatOpenAI(
model="deepseek-v4-flash", # 也可以使用 "deepseek-coder" 专门处理代码任务
openai_api_key='', # DeepSeek 的 OpenAI 兼容接口地址
openai_api_base="https://api.deepseek.com", # DeepSeek 的 OpenAI 兼容接口地址
)
# first_template = PromptTemplate.from_template("")
template = ChatPromptTemplate([
("system", "请更具历史会话,来简单回答问题,历史如下:"),
MessagesPlaceholder("chain_history"),
("user", "请回答如下问题:{input}"),
])
def print_prompt(prompt):
print("=" * 20, prompt.to_string(), "=" * 20)
return prompt
parser = StrOutputParser()
base_chain = template | print_prompt | module | parser
store = {}
def get_history_session(session_id):
if session_id not in store:
store[session_id] = InMemoryChatMessageHistory()
return store[session_id]
history_chain = RunnableWithMessageHistory(base_chain, get_history_session, input_messages_key="input",
history_messages_key="chain_history")
if __name__ == '__main__':
config = {
"configurable": {
"session_id": "001",
}
}
res = history_chain.invoke({"input": "小明有两只孔雀"}, config)
print("第1次执行:", res)
res = history_chain.invoke({"input": "小红有5只老虎"}, config)
print("第2次执行:", res)
res = history_chain.invoke({"input": "现在一共有多少宠物?"}, config)
print("第3次执行:", res)
import json
import os
from typing import Sequence
from langchain_community.chat_models import ChatOpenAI
from langchain_core.chat_history import BaseChatMessageHistory
from langchain_core.messages import BaseMessage, messages_from_dict, message_to_dict
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory
class FileChatMessageHistory(BaseChatMessageHistory):
def __init__(self, session_id, storage_path):
self.session_id = session_id
self.storage_path = storage_path
self.file_path = os.path.join(storage_path, session_id)
os.makedirs(os.path.dirname(self.file_path), exist_ok=True)
@property
def messages(self) -> list[BaseMessage]:
try:
with open(
os.path.join(self.storage_path, self.session_id),
"r",
encoding="utf-8",
) as f:
messages_data = json.load(f)
return messages_from_dict(messages_data)
except FileNotFoundError:
return []
def add_messages(self, messages: Sequence[BaseMessage]) -> None:
all_messages = list(self.messages) # Existing messages
all_messages.extend(messages) # Add new messages
serialized = [message_to_dict(message) for message in all_messages]
file_path = os.path.join(self.storage_path, self.session_id)
os.makedirs(os.path.dirname(file_path), exist_ok=True)
with open(file_path, "w", encoding="utf-8") as f:
json.dump(serialized, f)
def clear(self) -> None:
file_path = os.path.join(self.storage_path, self.session_id)
os.makedirs(os.path.dirname(file_path), exist_ok=True)
with open(file_path, "w", encoding="utf-8") as f:
json.dump([], f)
module = ChatOpenAI(
model="deepseek-v4-flash", # 也可以使用 "deepseek-coder" 专门处理代码任务
openai_api_key='', # DeepSeek 的 OpenAI 兼容接口地址
openai_api_base="https://api.deepseek.com", # DeepSeek 的 OpenAI 兼容接口地址
)
# first_template = PromptTemplate.from_template("")
template = ChatPromptTemplate([
("system", "请更具历史会话,来简单回答问题,历史如下:"),
MessagesPlaceholder("chain_history"),
("user", "请回答如下问题:{input}"),
])
def print_prompt(prompt):
print("=" * 20, prompt.to_string(), "=" * 20)
return prompt
parser = StrOutputParser()
base_chain = template | print_prompt | module | parser
store = {}
def get_history_session(session_id):
return FileChatMessageHistory(session_id, storage_path='./history')
history_chain = RunnableWithMessageHistory(base_chain, get_history_session, input_messages_key="input",
history_messages_key="chain_history")
if __name__ == '__main__':
config = {
"configurable": {
"session_id": "001",
}
}
res = history_chain.invoke({"input": "小明有两只孔雀"}, config)
print("第1次执行:", res)
res = history_chain.invoke({"input": "小红有5只老虎"}, config)
print("第2次执行:", res)
res = history_chain.invoke({"input": "现在一共有多少宠物?"}, config)
print("第3次执行:", res)