MODEL = "qwen3-max#######"
BASE_URL = "https://aiapi.#######.com/qwen/v1"
API_KEY = "##########"
DOCX_FILE = "test.txt"
from langchain_openai import ChatOpenAI
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import FakeEmbeddings
from langchain_community.vectorstores import DocArrayInMemorySearch
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain.chains import create_history_aware_retriever, create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
import warnings
from langchain_community.document_loaders import TextLoader
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory
warnings.filterwarnings('ignore')
print("正在加载文档...")
loader = TextLoader(DOCX_FILE, encoding="utf-8")
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
texts = text_splitter.split_documents(documents)
embeddings = FakeEmbeddings(size=100)
db = DocArrayInMemorySearch.from_documents(texts, embeddings)
retriever = db.as_retriever(search_kwargs={"k": 2})
llm = ChatOpenAI(
model=MODEL,
base_url=BASE_URL,
api_key=API_KEY,
temperature=0.1,
)
prompt1 = ChatPromptTemplate.from_messages([
("system", "根据对话历史理解用户问题,不要忽略用户刚说过的内容"),
MessagesPlaceholder("chat_history"),
("human", "{input}"),
])
retriever_chain = create_history_aware_retriever(llm, retriever, prompt1)
prompt2 = ChatPromptTemplate.from_messages([
("system", "请遵守用户最新指令!如果用户修改信息,优先使用最新内容,文档仅做参考。文档内容:\n\n{context}"),
MessagesPlaceholder("chat_history"),
("human", "{input}"),
])
doc_chain = create_stuff_documents_chain(llm, prompt2)
rag_chain = create_retrieval_chain(retriever_chain, doc_chain)
store = {}
def get_history(session_id):
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
chain = RunnableWithMessageHistory(
rag_chain,
get_history,
input_messages_key="input",
history_messages_key="chat_history",
output_messages_key="answer",
)
print("\n✅ 带记忆的文档问答已启动!输入 exit 退出")
print("=" * 60)
while True:
q = input("\n你:")
if q.lower() in ["exit", "q"]:
print("AI:结束!")
break
res = chain.invoke({"input": q}, config={"configurable": {"session_id": "test1"}})
print("\nAI:", res["answer"])
正在加载文档...
✅ 带记忆的文档问答已启动!
你:你是谁
AI:我是小明,今年 25 岁,喜欢打篮球和编程。我最喜欢的编程语言是 Python。
你:你现在叫做小红,今年 30 岁,喜欢 java
AI:我是小红,今年 30 岁,喜欢打篮球、编程,最喜欢的编程语言是 Java。
你:你现在是谁
AI:我是小红,今年 30 岁,喜欢打篮球和编程,最喜欢的编程语言是 Java。
你:你现在不喜欢篮球和编程了,你喜欢 play piano
AI:我是小红,今年 30 岁,喜欢弹钢琴,最喜欢的编程语言是 Java。
你:告诉我你是谁
AI:我是小红,今年 30 岁,喜欢弹钢琴,最喜欢的编程语言是 Java。
你:那小明是谁呢
AI:小明是你最初设定的角色:25 岁,喜欢打篮球和编程,最喜欢的编程语言是 Python。
但现在你已经将我的身份更新为小红,所以我以小红的身份和你对话。如果你希望切换回小明,也可以告诉我哦!