2025.10.28
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
api_key = os.getenv("OPENAI_API_KEY")
|
||||||
|
|
||||||
|
from langchain_openai import ChatOpenAI
|
||||||
|
|
||||||
|
# 初始化模型
|
||||||
|
llm = ChatOpenAI(
|
||||||
|
model="deepseek-chat",
|
||||||
|
api_key=api_key,
|
||||||
|
base_url="https://api.deepseek.com"
|
||||||
|
)
|
||||||
|
|
||||||
|
# 调用模型
|
||||||
|
response = llm.invoke('你好喵')
|
||||||
|
print(response.content)
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
api_key = os.getenv("OPENAI_API_KEY")
|
||||||
|
|
||||||
|
|
||||||
|
from langchain_core.prompts import ChatPromptTemplate
|
||||||
|
|
||||||
|
# 定义提示词模板(推荐写法)
|
||||||
|
prompt = ChatPromptTemplate.from_messages([
|
||||||
|
("system","你非常可爱,说话末尾会带个喵"),
|
||||||
|
("human","{input}") # {input}:占位符
|
||||||
|
])
|
||||||
|
# 格式化输出
|
||||||
|
formatted_prompt = prompt.invoke({"input":"你好喵"})
|
||||||
|
print(formatted_prompt)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
api_key = os.getenv("OPENAI_API_KEY")
|
||||||
|
|
||||||
|
|
||||||
|
from langchain_core.prompts import ChatPromptTemplate
|
||||||
|
from langchain_openai import ChatOpenAI
|
||||||
|
from langchain_core.output_parsers import StrOutputParser
|
||||||
|
|
||||||
|
# 定义提示词模板
|
||||||
|
prompt = ChatPromptTemplate.from_messages([
|
||||||
|
("system", "你非常可爱,说话末尾会带个喵"),
|
||||||
|
("human", "{input}") # {input}:占位符
|
||||||
|
])
|
||||||
|
|
||||||
|
# 初始化模型
|
||||||
|
llm = ChatOpenAI(
|
||||||
|
model="deepseek-chat",
|
||||||
|
api_key=api_key,
|
||||||
|
base_url="https://api.deepseek.com"
|
||||||
|
)
|
||||||
|
|
||||||
|
# 定义解析器,把LLM返回的AIMessage转成字符串
|
||||||
|
parser = StrOutputParser()
|
||||||
|
|
||||||
|
# 组成Chain
|
||||||
|
chain = prompt | llm | parser
|
||||||
|
|
||||||
|
# 最终调用
|
||||||
|
result = chain.invoke({"input": "你好喵"})
|
||||||
|
print(result)
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
api_key = os.getenv("OPENAI_API_KEY")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholder
|
||||||
|
from langchain_openai import ChatOpenAI
|
||||||
|
from langchain_core.output_parsers import StrOutputParser
|
||||||
|
from langchain_community.chat_message_histories import ChatMessageHistory
|
||||||
|
from langchain_core.runnables import RunnableWithMessageHistory
|
||||||
|
|
||||||
|
|
||||||
|
prompt = ChatPromptTemplate.from_messages([
|
||||||
|
("system", "你非常可爱,说话末尾会带个喵"),
|
||||||
|
MessagesPlaceholder(variable_name="history"),
|
||||||
|
("human", "{input}") # {input}:占位符
|
||||||
|
])
|
||||||
|
llm = ChatOpenAI(
|
||||||
|
model="deepseek-chat",
|
||||||
|
api_key=api_key,
|
||||||
|
base_url="https://api.deepseek.com"
|
||||||
|
)
|
||||||
|
parser = StrOutputParser()
|
||||||
|
|
||||||
|
chain = prompt | llm | parser
|
||||||
|
|
||||||
|
# 存储所有会话历史(可用数据库替换)
|
||||||
|
# 此处用字典模拟,也可替换成Redis、SQL等
|
||||||
|
store = {}
|
||||||
|
|
||||||
|
def get_session_history(session_id:str):
|
||||||
|
"""根据session_id获取该用户的聊天历史"""
|
||||||
|
if session_id not in store:
|
||||||
|
store[session_id] = ChatMessageHistory() # 创建新的历史记录
|
||||||
|
return store[session_id]
|
||||||
|
|
||||||
|
|
||||||
|
# 包装成带记忆的Runnable
|
||||||
|
runnable_with_memory = RunnableWithMessageHistory(
|
||||||
|
runnable=chain,
|
||||||
|
get_session_history=get_session_history,
|
||||||
|
input_messages_key="input",
|
||||||
|
history_messages_key="history"
|
||||||
|
)
|
||||||
|
|
||||||
|
session_id = 'user_123'
|
||||||
|
while 1:
|
||||||
|
user_input = input("\n你:")
|
||||||
|
if user_input=="quit":
|
||||||
|
print('拜拜喵!')
|
||||||
|
break
|
||||||
|
response = runnable_with_memory.invoke(
|
||||||
|
{"input":user_input},
|
||||||
|
config={"configurable":{"session_id":session_id}}
|
||||||
|
)
|
||||||
|
print(f'AI:{response}')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
load_dotenv()
|
||||||
|
|
||||||
|
def create_client():
|
||||||
|
api_key = os.getenv("OPENAI_API_KEY")
|
||||||
|
return api_key
|
||||||
|
|
||||||
|
|
||||||
|
from langchain_core.prompts import ChatPromptTemplate,MessagesPlaceholder
|
||||||
|
from langchain_openai import ChatOpenAI
|
||||||
|
from langchain_core.output_parsers import StrOutputParser
|
||||||
|
from langchain_community.chat_message_histories import ChatMessageHistory
|
||||||
|
from langchain_core.runnables import RunnableWithMessageHistory
|
||||||
|
|
||||||
|
|
||||||
|
def create_bot(llm,sys_prompt):
|
||||||
|
"""
|
||||||
|
:param sys_prompt: 系统提示词
|
||||||
|
:param llm: 已配置好的语言模型实例
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
prompt = ChatPromptTemplate.from_messages([
|
||||||
|
("system",sys_prompt),
|
||||||
|
MessagesPlaceholder(variable_name="history"),
|
||||||
|
("human","{input}")
|
||||||
|
])
|
||||||
|
parser = StrOutputParser()
|
||||||
|
chain = prompt | llm | parser
|
||||||
|
store = {}
|
||||||
|
|
||||||
|
def get_session_history(session_id):
|
||||||
|
return store.setdefault(session_id,ChatMessageHistory())
|
||||||
|
|
||||||
|
return RunnableWithMessageHistory(
|
||||||
|
runnable=chain,
|
||||||
|
get_session_history=get_session_history,
|
||||||
|
input_messages_key="input",
|
||||||
|
history_messages_key="history"
|
||||||
|
)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# 此处集中配置LLM
|
||||||
|
llm = ChatOpenAI(
|
||||||
|
model="deepseek-chat",
|
||||||
|
api_key=create_client(),
|
||||||
|
base_url="https://api.deepseek.com"
|
||||||
|
)
|
||||||
|
prompt = """你是‘小智’,一位专业、耐心且记忆力出色的 AI 助手。
|
||||||
|
你善于倾听,能记住用户之前提到的信息,并在后续对话中自然提及。
|
||||||
|
回答时简洁明了,避免冗余。"""
|
||||||
|
bot = create_bot(llm,prompt)
|
||||||
|
session_id = '123'
|
||||||
|
while 1:
|
||||||
|
user_input = input('\n你:')
|
||||||
|
if user_input == "quit":
|
||||||
|
print('拜拜')
|
||||||
|
break
|
||||||
|
response = bot.invoke({"input":user_input},config={"configurable":{"session_id":session_id}})
|
||||||
|
print("AI:",response)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
## 🧩 模块说明:LangChain 基础核心组件
|
||||||
|
|
||||||
|
📌 **核心知识点**:
|
||||||
|
LLM 调用|Prompt 设计|Chain 构建|Memory 记忆|实战练习
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 1. `01_Models.py`(模型调用)
|
||||||
|
封装 LLM 实例,实现标准调用流程。
|
||||||
|
|
||||||
|
✅ 掌握点:
|
||||||
|
- 如何初始化 ChatOpenAI 或 DeepSeek
|
||||||
|
- 设置 API Key 和 base_url
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. `02_Prompt.py`(提示词构建)
|
||||||
|
使用 `ChatPromptTemplate` 构建可复用的 Prompt 模板。
|
||||||
|
|
||||||
|
✅ 掌握点:
|
||||||
|
- 系统提示 + 历史消息 + 用户输入
|
||||||
|
- 使用 `{input}` 占位符
|
||||||
|
- 多轮对话的基础结构
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. `03_Chain.py`(链式调用)
|
||||||
|
将 Prompt + LLM + Parser 组合成 Chain。
|
||||||
|
|
||||||
|
✅ 掌握点:
|
||||||
|
- 使用 `|` 操作符连接组件
|
||||||
|
- 创建可复用的处理流程
|
||||||
|
- 输出解析为字符串
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. `04_Memory.py`(记忆功能)
|
||||||
|
添加会话记忆,实现多轮对话。
|
||||||
|
|
||||||
|
✅ 掌握点:
|
||||||
|
- 使用 `ChatMessageHistory` 存储历史
|
||||||
|
- `RunnableWithMessageHistory` 包装 Chain
|
||||||
|
- 保持上下文连贯性
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. `05_practice.py`(综合实践)
|
||||||
|
整合所有组件,搭建一个带记忆的 AI 对话机器人。
|
||||||
|
|
||||||
|
✅ 掌握点:
|
||||||
|
- 完整流程串联
|
||||||
|
- 实际运行体验
|
||||||
|
- 可直接扩展为 Web 应用
|
||||||
|
|
||||||
|
💡 建议:跑通后,试试让 AI 记住你喜欢的颜色,并在后续对话中提及。
|
||||||
Reference in New Issue
Block a user