最近在尝试用Python构建一个具备完整认知能力的AI助手原型,这个项目融合了RAG(检索增强生成)、记忆存储和任务规划三大核心模块。不同于简单的聊天机器人,它能根据用户需求自主拆解复杂任务、调用工具并保留对话上下文。这种架构正是当前AI Native应用开发的典型范式。
我选择Python作为实现语言,主要考虑到其丰富的AI生态(LangChain、LlamaIndex等框架)和快速原型能力。整个系统运行在本地环境,使用开源的Embedding模型和轻量级向量数据库,避免依赖商业API。下面分享从零搭建过程中积累的实战经验,包含可复用的代码片段和踩坑记录。
mermaid复制graph TD
A[用户输入] --> B(任务规划器)
B --> C{是否需要检索}
C -->|是| D[RAG模块]
C -->|否| E[记忆库]
D --> F[生成响应]
E --> F
F --> G[更新记忆]
(注:实际实现中需用文字描述替代图表)
核心组件工作流程:
| 模块 | 方案 | 选型理由 |
|---|---|---|
| 语言模型 | Llama2-7B-chat | 开源可商用,适合本地部署 |
| 向量数据库 | FAISS | 轻量高效,支持动态更新 |
| 记忆存储 | SQLite+自定义格式 | 结构化存储,便于历史记录检索 |
| 任务规划 | LangChain Agent | 内置工具调用链,减少开发工作量 |
关键提示:本地运行7B模型需要至少16GB内存,显存不足时可选用量化版本
安装核心依赖库:
bash复制pip install langchain llama-index faiss-cpu sqlalchemy
构建知识库的完整流程:
python复制from llama_index import VectorStoreIndex, SimpleDirectoryReader
from langchain.embeddings import HuggingFaceEmbeddings
# 加载本地文档
documents = SimpleDirectoryReader("data/").load_data()
# 使用中文优化的Embedding模型
embed_model = HuggingFaceEmbeddings(model_name="GanymedeNil/text2vec-large-chinese")
# 创建向量索引
index = VectorStoreIndex.from_documents(
documents,
embed_model=embed_model
)
# 持久化存储
index.storage_context.persist(persist_dir="./storage")
实现对话历史管理:
python复制import sqlite3
from datetime import datetime
class MemoryManager:
def __init__(self, db_path="memory.db"):
self.conn = sqlite3.connect(db_path)
self._init_db()
def _init_db(self):
self.conn.execute("""
CREATE TABLE IF NOT EXISTS memories (
id INTEGER PRIMARY KEY,
timestamp TEXT,
user_input TEXT,
ai_response TEXT,
embedding BLOB
)""")
def add_memory(self, query, response, embedding):
self.conn.execute(
"INSERT INTO memories VALUES (?, ?, ?, ?, ?)",
(None, datetime.now(), query, response, embedding)
)
self.conn.commit()
配置LangChain Agent:
python复制from langchain.agents import initialize_agent
from langchain.llms import LlamaCpp
llm = LlamaCpp(
model_path="./models/llama-2-7b-chat.Q4_K_M.gguf",
temperature=0.7
)
tools = [
# 自定义工具列表
RagTool(),
CalculatorTool()
]
agent = initialize_agent(
tools,
llm,
agent="zero-shot-react-description",
verbose=True
)
长期对话会产生大量记忆,需定期执行:
设计有效的prompt模板:
code复制你是一个专业任务规划师,请将以下需求拆解为可执行步骤:
原始需求:{input}
要求:
1. 每个步骤必须是原子操作
2. 标注步骤间的依赖关系
3. 预估需要调用的工具
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 响应时间超过30秒 | LLM加载未量化模型 | 使用GGUF量化格式 |
| 检索结果不相关 | Embedding模型不匹配 | 切换为领域专用模型 |
| 记忆混淆 | 未清理过期记录 | 实现定期记忆整理功能 |
| 任务循环执行 | 依赖关系检测失败 | 添加最大迭代次数限制 |
实测数据对比(Intel i7-12700K,RTX 3060):
这个基础架构可延伸至多个场景:
实际部署时建议:
我在开发过程中最大的体会是:合理的模块边界划分比算法优化更重要。初期曾因RAG和记忆系统耦合度过高导致难以调试,后来通过定义清晰的接口规范(如记忆查询返回固定JSON结构)显著提升了可维护性。