天马AI不会自动读取你本地的长篇设定。要在生成时引用人物传记或世界观细节,需要先把设定文档切成若干小段,生成向量后存入本地向量库,每次请求前检索最相关的几段,再拼进提示词。这就是检索增强生成(RAG)的通用流程,以下方法不依赖天马AI是否内置RAG功能,可以按你的实际接口调整。
适用场景:你有多份人物传记、世界观设定等长文档,希望天马AI生成内容时引用其中细节。操作动作:用Langchain切分TXT,用HuggingFace嵌入模型生成向量,存入ChromaDB,并写一个检索函数返回top_k片段,然后注入提示词。验证方式:打印检索到的片段,确认关键词命中。风险边界:注入长度受模型上下文限制,需要调整chunk_size和top_k,避免超出上下文或漏掉关键设定。
将设定文档切分为适合检索的片段
假设设定文档是TXT格式,整本直接拼进提示词会超出上下文,且向量检索效果差。所以切分是必要的。下面代码使用Langchain的RecursiveCharacterTextSplitter对文档切分:
from langchain.text_splitter import RecursiveCharacterTextSplitter
with open('setting.txt', 'r', encoding='utf-8') as f:
text = f.read()
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=['\n\n', '\n', '。', '!', '?', ',', ' ', '']
)
chunks = splitter.split_text(text)
print('切分后片段数:', len(chunks))
chunk_size控制每个片段的字符数,设置太大会混入无关内容,太小容易切断一个完整事件。overlap让相邻片段保留重复上下文,避免关键设定恰好在切点上被分开。这里切为500字、重叠50字,是一个起步值,需根据实际文档和模型上下文调整。
用嵌入模型生成向量并写入本地数据库
切分后需要把每个片段转换为向量。这里使用HuggingFace的SentenceTransformer模型,配合ChromaDB做本地持久化存储:
from sentence_transformers import SentenceTransformer
import chromadb
model = SentenceTransformer('sentence-transformers/all-MiniLM-L6-v2')
client = chromadb.PersistentClient(path='./setting_db')
collection = client.get_or_create_collection(name='setting_chunks')
for i, chunk in enumerate(chunks):
embedding = model.encode(chunk).tolist()
collection.add(
ids=[str(i)],
embeddings=[embedding],
documents=[chunk]
)
首次运行会下载模型,建议先确认网络。中文场景可以替换为shibing624/text2vec-base-chinese等模型,这里只演示通用流程。
编写检索函数返回最相关设定
检索函数用于根据用户输入找到最相关的设定。下面定义query_db,返回top_k个片段:
def query_db(query_text, top_k=3):
query_embedding = model.encode(query_text).tolist()
results = collection.query(
query_embeddings=[query_embedding],
n_results=top_k
)
return results['documents'][0]
query = '主角在森林里遇到什么'
related_chunks = query_db(query)
for i, chunk in enumerate(related_chunks):
print(f'片段{i+1}: {chunk[:100]}...')
这里top_k=3表示返回最相关的3个片段,实际使用时可以调整。验证检索效果最简单的方法是打印这些片段,并确认其中包含预期关键词。
把检索片段注入提示词并限制篇幅
检索到的片段需要注入提示词,同时控制输出长度。示例如下:
def build_prompt(query, top_k=3):
related_chunks = query_db(query, top_k)
context = '\n'.join(related_chunks)
prompt = f'''请根据以下设定,回答用户问题。
参考设定如下:
{context}
用户问题:{query}
回答:'''
return prompt
# 调用天马AI时,按你的实际接口传入prompt和max_tokens
prompt = build_prompt('主角在森林里遇到什么')
# response = your_tianma_api(prompt, max_tokens=500)
提示词模板中加入“参考设定如下:...”的分界,让模型明确区分设定和问题。max_tokens用于限制生成长度,例如设为500,避免输出过长。注入片段本身也占用上下文,如果chunk_size=500且top_k=3,则约1500字符的设定,需要确认模型总上下文能容纳;否则减小top_k或chunk_size。